2016-09-27 19 views
0

ファイル名をパラメータとして取り込み、ファイルを開き、検索する値を入力するようにユーザーに依頼する関数を作成する必要があります。その値のファイルを検索します。この割り当てに使用するファイルは、収益と経費の値のリストを含むファイルです。私はすべてのことを試してみたが、私が知っている値をファイルに入れても "値が見つからない"プロンプトを受け取り続ける。C++ファイル内の数値を検索する関数

コードが

void numberSearch(string fileName) 
{ 
string searchVal; 

cout << "\nWhat value would you like to search for?\n"; 

cin.ignore(); 
getline(cin, searchVal); 

ifstream file; //create input file object that will be read from 
file.open(fileName); //"ifstream file (fileName)" 

if (!file) 
{ 
    cout << "\nUnable to open file.\n"; 
    exit(1); 
} 

string words; 

int curLine = 0; //file line counter 

while (getline(file, words)) 
{ 
    ++curLine; //counts each line in the file 

    if (words.find(searchVal) != string::npos) 
    { 
     cout << "\nLine " << curLine << " contains " << searchVal << endl; 

     file.close(); 
     return; 
    } 

    else 
    { 
     cout << "\nThe value " << searchVal << " was not found.\n"; 

     file.close(); 
     return; 
    } 
} 
} 

あるすべてのヘルプは非常にあなたがwhileループの側からelse一部を配置する必要があり

+0

searchvalが文字列でない場合、それが返されます含まれますか? (!=の代わりに!=) – Charlie

+0

stringにsearchvalが見つかった場合、 "!​​= string :: npos"部分は値を返し、その値が見つかったはずです。 searchvalは見つかりませんでした。それを "=="の代わりに "!="に変更すると助けになりますか? @Charlie – gonzato

+0

なぜ 'cin.ignore(); '? –

答えて

0

を高く評価しています。それ以外の場合、関数は最初の行のみを検索します。

+0

ありがとうございました!!!!これは私の問題を解決した – gonzato

+0

あなたは歓迎です:) –

0

私は退屈していましたので、私もそれをすることにしました。すでに解決済みですが、私は投稿します。 (解決の楽しみのために質問をupvoted;))main()の下と呼ばれる

using namespace std; 

int testfile(string filename, int &line, int &character) 
{ 
    ifstream is(filename, std::ios::in); 
    if (!is.is_open()) return 1; //1 = no file 

    cout << "Search for what value?" << endl; 
    string value; 
    cin >> value; 

    string buf; 

    while (getline(is,buf)) 
    { 
     ++line; 
     if (buf.find(value) != buf.npos) 
      { 
       character=buf.find(value); //the part that got lost in edit 
       return 0; //value found, returning 0 
      } 
    } 

    return 2; //return 2 since no value was found 
} 

:参照によって

main() 
{ 

    int line=0; //what line it is 
    int character=0; //what character on that line 

    int result=testfile("test.txt", line, character); //debug+passing as reference 

    if (result == 1)cout << "could not find file" << endl; 
    if (result == 2)cout << "could not find value" << endl; 

    if (result == 0) 
     cout << "found at line# " << line << " character# " << character << endl; 

    return 0; 
} 

渡す値は、私たちは私たちのオリジナルのスコープ内にそれらを利用することができます。したがって、この関数はデバッグにエラーを与えることがあり、スコープの目的に有用な結果をもたらすことができます。

範囲を逸脱することは私たちのためにそれの世話をするようfstreamをいったん閉じると、必要はありません。see here

ヘヘ、ほとんど学校にいるよう;)

+0

ありがとう!あなたはそれが実際に私のためにあったよりもはるかに容易に見えるようにしました、笑! – gonzato

+0

私は編集で失われた間違いを見つけた、私は0を返す前に文字の値を更新することを忘れて、今それを固定した@ gonzato – Charlie

関連する問題