2010-03-10 75 views
0

在我的程序中,finifstream對象,而songstringC++:getline()忽略前幾個字符

當程序運行時,它會打開music.txt並從文件中讀取。我嘗試閱讀以下各行:getline(fin,song);

我試過getline的所有變體,但在開始拾取字符之前,它會一直忽略每行的前10個字符。例如,如果歌曲名稱是「songsongsongsongsongname」,它可能只會選擇「歌名」。

任何想法?

這裏的簡化代碼:

void Playlist::readFile(ifstream &fin, LinkedList<Playlist> &allPlaylists, LinkedList<Songs*> &library) 
{ 
    string song; 
    fin.open("music.txt"); 
    if(fin.fail())   
    { 
     cout << "Input file failed. No saved library or playlist. Begin new myTunes session." << endl << endl; 
    } 
    else 
    { 
     while(!fin.eof() && flag) 
     { 
       getline(fin, song);  
       cout << song << "YES." << endl; 
       } 
.....} 
+1

郵政最小編譯源。另外,請注意,通常不需要執行如此多的檢查:'while(getline(fin,song)){...}'是夠好的。 – dirkgently 2010-03-10 23:33:36

+0

那麼,你的'flag'變量沒有設置。 – 2010-03-10 23:34:00

+0

簡化代碼時,我將「標誌」初始化出來了。這應該是真的。 您是否發現getline語法/使用上面的任何錯誤? – Gabe 2010-03-11 00:05:16

回答

0

的固定版本:

void Playlist::readFile(std::string const& filename, ...) { 
    std::ifstream fin(filename.c_str()); 
    if (!fin) throw std::runtime_error("Unable to open file " + filename); 
    for (std::string song; std::getline(fin, song);) { 
     ... 
    } 
} 

更重要的是我已刪除的.eof()測試。如果您可以閱讀更多內容,並且無法使用它來測試以前的閱讀是否成功,則不能將其用於測試。驗證早期操作是否成功可以通過檢查失敗標誌來完成,或者通常通過測試流本身來完成。

0

給這樣一個嘗試,

... 
else 
{ 
    while(fin) 
    { 
     getline(fin, song); //read first 
     if(!fin.eof() && flag) //detecting eof is meaningful here because 
     {      //eof can be detected only after it has been read 
      cout << song << "YES." << endl; 
     } 
    } 
}