2011-06-22 18 views
0

私はC++(と一般的にはちょうどC++)でのファイルI/Oで働いてきたので、それはしばらくしているが、私は最近、友人のための小さなコンソールプロジェクトを作ってそれを使用することにしました。 私の問題は、文字列配列とファイルI/Oで問題が発生していることです(問題の原因は不明です)。次のように私のコードです(ReadPSWDSははifstreamである):シンプルなC++のファイルI/Oの問題

   int i = 0; 
      string str[200]; 

      ReadPSWDS.clear(); 
      ReadPSWDS.open("myPasswords.DoNotOpen"); 

      if(ReadPSWDS.is_open()) 
      { 
       while(!ReadPSWDS.eof()) 
       { 
        getline(ReadPSWDS, str[i]); //Store the line 
        if(str[i].length()<1 || str[i] == "") 
        { 
         //Ignore the line if it's nothing 
        } 
        else 
        { 
         i++; //Move onto the next 'cell' in the array 
        } 
       } 
      } 

      ReadPSWDS.close(); 

私の問題はこれをテストするには、文字列配列が空であるように思われるということです(と、ファイルにすべてのこれらの行を書くことに、ファイルがあります期待どおり空)。 文字列配列が空であり、テキストファイルの適切な行で埋められないのはなぜですか?

よろしく、

ジョー

+2

友人の宿題/割り当て/プロジェクトのコーディングを直接指示しないように助言します。あなたは助けていない、あなたは彼/彼女を殺している。 – Donotalo

+1

'ReadPSWDS.is_open()'がtrueであることを確認しましたか?マシンがあなたの直感を反映しているかどうかを素早く確認するには、常に印刷ステートメント(coutまたはロギング)を使用します。 –

+0

@Donotalo Heh。これは簡単なプロトタイプであり、私は数分でうまくいっていますが、なぜ動作しないのか分かりません。 @pedrusはい、それで:if(ReadPSWDS.is_open()) –

答えて

6

あなたが書いたループは明らかに間違っている:あなたは 障害が発生する前eof()をテストしている、とあなたはgetline後の障害のためにテストしていません。 C++ 入出力は予測的ではありません。 (。あなたはeof()にいるかどうかを はあなたが読んしようとするものに依存しますので、私は、することはできません)正しいパターンは次のようになります。私はiためのテストを追加しました

while (i < size(str) && getline(readSWDS, str[i])) { 
    if (!str[i].empty()) { 
     ++ i; 
    } 

注意。書かれているように、ファイルに 200行以上が含まれている場合は、深刻な問題に直面しています。

私は、これはしかし、あなたの問題であることはよく分かりません。 と書かれているループは通常、最後の行でのみ問題を引き起こします。 (最後の行が'\n'で終了し、空でない場合、通常、それは があなたの配列に2回表示されます。)でない限りは、もちろん、あなたのファイルには、200の以上の行を 含まれていません。

私はさらに、典型的なイディオムがstr std::vector<std::string>を作成することであろうことを追加し、ループ書き込みがあります。これは、行の固定最大数を定義する必要がなくなり

std::string line; 
while (std::getline(readSWDS, line)) { 
    if (!line.empty()) { 
     str.push_back(line); 
    } 
} 

を。

+1

正しい。 eof()は、発生したI/Oエラーを検出しないようにするためのものです。 getline()の戻り値をチェックする必要があります。 –

+1

@Benoîtそれはそれより複雑です。 'eof()'(あるいは 'eofbit')はちょっとあいまいです。一方では純粋に内部的なものです:streambufがEOFを返したという事実を記憶しています。そのため、ストリームはEOFが見えたら追加の文字を取得しようとしません。もう一つは、if(src.bad())/ * hardware problem */else if(!src.eof())の行に沿って、EOFか他の何かが失敗の原因であったかどうかを判断するために、/*テキストのフォーマットエラー*/else/*ファイルの終わり*/'。これは100%信頼できるわけではありませんが、それが最善です。 –

+0

もちろん、ベクトル!私は良い方法があることを知っていましたが、この最後の夜遅くコーディングしました。 eof()に関しては、私の誤った使い方には申し訳ありません。ファイルを頻繁に使用せず、コードをどこかから取得しています。私はあなたのコードを試してみますが、私のひどいオリジナルのコードがうまくいかない理由はありません。 –