如何读取C文件中的内容并使用fgets()将其存储到数组中?
所以我需要创建一个词的搜索程序,将读取包含字母,然后需要在年底 被发现例如字的数据文件:如何读取C文件中的内容并使用fgets()将其存储到数组中?
faqeggeeef
oeqertewjo
teewqertyu
政府
免费
和字母和单词列表较长,但无论如何,我需要将信件保存到一个数组,我有困难的时候,因为它永远不会存储正确数据。这里是我迄今为止
#include <stdio.h>
int main()
{
int value;
char letters[500];
while(!feof(stdin))
{
value = fgets(stdin);
for(int i =0; i < value; i++)
{
scanf("%1s", &letters[i]);
}
for(int i=0; i<1; i++)
{
printf("%1c", letters[i]);
}
}
}
我也不知道我是怎么要去店里的话到一个单独的阵列后,我得到的字符到一个数组。以存储与字符或单词的行
你说你想从数据文件中读取。如果是这样,你应该打开文件。
FILE *fin=fopen("filename.txt", "r");
if(fin==NULL)
{
perror("filename.txt not opened.");
}
在您的输入文件中,前几行有单个字母,每个字母都用空格分隔。
如果要将每个字母存储在letters
字符数组中,则可以使用以下循环加载每行。
char c;
int i=0;
while(fscanf(fin, "%c", &c)==1 && c!='\n')
{
if(c!=' ')
{
letters[i++]=c;
}
}
这只会存储字母,是不是一个字符串,因为没有\0
字符。
读取底部的文字可以用fgets()
完成。
您对fgets()
函数的使用是错误的。
它的原型是
char *fgets(char *str, int n, FILE *stream);
见here。
请注意,fgets()
会将尾随换行符(\n
)也存储为字符串。你可能想删除它像
str[strlen(str)-1]='\0';
使用fgets()
阅读底部的话成字符数组,并用\0
更换\n
。
,做
fgets(letters, sizeof(letters, fin);
您使用stdin
,而不是这里的fin
当你想从键盘接受输入并存储到letters
。
请注意,fgets()
也会将尾随换行符(\n
)存储到letters
中。你可能想删除它像
letters[strlen(letters)-1]='\0';
只是说,
letters[i]
将是一个字符,而不是一个字符串。
scanf("%1s", &letters[i]);
应该
scanf("%c", &letters[i]);
的一种方法是将它们存储在指向数组的数组 - 线,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLET 500
#define MAXLINES 1000
int main()
{
char *lptr;
// Array with letters from a given line
char letters[MAXLET];
// Array with pointers to lines with letters
char *lineptr[MAXLINES];
// Length of current array
unsigned len = 0;
// Total number of lines
int nlines = 0;
// Read lines from stdin and store them in
// an array of pointers
while((fgets(letters,MAXLET,stdin))!=NULL)
{
len = strlen(letters);
letters[len-1] = '\0';
lptr = (char*) malloc(len);
strcpy(lptr, letters);
lineptr[nlines++]=lptr;
}
// Print lines
for (int i = 0; i < nlines; i++)
printf("%s\n", lineptr[i]);
// Free allocated memory
for (int i = 0; i < nlines; i++)
free(lineptr[i]);
}
在下文中,指针从stdin
每行存储在lineptr
。一旦存储,您可以访问和操作每一行 - 在这种简单的情况下,我只能逐一打印它们,但稍后会显示简单操作的示例。最后,程序释放先前分配的内存。一旦不再使用已分配的内存,这是一种很好的做法。
存储线的过程包括获得每一行从stdin
的,收集它的长度与strlen
,剥离它newline
字符通过用\0
(可选)替换它,与malloc
为它分配存储器,最后存储指针到lineptr
中的那个内存位置。在这个过程中,程序还计算输入线的数量。
你可以为你的两个输入实现这个序列 - 字符和单词。它会产生一个干净的,随时可用的输入。您也可以考虑将线条集合移动到一个函数中,这可能需要将全局类型数组设置为lineptr
。如果您有任何问题,请告诉我。
要记住的是,MAXLET
,尤其是MAXLINES
可能不得不增加一个给定的数据集(MAXLINES 1000
字面上假定你不会有超过1000行)。
此外,在Unix和Mac上,该程序允许您通过使用$ prog_name < in_file
来从文件中读取数据,它可以很容易地修改为直接从文件中读取。
下面是一些使用实例 - lineptr
存储指向于每行(数组)因此,该程序首先检索指针线然后前进与任何数组:
// Print 3rd character of each line
// then substitute 2nd with 'a'
char *p;
for (int i = 0; i < nlines; i++){
p = lineptr[i];
printf("%c\n", p[2]);
p[1] = 'a';
}
// Print lines
for (int i = 0; i < nlines; i++)
printf("%s\n", lineptr[i]);
// Swap first and second element
// of each line
char tmp;
for (int i = 0; i < nlines; i++){
p = lineptr[i];
tmp = p[0];
p[0] = p[1];
p[1] = tmp;
}
// Print lines
for (int i = 0; i < nlines; i++)
printf("%s\n", lineptr[i]);
注意,这些实例是只是一个演示,并假定每行至少有3个字符。另外,在原始输入中,字符之间用空格隔开 - 这不是必需的,事实上,没有它就更容易。
value = fgets(stdin);
是一个可怕的表达!您完全不尊重fgets
函数的语法。我的男人页说
char * fgets(char * restrict str, int size, FILE * restrict stream);
所以在这里,因为你不通过在正确的地方流,你可能会得到一个潜在的IO错误,并与fgets返回NULL
,将其转化为int
0值。然后下一个循环只是一个空操作。
读取线用于fgets正确的方法是:
if (NULL == fgets(letters, sizeof(letters), stdin) {
// indication of end of file or error
...
}
// Ok letters contains the line...
在您的文章中的代码似乎并不符合您的既定目标,并表明你还没有掌握的您正在使用的功能的正确应用。
你已经表达了一个想法来描述你想要做什么,但是你已经采取的步骤(至少是那些显示的)不会让你在那里。差远了。
准备好地图以计划您的步骤总是很好的。算法是一种软件映射。在你规划你的步骤之前,你需要知道你要去的地方。
你的既定目标:
1) Open and read a file into lines.
2) Store the lines, somehow. (using fgets(,,)?)
3) Use some lines as content to search though.
4) Use other lines as objects to search for
一些问题需要回答:
a)如何为搜索内容从字符串杰出的搜索 呢?
b)如何存储搜索内容?
c)如何存储搜索词?
d)内容和搜索词之间的比较将如何进行?
e)文件中有多少行? (example)
f)最长线的长度? (discussion and example)(e & f用于创建存储)
g)如何使用fgets()。 (可能是谷歌搜索:How to use fgets)
h)使用feof()时有什么注意事项? (discussion and examaple feof)
i)为什么第二次调用scanf后我的输入不正确? (answer)
完成识别并确定目标中的项目列表,然后回答这些(也可能是其他)问题。此时,您将准备好开始识别到达目标的步骤。
请注意,'feof()'不会说你是否在文件的末尾;它表示您是否遇到过EOF。有可能在文件的末尾有_exactly_,但没有试图超过它,在这种情况下,feof()会返回0,直到你试图再读取一个字节为止(并且失败)。 –
考虑使用'getline'就像[here](https://stackoverflow.com/a/9171511/841108) –
在文件中是否有符号或字符串可以让你的代码区分_letters_结束,和_words_开始? – ryyker