2017-09-24 13 views
-2

長いポストのビットですが、このプログラムを最初の行のように見えるのではなく、テキストファイル全体に読み込もうとしています。テキストファイル全体を検索するプログラムが必要です

// return true only if the code is valid 
bool PriceList::isValid(string code) const { 
    ifstream myfile; 
    string line; 
    myfile.open("pricelist.txt"); 

    if (myfile.is_open()) { 
     while (getline(myfile,line)) 
     { 
      if (line.find(code) != string::npos) 
      { 
       cout << line <<endl; 
       return true; 
      } 
      else 
      { 
       cout << line <<endl; 
       return false; 
      } 
     } 
    } 
    else 
     throw invalid_argument("Could not open file"); 
} 

このプログラムのこの部分の目的は、テキストファイル内の製品バーコードが存在するかどうかを判断することです。ここでは、私たちに与えられたテキストファイル(pricelist.txt)の一部は、(左から右へのカテゴリは、名前、バーコード、価格及び課税されている)である。

Soda_can 1035851680 2.29 1 
Red_Cabbage 1163115674 1.99 0 
Tomato_Sauce 1195034963 0.29 0 
Tuna_chunky_in_water 1304271912 0.59 0 
Salad_Dressing 1352230364 1.39 0 

ここではそのメインクラスのコードスニペットですこの関数をテストします。 addEntry行は、既にコード化されたaddEntry関数を呼び出して、各項目をテキストファイルの最後に追加します(主にバーコードデータ値、すなわち1000,2000に焦点を当てています)。 testAnswer行は、関数が正しく実行されているかどうかを示す関数を呼び出します。最初のデータ値はテストのタイトル、2番目はテストする変数、3番目の値は関数が返す値です。たとえば、最初のtestAnswer行はバーコード1000がテキストにあるかどうかをテストしています

{ PriceList priceList; 
    priceList.addEntry("Apples", "1000", 1.99, false); 
    priceList.addEntry("Bananas", "2000", 0.99, false); 
    testAnswer("PriceList isValid1", priceList.isValid("1000"), true); 
    testAnswer("PriceList isValid2", priceList.isValid("19"), false); } 

このように、プログラムですべてのテキストファイルを読むのに問題があると言われています。最初の行であるSoda_canを読み込んでいるようで、両方のtestAnswer関数がfalseになる原因になります。ここでは、現在の出力がある:私は手動で一番上にリンゴとバナナのデータ値を置く場合

Soda_can  1035851680  2.29 1 
FAILED PriceList isValid1: expected 1 but received 0 
Soda_can  1035851680  2.29 1 
PASSED PriceList isValid2: expected and received 0 

それは正しい値になりますが、明らかに私はそれがどこかテキストファイル上の任意のアイテムのために働くようにしたいです。私はこれを解決しようと何時間も費やしてきました、そして、これは私が今得ている最高です。私はこれについて何か助けてくれて大変感謝しています。もしあなたがいたら、これをすべて読んでいただきありがとうございます。私の説明が不明な場合はお知らせください。

+1

[mcve]を投稿してください。 'addEntry'は、ファイル全体を読み込もうとしていますか?あなたはファイル全体を読むか、そうしなかったかを読んでください。そうした場合、問題はファイルを読むこととは関係ありません。 – PaulMcKenzie

+3

最初の行を読んだ後に戻ります。 whileループの外側でreturn falseを移動します。 –

答えて

0

while句の中には、ifelseの両方のセクションでリターンが呼び出されます。これにより、関数の処理が完全に終了します。 while節が2番目の反復に到達する方法はありません。

0

実際の問題は、コードチェックif (line.find(code) != string::npos)の結果に関係なく、プログラムが復帰することです。

おそらく、コードが見つからない場合はファイルの検索/読み取りを続け、コードが見つかったらファイルの読み取りを停止したいと考えています。これはEOFに達するまで続きます。

bFoundのような追加の変数を使用して結果を保存して戻すことができます。以下のコードのように:

bool bFound = false; 
    while (getline(myfile,line)) 
    { 
     if (line.find(code) != string::npos) 
     { 
      cout << line <<endl; 
      bFound = true; 
      break; //Record found break from loop 
     } 
     else 
     { 
      cout << line <<endl; 
      continue; //Record not found. Continue loop. 
     } 
    } 
    return bFound; 
+1

'continue'は目的を果たさず、スキップするコードはありません。 –

関連する問題