如何检查ifstream是不是是C ++中的文件结尾

Posted

技术标签:

【中文标题】如何检查ifstream是不是是C ++中的文件结尾【英文标题】:How to check whether ifstream is end of file in C++如何检查ifstream是否是C ++中的文件结尾 【发布时间】:2015-03-22 05:13:23 【问题描述】:

我需要顺序读取一个大文件(约 10GB)的所有块,该文件包含许多带有几个字符串的浮点数,如下所示(每个项目由 '\n' 分隔): 6.292611 -1.078219E-266 -2.305673E+065 sod;eiwo 4.899747e-237 1.673940e+089 -4.515213

我每次都读取MAX_NUM_PER_FILE 项目并处理它们并写入另一个文件,但我不知道ifstream 何时结束。 这是我的代码:

ifstream file_input(path_input);  //my file is a text file, but i tried  both text and binary mode, both failed.
if(file_input)

    file_input.seekg(0,file_input.end);
    unsigned long long length = file_input.tellg();    //get file size
    file_input.seekg(0,file_input.beg);

    char * buffer = new char [MAX_NUM_PER_FILE+MAX_NUM_PER_LINE];
    int i=1,j;
    char c,tmp[3];
    while(file_input.tellg()<length)
    
        file_input.read(buffer,MAX_NUM_PER_FILE);
        j=MAX_NUM_PER_FILE;
        while(file_input.get(c)&&c!='\n')
            buffer[j++]=c;   //get a complete item

        //process with buffer...

        itoa(i++,tmp,10);    //int2char
        string out_name="out"+string(tmp)+".txt";
        ofstream file_output(out_name);
        file_output.write(buffer,j);
        file_output.close();
    

    file_input.close();
    delete[] buffer;

我的代码出错了,length 大于实际文件大小。我试过file_input.good()或者!file_input.eof(),都没有用,getline(file_input,s)很好,但是比read慢很多,我要read,但是不知道怎么检查是否@ 987654333@ 是文件结尾。

我在 WINDOWS 7 中使用 VS2010 完成我的工作。

我已经搜索过,但没有任何答案,How to open a file using ifstream and keep reading it until the end这个链接无法回答我的问题。


更新,问题已解决

大家好,我发现这是我的错。 while(file_input.tellg()&lt;length)while(file_input.peek()!=EOF) 都可以正常工作!推荐while(file_input.peek()!=EOF)

文件结尾后写入的多余项是上次写入的buffer中剩下的项。

这是正确的代码:

ifstream file_input(path_input);
if(file_input)

    //file_input.seekg(0,file_input.end);
    //unsigned long long length = file_input.tellg();   //get file size
    //file_input.seekg(0,file_input.beg);

    char * buffer = new char [MAX_NUM_PER_FILE+MAX_NUM_PER_LINE];
    int i=1,j;
    char c,tmp[3];
    while(file_input.peek()!=EOF)
    
        memset(buffer,0,sizeof(char)*(MAX_NUM_PER_FILE+MAX_NUM_PER_LINE));  //clear first!
        file_input.read(buffer,MAX_NUM_PER_FILE);
        j=MAX_NUM_PER_FILE;
        while(file_input.get(c)&&c!='\n')
            buffer[j++]=c;

        itoa(i++,tmp,10);//int2char
        string out_name="out"+string(tmp)+".txt";
        ofstream file_output(out_name);
        file_output.write(buffer,strlen(buffer));   //use the correct buffer size instead of j
        file_output.close();
    

    file_input.close();
    delete[] buffer;

【问题讨论】:

您不应该在 阅读之前检查 EOF。尝试读取,并检查是否成功。 @TheParamagneticCroissant 你的意思是while(file_input.read(buffer,MAX_NUM_PER_FILE))?我试过了,但它可以读取所有文件,有一些项目没有被读取。 @MSalters 我认为链接的问题实际上并没有回答这个问题。 似乎我从可能重复的列表中选择了错误的 Q,TBH 是一个相当大的列表。参见例如***.com/questions/5605125/…(.eof() 上投票率最高的问答) STL 设计失败的另一个指标,好像要求大小或流结束太不寻常了。 【参考方案1】:
while( file_input.peek() != EOF )

    // code

基本上peek() 将读取下一个char 而不提取它。

所以您可以简单地将其与EOF 进行比较。

【讨论】:

文件结束后仍然会出现更多错误char,就像while(file_input.tellg()&lt;length)一样。 对不起,这是我的错。您的解决方案有效,请参阅我的更新。谢谢。

以上是关于如何检查ifstream是不是是C ++中的文件结尾的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ANSI C 检查文件是不是可执行?

如何检查文件是不是是Python中的符号链接?

如何检查g ++是否支持SCons中的c ++ 14/17?

C ++如何检查文件的最后修改时间

如何检查给定的字符串是不是是 Windows 下的合法/有效文件名?

当数组是C中的struct类型时,如何检查条目数组的第一个条目是不是为空?