C++ 如何在C+中检查ifstream是否为文件结尾+;

C++ 如何在C+中检查ifstream是否为文件结尾+;,c++,ifstream,file-handling,line-endings,seekg,C++,Ifstream,File Handling,Line Endings,Seekg,我需要按顺序读取一个大文件(大约10GB)的所有块,该文件包含许多带有几个字符串的浮点,如下所示(每个项由“\n”分割): 6.292611 -1.078219E-266 -2.305673E+065 草地艾沃 4.899747e-237 1.673940e+089 -4.515213 我每次都会读取每个文件的MAX\u NUM\u项,然后处理它们并写入另一个文件,但我不知道ifstream何时结束。 这是我的密码: ifstream file_input(path_input); //m

我需要按顺序读取一个大文件(大约10GB)的所有块,该文件包含许多带有几个字符串的浮点,如下所示(每个项由“\n”分割):

6.292611
-1.078219E-266
-2.305673E+065
草地艾沃
4.899747e-237
1.673940e+089
-4.515213

我每次都会读取每个文件的
MAX\u NUM\u
项,然后处理它们并写入另一个文件,但我不知道
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;
}
基本上
peek()
将读取下一个
char
,而不提取它


因此,您可以简单地将其与
EOF

进行比较,您不应该在阅读之前检查EOF。尝试读取,并检查是否成功。@您指的参数化牛角面包
while(file\u input.read(buffer,MAX\u NUM\u PER\u file))
?我试过了,但它可以读取所有文件,有几个项目无法读取。@mAlters我不认为链接的问题实际上回答了这个问题。似乎我从可能重复的列表中选择了错误的Q,这是一个相当大的列表。例如,请参见(关于
.eof()
)的投票率最高的问答)在文件结束后,仍然会出现更多错误
char
,就像
while(file\u input.tellg()对不起,这是我的错。您的解决方案有效,请参阅我的更新。谢谢。
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
}