-1

我想知道如何正确读取文件并将每一行放在 C 中的数组字符串中。

我有一个文件,上面写着以下内容

one
two
three
four

我试着写这样的东西:

int read_file(FILE *fp){
   char readLine[MAX_LEN];
   char *myarray[20];
   int counter =0;
   int i =0;
   while(fgets(readLine,MAX_LEN,fp) != NULL){
      myarray[counter] = readLine;
      counter++;
   }

   /*printing the array*/
   while(i<counter){
      printf("%d  %s",i,myarray[i]);
      i++;
   }
}

主要是这样的

int main(){
   FILE *fp;
   fp = fopen("my.txt","r");
   if(fp == NULL){
      fprintf(stderr,"File does not exist");
      return EXIT_FAILURE;
   }

   read_file(fp);
}

但是,在打印时我得到:

four
four
four
four

即使我使用 打印printf("%s",myarr[2]),我仍然得到four

任何人都知道问题可能是什么?

4

2 回答 2

2

strdup()当您覆盖用于接受输入的缓冲区时,您确实需要复制该行(通过):

int read_file(FILE *fp){
   char readLine[MAX_LEN];
   char *myarray[20];     // Note char pointer!
   int i, counter = 0;
   while (counter < 20 && fgets(readLine,MAX_LEN,fp) != NULL) {    // Note limit!
      myarray[counter] = strdup(readLine);
      counter++;
   }

   /*printing the array*/
   for (i = 0; i < counter; i++)
      printf("%d  %s",i,myarray[i]);

   /* free the lines */
   for (i = 0; i < counter; i++)
        free(myarray[i]);   
}
于 2013-08-21T12:10:16.067 回答
1
myarray[counter] = readLine;

是问题所在。您每次都覆盖读取的行指针值。

使用strcpy来复制缓冲区内容。

另外如评论:您不是在声明字符串数组,而只是一个字符串。

将其更改为:

char myarray[4][20];

当然,4 是一个例子。将其更改为任意数量的行或使用动态分配。

于 2013-08-21T12:04:57.877 回答