2013-08-02 141 views
1

在我的下面的代碼中,我計算了單詞,行數,然後計算文本文件的大小。第一次使用seekg工作正常後,第一個while循環但第二個while循環後,它不工作。它給出的值如輸出中所示。seekg第二次調用不起作用

#include <iostream> 
#include <fstream> 
using namespace std ; 

int main(void) 
{ 
    fstream txtFile; 
    txtFile.open("test.txt"); 

    if(txtFile.is_open()) 
    { 
     printf("txt file is opened"); 
    } 

    //number of words and lines in txt file 
    int w=0 , l =0 ; 
    int c , start , end; 
    string s; 

    while(1) 
    { 
     if(txtFile.peek() == -1) 
      break; 
     c = txtFile.get(); 
     if(c != txtFile.eof()) 
        w++; 
    } 

    txtFile.seekg(0,ios::beg); 

    while(getline(txtFile,s)) 
    { 
     l++ ; 
    } 
    printf("no of words : %d , no of lines: %d\n",w,l); 

    //calculate the size of both the files 
    txtFile.seekg(0,ios::beg); 
    start = txtFile.tellg(); 
    printf("%d\n",start);; 
    txtFile.seekg(0, ios::end); 
    end = txtFile.tellg(); 
    printf("%d\n",end);; 

    return 0 ; 
} 


OUTPUT 
txt file is opened 
no of words : 128 , no of lines: 50 
-1 
-1 

回答

6

上次輸入操作會導致設置失敗位。如果在設置此位時調用tellg,則它也會失敗。在致電tellg()之前,您需要致電clear()

txtFile.clear(); // clear fail bits 
txtFile.seekg(0,ios::beg); 
+1

+1不同之處在於第一個循環只設置'eofbit',而第二個循環設置'eofbit'和'failbit'。 'seekg()'自動清除'eofbit',但如果設置了其他標誌則失敗。 – jrok

+0

@CaptainObvlious先生,你能告訴你說的是哪個「最後輸入操作」嗎?另外,請告訴你如何知道失敗位是否設置? – Subbu

+0

@CodeJack對'getline(txtFile,s)'的調用和我知道,因爲標準告訴我這樣 –

相關問題