2012-01-28 5 views
1

私は一度に1行ずつテキストファイルを読み込み、各行をターミナルウィンドウに表示しようとしています。私はg ++、例えばg ++ cpp3.cpp -o cpp3を使ってMacでコンパイルしています。getlineとcoutによる印刷

テキストファイルは次のようになります。ここでは

20100000001 20100000001.xml 
20100000002 20100000002.xml 
20100000003 20100000003.xml 
20100000004 20100000004.xml 

が私のコードです:

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    ifstream ifs("file.txt"); 
    string line; 
    while(getline(ifs,line)) { 
     getline(ifs,line); 
     cout << "[ " << line << " ]" << endl; 
    } 
return 0; 
} 

私は、出力は次のようになりたいのですが。しかし

[20100000001 20100000001.xml] 
[20100000002 20100000002.xml] 
[20100000003 20100000003.xml] 
[20100000004 20100000004.xml] 

、すべてのもの端末の1行に印刷されます。言い換えると、テキストファイルの各行は最後の行の上に書き込まれます。さらに、大括弧 "["と "]"は一度しか書かれていないように見えるので、基本的に "["、次にファイルの内容全体、次に "]"を出力します。

だから、これは端末への最終的な出力は次のようになります。これが起こっておよび/またはどのように問題を修正することですなぜ誰もが説明でき

user$ ./cpp3 
]10000000401 20100000004.xml 

user$ 

+1

注:」それぞれの繰り返しでgetlineを2回呼び出します。あなたのプログラムの出力をhexdumpで実行できますか? (私はあなたのソーステキストファイルに奇妙な行末の文字があると思います。) – Mat

答えて

3

おそらくod -cでデータファイルを見てください。あなたは、データが改行を含んでいないかもしれないので、出力に\r(キャリッジリターン)とない\n(改行)を印刷しているかのように互いのラインの上に書かれた

すべてが聞こえます。 ファイルがWindows環境から来ていて、getline()が改行を取り除いていて、最後に改行を残していて、出力が改行を復活していないのでしょうか?

または、ファイルには\rの行末のみが含まれている可能性があります。この場合、getline()はファイル全体を1行として読み込み、1行として出力します。出力にカウンタを追加し、各出力ラインに対してカウンタを増やすことで、それを実証できます。 「角括弧が一度だけ印刷された」というあなたの見解は、これが犠牲になった提案よりも良いかもしれないことを示唆しています。出力にはendlがありますが、これは重要です。あなたはこのようなgetline(ifs, line);削除する必要が

+0

これはそのトリックでした。 (終わりの行はすべて\ rだった...私はそれらを\ nに変更し、うまくいった。)ありがとう! – ishmael

0

:また

while(getline(ifs,line)) { 
    cout << "[" << line << "]" << endl; 
} 

は、あなたがそれ以外の場合は、出力は次のようになります、角括弧の間にスペースを削除する必要があります。

[ 20100000001 20100000001.xml ] 
[ 20100000002 20100000002.xml ] 
[ 20100000003 20100000003.xml ] 
[ 20100000004 20100000004.xml ] 
+0

ありがとうございます。私は2つのgetlineを持つことを意味しませんでした。 – ishmael