簡體   English   中英

如何檢查ifstream是否是C ++文件的結尾

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

我需要按順序讀取一個大文件(大約10GB)的所有塊,該文件包含許多帶有幾個字符串的浮點數,如下所示(每個項目由'\\ n' 6.292611 -1.078219E-266 -2.305673E+065 sod;eiwo 4.899747e-237 1.673940e+089 -4.515213 ): 6.292611 -1.078219E-266 -2.305673E+065 sod;eiwo 4.899747e-237 1.673940e+089 -4.515213

MAX_NUM_PER_FILE都讀取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進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM