如何读取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]); 
    } 
} 
} 

我也不知道我是怎么要去店里的话到一个单独的阵列后,我得到的字符到一个数组。以存储与字符或单词的行

+1

请注意,'feof()'不会说你是否在文件的末尾;它表示您是否遇到过EOF。有可能在文件的末尾有_exactly_,但没有试图超过它,在这种情况下,feof()会返回0,直到你试图再读取一个字节为止(并且失败)。 –

+1

考虑使用'getline'就像[here](https://stackoverflow.com/a/9171511/841108) –

+1

在文件中是否有符号或字符串可以让你的代码区分_letters_结束,和_words_开始? – ryyker

你说你想从数据文件中读取。如果是这样,你应该打开文件。

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

完成识别并确定目标中的项目列表,然后回答这些(也可能是其他)问题。此时,您将准备好开始识别到达目标的步骤。