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

How to check whether ifstream is end of file in C++

本文关键字:中文 C++ 文件 结尾 是否是 ifstream 何检查 检查      更新时间:2023-10-16

我需要按顺序读取一个大文件(大约 10GB)的所有块,该文件包含许多带有几个字符串的浮点数,如下所示(每个项目由""拆分): 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,但我不知道如何检查ifstream是否是文件结尾。

我在带有VS2010的WINDOWS 7中工作。

我已经搜索过,但没有任何答案,如何使用ifstream打开文件并继续阅读直到最后此链接无法回答我的问题。


更新,问题已解决

大家好,我已经发现这是我的错。while(file_input.tellg()<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;
}
while( file_input.peek() != EOF )
{
    // code
}

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

因此,您可以简单地将其与 EOF 进行比较。