2015-06-01 63 views
0

我遇到以下代碼段的問題。ifstream變量不能讀取正確的字符1

我具有被稱爲與字符數組FileName的文件。該文件基本上可以是任何東西,但在我的情況下,它是一個文件,在第一行包含一些不相關的文本,然後在一個情況下以1(一)開頭,在許多其他情況下以0(零)開頭。所以,我的文件是這樣的:

iewbFLUW 82494HJF VROIREBURV.TEXT 

0 TEST whatever something 
0 TEST words and more 
1 TEST something something 
0 TEST oefeowif 
... 

我的代碼片段的意圖是,它選擇用1(一)選擇的行。

// the stream object for my file: 
string FileName = "myFile.text"; 
ifstream input(FileName); 

// parsing the first line 
char comment[1000]; 
input.getline(comment, 1000, '\n'); 
cout << comment << endl; 

// parsing the other lines 
bool select=false; 
while (!input.eof()) 
{ 
    input >> select; 

    cout << select << endl; 
    if(select){ 
    // do something 
    } 
} 

然而,雖然FileName開始以0(零)的第二行中,可變select原來行input >> select;

後立即具有值1這怎麼可能?

+0

請提供[SSCCE](HTTP ://sscce.org)。 – NathanOliver

+5

使用'while(!input.eof())'是錯誤的。改用'while(輸入>>選擇)'代替。 – wilx

+0

0(零)是什麼意思?一個ASCII或二進制值? – marom

回答

0

您的代碼的主要問題是input >> select未讀完整行,但它停在第一個空白處。然後你再讀一遍你認爲從下一行開始的bool,但實際上這是行中第一個單詞的下一個字符,所以你的流以failbit結束,然後它結束了遊戲,你不能再次成功從流中讀取。

閱讀整條生產線,而不是和使用std::stringstream解析它,就像

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

int main(void) 
{ 
    string FileName = "test.txt"; 
    ifstream input(FileName); 

    // parsing the first line 
    std::string line; 
    getline(input, line); // ignore first line 
    bool select = false; 
    while (getline(input, line)) // read line by line 
    { 
     std::istringstream ss(line); // map back to a stringstream 
     ss >> select; // extract the bool 
     if (select) { // process the line (or the remaining stringstream) 
      cout << line; // display the line if it select == true 
     } 
    } 
} 

正如評論所說,while(!input.eof())幾乎總是錯的,看到Why is iostream::eof inside a loop condition considered wrong?

+0

我打算用混合操作符>>和getline來發佈一個例子,並忽略它,但它基本上是一樣的。我只是避免構造字符串流,並避免將忽略的行讀入內存。 –