C 从文件中读取行不返回所有

C 从文件中读取行不返回所有,c,fopen,readfile,fgets,C,Fopen,Readfile,Fgets,我试图将文件中的单词保存到数组中,但我只读取前8个单词 下面是我的代码 #define BUF 128 /* can change the buffer size as well */ char ** readFileContentArray(char* filename){ int lines = 128; char ** strLines = (char **)malloc(sizeof(char*)*lines); FILE *plist = NULL;

我试图将文件中的单词保存到数组中,但我只读取前8个单词

下面是我的代码

#define BUF 128 /* can change the buffer size as well */


char ** readFileContentArray(char* filename){

   int lines = 128;
   char **     strLines = (char **)malloc(sizeof(char*)*lines);
   FILE *plist = NULL;
   int i = 0;

   char line[4];

   plist = fopen(filename, "r");
   while(fgets(line, BUF, plist)) {

       if(i >= lines){
           strLines = (char **)realloc(strLines, (lines*2) * sizeof(char *));
           lines = lines*2;
       }

       strLines[i] = strdup(line);
       i++;
   }


   return strLines;
}
我正在阅读的文件的格式如下:

aaaa

bbbb

中交所

dddd

eeee

ffff

gggg

jjjj


您的代码有几个问题

  • 您不会检查
    fopen
    是否成功。这可以通过检查其返回值来实现
    fopen
    失败时返回
    NULL
  • 您允许
    fgets
    将128个字符写入
    ,该行最多可容纳4个字符
  • 固定代码:

    #define BUF 128 /* Change to max size of a line */
    
    
    char ** readFileContentArray(char* filename){
    
       int lines = 128;
       char **     strLines = malloc(sizeof(char*) * lines);
    
       if(strLines == NULL) //If malloc failed
           return NULL; 
       FILE *plist = NULL;
       int i = 0;
    
       char line[BUF]; //Allocate BUF size
    
       if((plist = fopen(filename, "r")) == NULL) //If fopen failed
           return NULL; 
       while(fgets(line, BUF, plist)) { 
    
           if(i >= lines){
               char* temp;
               if((temp = realloc(strLines, (lines*2) * sizeof(char *))) == NULL) //If realloc failed
               {
                   free(strLines);
                   return NULL;
               ]
               lines = lines*2;
           }
    
           strLines[i] = strdup(line);
           i++;
       }
    
       fclose(plist); //Close file after its use
    
       return realloc(strLines, i * sizeof(char*)); //Return correct size
    }
    

    您的代码有几个问题

  • 您不会检查
    fopen
    是否成功。这可以通过检查其返回值来实现
    fopen
    失败时返回
    NULL
  • 您允许
    fgets
    将128个字符写入
    ,该行最多可容纳4个字符
  • 固定代码:

    #define BUF 128 /* Change to max size of a line */
    
    
    char ** readFileContentArray(char* filename){
    
       int lines = 128;
       char **     strLines = malloc(sizeof(char*) * lines);
    
       if(strLines == NULL) //If malloc failed
           return NULL; 
       FILE *plist = NULL;
       int i = 0;
    
       char line[BUF]; //Allocate BUF size
    
       if((plist = fopen(filename, "r")) == NULL) //If fopen failed
           return NULL; 
       while(fgets(line, BUF, plist)) { 
    
           if(i >= lines){
               char* temp;
               if((temp = realloc(strLines, (lines*2) * sizeof(char *))) == NULL) //If realloc failed
               {
                   free(strLines);
                   return NULL;
               ]
               lines = lines*2;
           }
    
           strLines[i] = strdup(line);
           i++;
       }
    
       fclose(plist); //Close file after its use
    
       return realloc(strLines, i * sizeof(char*)); //Return correct size
    }
    

    您可以将指针传递给两个整数,这样调用者就可以知道数组中分配了多少项。
    调用为
    char**strArray=readFileContentArray(“file.txt”、&total、&used)
    结果可以打印为

    for ( i = 0; i < used; i++) {
        printf ( "%s", strArray[i]);
    }
    

    您可以将指针传递给两个整数,这样调用者就可以知道数组中分配了多少项。
    调用为
    char**strArray=readFileContentArray(“file.txt”、&total、&used)
    结果可以打印为

    for ( i = 0; i < used; i++) {
        printf ( "%s", strArray[i]);
    }
    

    1)
    fgets(行、BUF、plist)
    --您允许
    fgets
    行中最多存储128个字符,该行只能容纳4个字符2)您不检查
    fopen
    3)不在调用4个字符的文件内容字时强制转换
    calloc
    malloc
    realloc
    的结果,请尝试,但是,在调用中,我总是返回8个单词,使用数组的大小:<代码> fGET(行,sieof of Line,PLIST)。如果在您的(例如POSIX)系统上可用,则应该考虑使用。“<代码> FGET(行,BUF,PLIST)< /代码>”--您允许
    fgets
    行中最多存储128个字符,该行只能容纳4个字符2)您不检查
    fopen
    3)不在调用4个字符的文件内容字时强制转换
    calloc
    malloc
    realloc
    的结果,请尝试,但是我总是在调用中使用数组的大小返回8个词:<代码> fGET(行,sieof of Line,PLIST)。如果在您的(例如POSIX)系统上可用,您应该考虑使用。抱歉,也许我解释得不好。我的数组只存储了8行,但该文件包含更多行(大约200.000行)。我尝试了你的代码,但只能存储前八个。非常感谢你的帮助,但不幸的是仍然不能working@jlopez“不工作”是一个糟糕的解释。怎么不起作用了?我是说,那只省了8块钱words@jlopez,我无法复制。考虑一下道歉,也许我没有解释清楚。我的数组只存储了8行,但该文件包含更多行(大约200.000行)。我尝试了你的代码,但只能存储前八个。非常感谢你的帮助,但不幸的是仍然不能working@jlopez“不工作”是一个糟糕的解释。怎么不起作用了?我是说,那只省了8块钱words@jlopez,我无法复制。考虑张贴