2013-02-14 51 views
1

下面的代碼只打印文件一次:使用難度file.seekg()(C++)

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

int main(int argc, const char *argv[]) 
{ 
    ifstream infile; 
    infile.open("in", ios::binary); 
    char c; 

    while (infile.get(c)) 
    { 
     cout << c; 
    } 

    infile.seekg(0, ios::beg); 
    infile.clear(); 

    while (infile.get(c)) 
    { 
      cout << c; 
    } 
    infile.close(); 
    return 0; 
} 

我認爲它有一些通過文件運行後做的EOF標誌,但我不」不知道如何解決這個問題。

乾杯。

+3

NO NO NO'while(!infile.eof())'不要這樣!改用'while(infile >> c){//用c}來代替。 – 2013-02-14 18:49:35

+1

@TonyTheLion我不確定你可以在二進制文件中使用'operator >>',但你的評論仍然是朝着正確方向邁出的一步。我用來讀取二進制文件的是'while(infile.read(&c,1){...}'另外,如果你使用'infile.good()',因爲一些標誌正在被第一個循環設置,請在開始第二個循環之前調用'infile.clear()'。 – Praetorian 2013-02-14 18:52:36

+1

http://stackoverflow.com/questions/1039667/why-does-stdfstream-set可能的間接副本(c!= EOF){if-if-it-way-it- – 2013-02-14 18:53:43

回答

2

有幾個問題與您的代碼:

首先,你不檢查infile.get()使用 其結果之前,成功,永遠。並且您使用infile.good()控制 一個循環,infile.eof()控制另一:infile.eof() 是沒有用的,直到你知道輸入已經失敗,並 infile.good()是從來沒有真正有用的。兩個循環只需使用while (infile.get(c))。第二,如你所說,你永遠不會重置導致你完成第一個循環的「錯誤」。一旦遇到 文件的末尾(並且infile.get(c)已失敗),則需要在執行任何其他操作之前先調用 infile.clear()

最後,當然,你沒有檢查你是否成功打開 文件,以及seekg是否成功。而你通常不需要關閉輸入文件;它將在超出範圍時自動關閉 。 (在另一方面, 你應該關閉或沖洗std::cout,並驗證 它仍然是OK之後,回到0當你未能 寫所有的數據都在我的書了嚴重的錯誤。)

+0

(據我所知)編輯了代碼,並且第二次仍然不打印。 – 2013-02-14 19:56:30

+0

你又如何檢查seekg()'是否工作'?通過使用tellg()? (如果是這樣,它返回-1,我猜意味着seekg()不工作,在這種情況下,爲什麼?) – 2013-02-14 20:23:54

+0

@JamesJenkinson就像你告訴istream或ostream的任何事情一樣:treat該流就好像它是一個布爾值;如果它評估爲「真」,那麼迄今爲止沒有錯誤。 – 2013-02-15 08:38:18