2012-02-13 21 views
0

以前にVisual Studioを使用した後、RedHatでg ++コンパイルに移動したときに面白いエラーが発生しました。予期せぬcout <<カンマを追加したときの文字列*

私はこのようになりますループしています。データ[i]の

for(unsigned int i = 0; i < data.size(); i ++){ 

    for(int j = 0; j < data[i]->size; j++){ 

     cout << data[i]->columns[j]<< ','; 
    } 

    cout << endl; 

} 

を - >列は、*文字列であり、かつ意図はカンマで出力を分離することです。私は少しのコードを変更した場合のに対し

,ata, two, three, four 
,ata2, two, three, four 
,ata3, two, three, four 

: 以前は、これは働いていた、しかし、今日の私の出力は次のようになります COUT < <ダタイ[I] - >列[J] < <てendl;

私が取得:

data 
two 
three 
four 

data2 
two 
three 
four 

それはカンマでこれらの文字をオーバーラップさせることができましたか?これはビジュアルスタジオコンパイラでは発生しませんでした。

+0

エラーを示す実際のコードをコピー貼り付け(* not * retype)してください。投稿したコードスニペットはコンパイルされない可能性があります。 http://sscce.org/。 –

答えて

4

各行の最後のエントリに\ rと/または\ nがあるように見えます。

ので4にあなたが"fourBREAK,"

を得るあなたのENDL出力を使用すると、4後2つの改行を取得しているので、これを確認しているようです。

+4

より具体的にはキャリッジリターン文字( '\ r') – rve

+0

これは正しいと思われ、最後の文字をnullに設定すると問題が解決されました。 rve-キャリッジリターンとは何ですか?また、キャリッジリターンは何になるのでしょうか?私は、行の非常に短い文字列の区切り文字として '\ n'を使ってデータを解析していて、文字列自体に '\ n'を含まないと考えました。 – Glem

+0

@Glem Windowsは\ r \ nを使ってUnixが\ nだけ使う新しい行を表します。 \ rはキャリッジリターン(行の先頭)ですが、\ nは改行です。それをタイプライターのように考える。最初にバーを最初に戻さなければならないので、新しい行を追加する必要があります。 – Timeout

2

入力ファイル(dataを入力したときに読み込む)は、MS-DOSテキスト形式です。 dos2unixまたは類似のユーティリティを使用するか、入力時に\rを無視してください。

関連する問題