2013-05-29 23 views
1

我一直試圖從C++中的.txt文件中讀取一些信息,但它並不像我所期望的那樣工作。下面是一些示例代碼:從文件錯誤中獲取輸入C++

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    char words[255]; 
    int value = 0; 

    ifstream input_stream("test.txt"); 

    input_stream >> value; 
    input_stream.getline(words, 256); 

    cout << value << endl; 
    cout << words << endl; 
} 

而且test.txt的包含:

1234 
WordOne WordTwo 

什麼我希望是代碼打印包含在文本文件中的兩條線,而是我只是得到:

1234 

我一直在閱讀關於getline和istream,但似乎無法找到任何解決方案,所以任何幫助將不勝感激。

由於

+1

嘗試打印另一個getline的輸出,並查看您找到的內容。這與換行符是否被消耗有關。 –

+0

我想這是因爲getline在第一個字符串(1234)後面找到換行符並停止。 – maverik

+0

@maverik是的,它是。 –

回答

3

整數的讀出後的換行字符保持在輸入流中:

// Always check result to ensure variables correctly assigned a value. 
if (input_stream >> value) 
{ 
} 

然後,呼叫到getline()讀取換行符和停止時,產生一個空字符串。要更正,請在致電getline()之前使用換行符(選項包括使用getline()ignore())。

注有一個版本std::getline(),接受一個std::string作爲它的參數,以避免使用的char固定大小的數組,這是在發佈代碼錯誤地使用。

0

ifstream的getline方法收集輸入,直到命中兩個選項中的一個。無論是終止字符還是傳入的大小都已達到。在你的情況下,在達到大小之前遇到換行符終止符。

使用另一個getline檢索第二行文本。

Reference

0

這裏是你的原代碼稍微修改後的版本:

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    char words[256];     // was 255 
    int value = 0; 

    ifstream input_stream("test.txt"); 

    input_stream >> value; 
    input_stream.ignore();   // skip '\n' 
    input_stream.getline(words, 256); 

    cout << value << endl; 
    cout << words << endl; 
} 

另外,我建議你使用的string而不是char[]和使用the other getline function

0

您所看到的問題是1234之後的第一個換行符不會被input_stream>>(int)消耗;所以下一個getline只讀到該文件的末尾。

這是一個非常構建的場景,通常在學校中發現。閱讀文本文件時更常見的情況是將整個文件視爲基於文本的文本。

在這種情況下,更方便的

string line; 
while(std::getline(input_stream, line)){ 

} 

是適當的,和方式不容易出錯。

該文本文件通常會有一個預定義的格式。也許name = value行,並且在之後被解析爲,從該文件讀取該行。