代码之家  ›  专栏  ›  技术社区  ›  McLovinIt

如何在C中读取文件的内容并使用fgets()将其存储到数组中?

  •  0
  • McLovinIt  · 技术社区  · 7 年前

    因此,我需要创建一个文字搜索程序,该程序将读取包含字母的数据文件,然后读取需要在末尾找到的文字

    f a q e g g e e f


    o e q e r t e w j o


    t e w q e r t y u



    自由的

    字母和单词的列表更长,但无论如何,我需要将字母保存到一个数组中,我遇到了困难,因为它从未存储正确的数据。以下是我目前掌握的信息

    #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]);
       }
    }
    }
    

    我也不知道在我将字符放入一个数组后,我将如何将单词存储到一个单独的数组中。

    4 回复  |  直到 7 年前
        1
  •  2
  •   J...S    7 年前

    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 .

    然后做

    fgets(letters, sizeof(letters, fin);
    

    stdin 而不是 fin

    请注意 将存储尾随换行符( \n 信件

    letters[strlen(letters)-1]='\0';
    


    只是说, letters[i]
    scanf("%1s", &letters[i]);
    

    应该是

    scanf("%c", &letters[i]);
    
        2
  •  1
  •   atru    7 年前

    #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

    存储行的过程包括从 标准DIN ,收集其长度 strlen ,剥离它 newline \0 (可选),为其分配内存 malloc ,最后将指向该内存位置的指针存储在 lineptr公司

    您可以为您的输入(字符和单词)实现这个序列。它将产生一个干净的、随时可用的输入。您还可以考虑将行集合移动到函数中,这可能需要 lineptr公司

    要记住的是 MAXLET MAXLINES 对于给定的数据集,可能必须增加( MAXLINES 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个字符。此外,在原始输入中,字符之间用空格分隔-这是不必要的,事实上,没有空格更容易。

        3
  •  1
  •   ryyker    7 年前

    您帖子中的代码似乎与您声明的目标不匹配,表明您尚未掌握所使用函数的正确应用。
    你已经表达了一个想法,描述了你想做什么,但你所采取的步骤(至少是那些显示的步骤)不会让你达到目的。甚至没有接近。

    手头有一张地图来计划你的步骤总是好的。算法是一种软件映射。在你可以计划你的步骤之前,你需要知道你要去哪里。

    您声明的目标:

    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) 如何存储搜索内容?

    d) 如何比较内容和搜索词?
    example )
    discussion and example )(e&f用于创建存储)
    How to use fgets )
    h) 使用feof()时有什么需要注意的吗?( discussion and examaple feof )
    i) 为什么在第二次调用scanf后我的输入不正确?( answer )

    完成确定和明确目标中的项目列表,然后回答这些(可能还有其他)问题。在这一点上,你将准备好开始确定实现目标的步骤。

        4
  •  0
  •   Serge Ballesta    7 年前

    value = fgets(stdin); fgets 作用我的主页上写着

    char * fgets(char * restrict str, int size, FILE * restrict stream);

    NULL ,转换为 int

    使用FGET读取行的正确方法是:

    if (NULL == fgets(letters, sizeof(letters), stdin) {
        // indication of end of file or error
        ...
    }
    // Ok letters contains the line...