2014-02-28 92 views
0

我對C++非常陌生我有這樣的代碼,它應該在Task1中打印文本文件,但它什麼都不顯示,並且它沒有輸出。例如文本文件中包含「1 2 3 4」在C++中讀取文本文件顯示無輸出

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 
void main() 
{ 
    string line ; 
    std::fstream myfile("D:\\Task1.txt", std::ios_base::in); 
    getline(myfile, line); 
    //cout<<line.length(); 
    while(getline(myfile, line)) 
    { 
     for (int i=0; i < line.length(); i++) 
     { 
      cout<<line[i]; 
      //if (line[i] ...) // look at each character and process it accordingly 
     } 
    } 

    getchar(); 
} 

我該如何解決這個問題?

+0

您正在使用第一行而不打印它。另外:確保你確實成功地打開了文件。 – stefan

+0

我不明白嗎?我怎樣才能做到這一點? – user3101219

+0

我測試了你的代碼。它運作良好。你會把你的文件放在這裏嗎?它的地址是否正確? –

回答

1

有一個簡單的問題,你的代碼:

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 
void main() 
{ 
    string line ; 
    std::fstream myfile("D:\\Task1.txt", std::ios_base::in); 
    getline(myfile, line); // That's the problematic line! 
    //cout<<line.length(); 
    while(getline(myfile, line)) // first line lost here 
    ... 

您讀取文件的第一(大概只有線),並簡單地丟棄它,因爲你進入while循環隨即。

修復:刪除while循環前面的行getline(myfile, line);

您也應該檢查該文件確實存在(有可能是在文件名中一個錯字!):

std::fstream myfile("D:\\Task1.txt", std::ios_base::in); 
if (!myfile) 
{ 
    std::cerr << "File does not exist!\n"; 
    return 1; 
} 

如果你不打算使用輸出fstream的爲好,只需更換

std::fstream myfile("D:\\Task1.txt", std::ios_base::in); 

通過

std::ifstream myfile("D:\\Task1.txt"); 
-1

如果您要打印輸出,您需要刷新cout。改變這一行:

cout<<line[i] << std::endl;

,你將有一列

+0

沖洗沒有必要。最終,系統將自行啓動沖洗。 – stefan

+0

沖洗總是必要的,你不能指望系統會這樣做,因爲你的程序可能會到達最後,並且什麼都不打印。這是你可以從提供的代碼中推斷出來的第一個原因,如果不是,那麼你可以談論文件 – hidrargyro

+0

的問題我不知道在程序退出時沒有刷新的任何操作系統/終端配置。你能說出一個名字嗎? – stefan

0

更好您使用ifstream的閱讀打印的字符。 總是檢查ifstream,打開是否成功。

std::ifstream myfile("D:\\Task1.txt"); 
if(!myfile.is_open()) { 
    cerr << "error open file\n"; 
    // return or break 
} 

如果你想讀的數字,所以讀數

for(int number; myfile >> number;) { 
    cout << number << endl; 
} 
+0

'std :: ios_base :: in'不是二進制模式,它是輸入模式。但OP應該可能只是使用'std :: ifstream'。 – stefan

+0

你是對的!今晚睡眠太少。 我將我的代碼更改爲ifstream –

-1

有多少線在文本文件? 在開始打印輸出前,您需要撥打getline兩次。如果你只有一條線,你會得到空字符串;)

此外,我不認爲你的條件是適當的。 Getline不會返回任何有用的東西(它返回istream)。如果它接近文件結尾,它只會出現錯誤標誌。

你應該那樣做:

while (! myfile.eof()) 
{ 
    // do some reading & printing 
} 

另外,請記住通過myfile.close關閉您的文件()。

希望它有幫助。

+0

不,條件正確。流將轉換爲布爾值,指示失敗或成功的提取。 – 0x499602D2

+0

getline返回有史以來最有用的東西:對istream的引用。在條件中檢查它表明istream處於有意義的狀態。 – stefan

+0

手動關閉流也是不必要的。 – 0x499602D2

0

您通過閱讀忽略第一行,不將其輸出。

string line ; 
ifstream myfile("D:\\Task1.txt"); 

while(getline(myfile, line)) 
{ 
    cout << line << endl; 
} 

附加:

  • 你並不需要,如果您正在使用 「使用命名空間std」 使用std命名空間。
  • 您可以使用ifstream爲只讀。