0

我有这段代码,我想从文本文件中读取每一行,然后将其打印到标准输出。无缘无故只将文件的最后一行保存在该字符数组中。任何提示为什么(一些解释是)?

  9 int main(){
 10     FILE * f;
 11     char buffer[255];
 12     char * arr[255];
 13     int i=0,n;
 14 
 15     f = fopen("input.txt", "r");
 16     while(1){
 17         if(fgets(buffer,255,f) != NULL ){
 18             arr[i++] = buffer;
 19         }else break;
 20     }
 21     n=i;
 22     for(i=0;i<n;i++){
 23         printf("%s",arr[i]);
 24     }
 25 
 26     fclose(f);
 27     return 0;
 28 }
4

4 回答 4

1

您的程序只有一个缓冲区,该缓冲区会被文件的每一行覆盖

编辑:

char* buf;
while(1){
   buf = malloc(255);
   if(fgets(buf,255,f) != NULL ){
        arr[i++] = buf;
    }
    else break;
}
于 2012-05-04T21:55:23.653 回答
1

char * arr[255]是一个指向 255 个字符的数组的指针。当您分配时,arr[i] = buffer您正在使指针指向buffer(未分配)数组的每个元素。因此,每个元素都将指向相同char buffer[255]的 ,当您开始打印时,其中只有最后一行。

于 2012-05-04T22:01:31.560 回答
1

这里:

#include <cstdlib>
#include <string.h>

int main(){
  FILE * f;
  char buffer[255];
  char * arr[255];
  int i=0,n;

  f = fopen("c:\\temp\\input.txt", "r");
  while(1){
     if(fgets(buffer,255,f) != NULL ){
         arr[i] = (char *) malloc(255 * sizeof(char));
         strcpy(arr[i++], buffer);
     }else break;
 }
 n=i;
 for(i=0;i<n;i++){
     printf("%s",arr[i]);
 }

 fclose(f);
 for (int j=0; j<i; j++)
     free(arr[j]);
 return 0;
}
于 2012-05-04T22:14:27.337 回答
-1

你永远不会增加 i。在您的阅读循环中,您先保存为 0,然后保存为 i++。但它不会将新的 i 值保存到 i 中。所以你的 i 对于你的下一次迭代是 0。您需要在“arr[i++] = buffer;”之后添加“i = i + 1”

于 2012-05-04T21:58:03.277 回答