2011-12-19 76 views
2

我只是試圖從文件中讀取每個字符並將它們打印在屏幕上。 爲了測試,我試圖在打印字符之前先在控制檯屏幕上打印ASCII值。C++ I/O不明白爲什麼有-1

我想讀取文件的含量低於:

assign1_2.cpp:33:20: error: cannot convert 'std::string 
    {aka std::basic_string<char>}' to 'const char*' for argument '1' 
    to 'int atoi(const char*)' 

我用下面

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <stdlib.h> 
using namespace std; 

void CountLetters(string filename); 

int main() 
{ 
     CountLetters("count.txt"); 
} 

void CountLetters(string filename) 
{ 
    cout << filename << endl; 

    ifstream in; 
    in.open(filename.c_str(), ios::in); 
    vector<char> letter; 
    char temp; 
    while (!in.eof()) 
    { 
     cout << in.get() << endl; 
    } 

    in.close(); 

} 

運行的代碼,這些代碼後,我看到「-1」結尾在控制檯屏幕上。 任何人請解釋?謝謝

+3

那麼'count.txt'裏有什麼?你可能實際上有一個'-1'! – 2011-12-19 08:52:00

+1

你發佈的編譯器錯誤是如何相關的? – 2011-12-19 08:53:00

+0

您是否一步步調試方法?查看所有變量並查看「-1」是在「cout <<」中發生還是作爲main的返回值。 – 2011-12-19 08:53:47

回答

14

不看書,而不是eof() 。這不是一個正確的閱讀循環。

閱讀閱讀成功

int x; 
while ((x = in.get()) != EOF) 
{ 
    cout << x << endl; 
} 

in.eof()的測試不能保證閱讀成功。當您測試in.eof()時,實際上是在測試之前的讀取操作是否嘗試讀取文件末尾的末尾。這很糟糕,因爲這意味着之前的讀取操作失敗了。它失敗了,你不在乎,只是按下使用它返回的值,即使它失敗了

in.get()失敗時,它返回常量EOF。這就是你應該檢查的。如果in.get()失敗,則不需要像循環成功那樣繼續循環。


也是一樣的,而good()或者雖然不bad()

+0

感謝您的評論!但我有個問題。許多示例似乎都有結束循環的自由。你爲什麼說這不是一個正確的方式?謝謝 – user1047092 2011-12-19 08:59:42

+3

@ user1047092:你提到的這些例子是什麼?萬維網上的很多例子(以及一些書籍)都只是廢話。查看Stack Overflow中的[C++標籤](http://stackoverflow.com/tags/c%2b%2b/info),瞭解具有良好C++示例的資源。 – 2011-12-19 09:00:37

+1

@ user1047092我添加了一個解釋。可悲的事實是,你可以找到的很多例子都是錯誤的。我真的不明白爲什麼人們堅持這種循環。當你意識到,一些簡單的測試會立即顯示它不正確。 – 2011-12-19 09:02:22

相關問題