2016-10-30 41 views
0

我正在讀取一個文件,並在這個.dat文件的中間有一個標記。第一部分是變量和它們要分配的值。我得到的變量和他們的價值很好。這是我的。用eof和sentinel入侵

int main() { 
ifstream infile; 
string variable; 
int value; 

infile.open("test.dat"); 

while (infile.peek() != EOF) { 

    infile >> variable; 
    infile >> value; 

} 



return 0; 
} 

這裏是.dat文件

f 32 
h 3 
l -2 
q 3 
v 5 
$ 
lqv 
hfv 
vvf 
vfl 

我首先想到的是用while循環。這是while (variable != "$"),但是當我這樣做時,我會陷入無限循環。所以我完全失去了如何獲取和分配變量,然後獲得.dat文件的其餘部分。

我不得不改變這一點,因爲我不想硬編碼變量。我將使用2個循環。一個在$之前,一個在$之後。當我嘗試while (infile != "$")我得到一個無限循環。

回答

0

您可以通過

while (infile.good()) { 
    infile >> variable; 
    if (variable != "$" && variable.length() > 0) { 
     infile >> value; 
     switch (variable[0]) { 
      ... 
     } 
    } 
    else 
     break; 
} 

這種替代

while (infile.peek() != EOF) { 
    infile >> variable; 
    infile >> value; 
    ... 
} 

應避免無限循環。

1

我建議以下,在第一個變量名稱,必要時讀出的值改爲:

while (infile >> variable) 
{ 
    if (variable != "$") 
    { 
    infile >> value; 
    } 
    else 
    { 
    break; 
    } 
} 

std::map變量名關聯到值非常有用:

std::map<std::string, double> dictionary; 
while (infile >> variable) 
{ 
    if (variable != "$") 
    { 
    infile >> value; 
    dictionary[variable] = value; 
    } 
    else 
    { 
    break; 
    } 
} 

語法infile >> variable是從文件讀取更可靠的方法。

0

您可以檢查下一個字符是'$'還是EOF,但在「>>」之後,您需要爲\ n添加一個get。

ifstream file("test.dat"); 
    int value; 
    string variable; 
    while(file.peek() != '$') 
    { 
      file >> variable; 
      file >> value; 
      while(file.get() != '\n' && file.good()); // '\n' 
      if(!file.good()) break; 
    } 

這隻適用於如果你真的知道文件的結構,否則你應該讀取行和掃描你需要什麼。