2011-06-29 14 views
2

私は、n個の列とy個の行にバイナリ値を持つテキストファイルを持っています。getline end of line?

Iは、バイナリ値のすべての行を抽出し、ベクトルに割り当てるのgetlineを使用しています:
Iは、各行が「0」の一連の構成やファイルのすべての行を抽出するためのgetlineを使用してい'1'はスペースで区切り、ベクトルに割り当てます。

std::vector< std::vector<int> > matrix; // to hold everything. 
std::string line; 
while(std::getline(file,line)) 
{ 
    std::stringstream linestream(line); 
    int a,b,c,d; 
    linestream >> a >> sep >> b >> sep >> c >> sep >> d; 
    std::vector <int> vi; 
    vi.push_back(a); 
    vi.push_back(b); 
    vi.push_back(c); 
    vi.push_back(d); 
    matrix.push_back(vi); 
} 

ここで問題になるのは、ファイルにいくつの列があるかを事前に知ることができないことです。私はその行の最後に到達するまでどのようにすべての行をループすることができますか?

+1

"バイナリ値"を定義します。 –

+2

getline()はバイナリファイルでは動作しません。 getline()と演算子>>は、テキストファイル(おそらく人間が読むことができる)で使用するように設計されています。バイナリファイルには、これらの演算子を混乱させる任意のデータがあります。 –

+0

@Martin:空白で区切られた0と1の表を意味しました。 – alandalusi

答えて

3

明白な方法は、のようになります。これは良く、セパレータが続いされない場合があり、最後の項目のために失敗することがありますが

while (linestream >> temp >> sep) 
    vi.push_back(temp); 

。あなたはそれを適切に処理するためにいくつかの選択肢があります。 1つは典型的な "ループとハーフ"イディオムです。もう1つは、区切り文字を空白として扱うlocaleです。改行文字(\ n)のための

std::copy(std::istream_iterator<int>(linestream), 
      std::istream_iterator<int>(), 
      std::back_inserter(vi)); 
+3

したがって、読み込みを分けて修正してください: 'while(linestream >> temp){vi.push_back(temp);}ラインストリーム>> sep; } ' – Josh

+1

@ user349433:これは確かに可能ですが、区切り文字を空白として解釈することをお勧めします。 –

+0

_loopとideomについて知りませんでした。リンクが見つかりました:[loop and a half](http://www.cs.duke.edu/~ola/patterns/plopd/loops.html#loop- and-a-half) –

-1

チェック:あなたがいることをすれば

場合は/、あなたが/も標準アルゴリズムを使用することができますすることができます。見つけたら、行/列を完成させました。

+1

これは役に立ちません。 –

+0

あなたのご意見はありません。どのように私を困惑させるのではなく、それが役に立たないのか説明してください。 – MGZero

+0

さて、彼はすでに一度に1行ずつ読んでいます。したがって、改行を検索することは何もしません。実際には、[そこにも存在しません](http://www.cplusplus.com/reference/string/getline/)。彼が抱えている問題は、列を繰り返し、「チェック」を何回実行するかを知らないことです。新たな「小切手」が問題を解決することと何ら関係がないことを示唆している。 –

0

なぜではない while(in1 >> i)row.push_back(i); セパレータは不要ですか?

+0

申し訳ありませんが、カンマ区切りなどがあることがわかります – John

関連する問題