C 为什么程序只打印文件的最后一行,甚至在读取整个文件之后?

C 为什么程序只打印文件的最后一行,甚至在读取整个文件之后?,c,file,file-handling,C,File,File Handling,我想用C写一个程序,它只读取一个文件,将其存储到数组中,然后打印数组。一切正常,但当文本文件有多行时,我总是只打印最后一行 这是我的代码: #include <stdio.h> #include <stdlib.h> int main(int argc, char * argv[]) { FILE * stream; char dateiname[255]; stream = fopen("heute.txt", "r&q

我想用C写一个程序,它只读取一个文件,将其存储到数组中,然后打印数组。一切正常,但当文本文件有多行时,我总是只打印最后一行

这是我的代码:

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

int main(int argc, char * argv[]) {
   FILE * stream;
   char dateiname[255];
   stream = fopen("heute.txt", "r");

   if(stream == NULL){
      printf("Error");
      }else {
          while(!feof(stream)){
             fgets(dateiname, 255, stream);
      }
    fclose(stream);
    }

printf("%s\n", dateiname);
#包括
#包括
int main(int argc,char*argv[]){
文件*流;
char dateiname[255];
stream=fopen(“heute.txt”,“r”);
if(流==NULL){
printf(“错误”);
}否则{
而(!feof(stream)){
fgets(dateiname,255,stream);
}
fclose(流);
}
printf(“%s\n”,日期名称);
}


谢谢你的帮助

如果您只想读取和打印文件的内容,则无需担心文件的大小以及文件中的行数

您只需运行
while
中的
fgets()
,然后打印每一行,直到我们达到
NULL

但是如果要存储它们,我们需要计算文件的大小。 因此,我们需要使用像
stat
fstat
这样的函数来获取文件的大小并动态分配内存,然后只
读取
那么多字节

  • 一切正常,但当文本文件有多行时,我总是只打印最后一行

  • 原因:对于每次迭代,数据都会被替换为下一行数据,并且在末尾
    dateiname
    将只读取最后一行

  • 而(!feof(stream))

  • 不建议使用
    feof()
    。有关更多信息,请参阅此链接:

  • 请参阅以下代码:

     #include <stdio.h>
     #include <stdlib.h>
    
     int main()
     {
       FILE *stream;
       char dateiname[1024];
       int i = 0;
       stream = fopen("heute.txt", "r");
    
        if (stream == NULL)
        {
           printf("Error");
        }
        else
        {
            while (fgets(dateiname, sizeof(dateiname), stream) != NULL)
            {
               printf("Line %4d: %s", i, dateiname);
               i++;
            } 
        }
    
     return 0;
    }
    
    #包括
    #包括
    int main()
    {
    文件*流;
    char dateiname[1024];
    int i=0;
    stream=fopen(“heute.txt”,“r”);
    if(流==NULL)
    {
    printf(“错误”);
    }
    其他的
    {
    while(fgets(dateiname,sizeof(dateiname),stream)!=NULL)
    {
    printf(“第%4d行:%s”,i,dateName);
    i++;
    } 
    }
    返回0;
    }
    

  • 您只看到最后一项,因为您将所有数据读取到同一个变量中。每一行都替换上一行,当您到达末尾时,您将打印缓冲区中的内容。您可以移动
    printf
    ,在读取时打印每一行。您还应该阅读以下内容:我建议您编写一些代码。或者使用实际的调试器单步执行代码。
    而(!feof)
    始终是一个bug。搜索此网站为什么如此。你的作业或练习的目的是什么?只是为了将文件内容复制到控制台?存储数据并对其执行操作?还有别的吗?请将您的问题包含在作业或练习的全文中。功能
    stat
    fstat
    不属于ISO C标准的一部分。它们是特定于平台的扩展。请注意,问题没有指定任何特定平台。据我所知,在ISO C中没有可靠的方法来确定文件大小。例如,使用
    fseek
    转到文件末尾,然后使用
    ftell
    将无法在所有平台上可靠工作,因为行尾标记在不同平台上的长度可能不同。例如,Windows使用的
    \r\n
    被翻译为
    \n