2012-05-21 17 views
1

我完全不知道自己是什麼會做這個ifstream的獲得()不填充字符數組

#include "fstream" 
#include "iostream" 

using namespace std; 

#define out(a) cout << #a << ": " << a << '\n' 

void print(string s) 
{ 
    cout << s << '\n'; 
} 

int main() 
{ 
    ifstream readt1; 
    readt1.open("test1.yaml"); 

    while(readt1.good()) 
    { 
    char cc[128]; 
    readt1.get(cc,128); 
    out(cc); 
    } 
readt1.close(); 
} 

代碼...輸出這樣的:

cc: version: 0.14.1 
cc: 

與test.yaml感這

version: 0.14.1 
name: scrumbleship 
author: dirkson 
description: > 
    A minecraft like game that allows you 
    to build your own spaceship! 

我試了很多方法來得到這個工作,而且它根本不

回答

2

如果您在獲取後添加readt1.ignore();()它應該工作:

while(readt1.good()) 
    { 
    char cc[128]; 
    readt1.get(cc,128); 
    readt1.ignore(); // <--- add this to ignore newline 
    out(cc); 
    } 

這解決眼前的問題,但使用std::getlinestd::string會更好,C++。喜歡的東西:

while(std::getline(readt1, line)) {// Do stuff} 
+0

哦,我的上帝,當我需要它的時候,這到底是什麼地方?你在哪裏找到它?我會盡快接受(等待5分鐘) – alexmherrmann

+0

當您執行'readt1.get(cc,128);'它會提取127個字符或者直到換行符(即'\ n'),下次您嘗試讀取它失敗的內容,因爲您沒有忽略換行符。 –

+0

因此,忽略就像跳過它,但仍增加gcount? – alexmherrmann

1

您應該使用getline()通過ifstream的讀取線

+0

我想放棄,則對getline,只是在通過一個特定的字符數讀'得到()' – alexmherrmann

+0

如果你的文件有少於128個字符? – ravi

0

另外,我會得到環外的第一線,並且循環應該檢查的EOF,以確保您得到整個文件。不好()只是暗示有文件要讀?

+0

我認爲你得到的只是閱讀那一行,而不會向其他人推進。 –

+0

不,對eof()也進行了很好的檢查 – alexmherrmann

+0

瞭解了這一點,我會回到逐行解析,然後解析數據。 –