将txt文件逐行读入char数组C.

时间:2016-09-12 22:24:06

标签: c fopen scanf

我知道这个问题已被问过几次,但从来没有帮助我弄清楚我的问题。基本上,我正在阅读四个文本文件,所有单个单词由一个新行分隔,并希望将它们存储在一个char数组中。我首先计算文件中的行数,然后创建一个新的char数组,但对于我的生活,我无法弄清楚如何让它正确读取。最后两行只是为了测试它是否正确读取了整个文件,它们总是返回NULL和问号符号。

我希望每一行都在char数组的下一个索引处。

任何帮助都会很棒!提前谢谢你。

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

void countAnagrams(char* fileName);

void main ()
{
    char *fileNames[] = {"AnagramA.txt","AnagramB.txt","AnagramC.txt","AnagramD.txt"};

    countAnagrams(fileNames[0]);
    countAnagrams(fileNames[1]);
    countAnagrams(fileNames[2]);
    countAnagrams(fileNames[3]);
}

void countAnagrams(char* fileName)
{
    int anagramCount = 0;
    int ch, lines = 0;  

    //Count number of lines in file
    FILE *myfile = fopen(fileName, "r");
    do
    {
        ch = fgetc(myfile);
        if(ch == '\n')
            lines++;
    }while(ch != EOF);

    char contents[lines];
    int i = 0;
    for(i=1;i<lines;i++)
    {
        fscanf(myfile,"%s",contents[i]);
    }
    fclose(myfile);

    printf("%.12s\n",fileName);
    printf("number of lines: %d\n", lines);

    printf("first thing: %s\n", contents[0]);
    printf("last thing: %s\n", contents[lines-1]);
}

2 个答案:

答案 0 :(得分:2)

以下是对您的代码的轻微修改,可能会对您有所帮助。

要点:

  • 您可以使用getline()代替fscanf()fscanf()可用于逐行读取,但需要显式检查行结束条件。 getline()会自动执行此操作。
  • 正如kaylum所指出的,在计算行数后,有必要rewind()将文件指针返回到文件的开头。

    #include <omp.h>                                                                                       
    #include <stdio.h>                                                                                     
    #include <stdlib.h>                                                                                    
    
    void countAnagrams(char* fileName);                                                                    
    
    void main ()                                                                                           
    {                                                                                                      
        char *fileNames[] = {"AnagramA.txt","AnagramB.txt","AnagramC.txt","AnagramD.txt"};                 
    
        countAnagrams(fileNames[0]);                                                                       
        countAnagrams(fileNames[1]);                                                                       
        countAnagrams(fileNames[2]);                                                                       
        countAnagrams(fileNames[3]);                                                                       
    }                                                                                                      
    
    void countAnagrams(char* fileName)                                                                     
    {                                                                                                      
        int anagramCount = 0;                                                                              
        int ch, lines = 0;                                                                                 
    
        //Count number of lines in file                                                                    
        FILE *myfile = fopen(fileName, "r");                                                               
        do                                                                                                 
        {                                                                                                  
            ch = fgetc(myfile);                                                                            
            if (ch == '\n')                                                                                
                lines++;                                                                                   
        } while (ch != EOF);                                                                               
    
        rewind(myfile);                                                                                    
    
        char *contents[lines];                                                                             
        int i = 0;                                                                                         
        size_t len = 0;                                                                                    
        for(i = 0; i < lines; i++)                                                                         
        {
            contents[i] = NULL;
            len = 0;                                                                                
            getline(&contents[i], &len, myfile);                                                           
        }                                                                                                  
        fclose(myfile);                                                                                    
    
        printf("%.12s\n",fileName);                                                                        
        printf("number of lines: %d\n", lines);                                                            
    
        printf("first thing: %s\n", contents[0]);                                                          
        printf("last thing: %s\n", contents[lines-1]);                                                     
    }                                                                                                      
    

答案 1 :(得分:0)

我认为问题是char contents[lines]然后fscanf(myfile,"%s",contents[i])printf - s之后。 contents[i]char类型,您想要将一个字符数组读入一个字符。 contents需要声明为char* contents[lines]才能将char数组读入contents[i]