2011-12-05 9 views
0

このプロジェクトはC++になっています。私はテキストファイルに沿って移動しようとしており、毎回80文字のsubstrを画面に表示しています。次のステップは、xの開始位置を更新してから、もう一度印刷することです。私の目標は、txt上で「スライド」することです。 2番目のストリーム操作を開始するときにエラーは発生しませんが、画面にはテキストは出力されません。 私が間違っていることを知っている人は誰ですか?新しい操作を実行する前にファイルを閉じる必要がありますか? ThanxC++文字列エラーにtxtを読み取る

ifstream ifs("data.txt"); 
string line; 
string subline; 
int x=5; 

while(getline(ifs,line)) { 
    subline=line.substr(x,80); 
    cout << subline; 
} 

system("pause"); 
system("cls"); 
x++; 


//my issue! 
while(getline(ifs,line)) { 
    subline=line.substr(x,80); 
    cout << subline; 
} 
+1

あなたが本当にあなたのIDE /デバッガを使用してアプリケーションをデバッグ学ぶために試してみてください。どのIDEを使用していますか? – Constantinius

+0

コードブロック。 で、バグはありません。レコードの :私は、std名前空間を使用して の#include の#include の#include の#include 使用しました。 – Rps

+1

私はコンパイルのバグを意味しません。デバッガを使用すると、アプリケーションをステップ実行し、パスを調べたり、変数を分析したりすることができます。http://wiki.codeblocks.org/index.php?title=Debugging_with_Code::Blocks – Constantinius

答えて

2

ファイルの最後に達しており、 'eof'の状態ビットを設定しています( 'good'の状態ビットを削除します)。基本的にはそれ以降の読み取り操作はすべて失敗します。

簡単な修正は、x ++の後に追加することです:

ifs.clear(); // Get rid of the 'eof' state bit 
ifs.seekg(0, ios_base::beg); // Go back to the beginning of the file 
+0

わずかに高速かもしれないので、x ++の代わりに++ xを使うという習慣に入る。インクリメントの前に古い値を戻すためにオブジェクトのコピーを作成する必要はありません。 – matiu

+1

また、@Fuzzは真上です。おそらく、すべての途中でifs.fail()をチェックしているはずです。 – matiu

3

はい、使用後にファイルを閉じる必要があります。プログラミング、特にファイル操作で行うすべての作業を常にクリーンアップします。

ファイルに対して実際に作業を行う前に、ファイルが実際に正常に開かれたことを確認する必要があります。 ファイルを開いたときに(コンストラクタを使用して)、ファイルのオープン操作が失敗した場合、何も返されません。

ifstreamメソッド 'good()'でストリームが正常に開かれたかどうかを確認し、ストリームが失敗したかどうかを確認することができます。

ifstream ifs("data.txt"); 
if(ifs.fail()) 
{ 
    std::cerr << "There was an error opening the file" << std::endl; 
    return -1; // use -1, or some sort of non-zero number representing your error code to the command line 
} 

// Do your reading/writing 

ifs.close(); 

私ははifstreamを使用しているときに利用できる機能のいくつかについてthis infoを読んでお勧めします。

1

ファイルを開く前に、ファイルを閉じるようにしてください。 問題は、2番目の読み取りが実行されたときにファイルポインタが最後を指していることです。 ファイルポインタを先頭にリセットするか、ファイルを再度開いてみてください。