2016-09-27 1 views
0

Ich habe eine Zuweisung, wo ich eine Funktion erstellen muss, die einen Dateinamen als Parameter akzeptiert, die Datei öffnet, einen Benutzer auffordert, einen Wert einzugeben, nach dem gesucht werden soll Durchsucht die Datei nach diesem Wert. Die Datei, die mir für diese Aufgabe zur Verfügung gestellt wurde, ist eine Datei mit einer Liste von Einnahmen- und Ausgabenwerten. Ich habe fast alles probiert und empfange immer noch die Eingabeaufforderung "Wert nicht gefunden", auch wenn ich einen Wert eintrage, von dem ich weiß, dass er sich in der Datei befindet.C++ Funktion zum Suchen nach einem numerischen Wert in einer Datei

Der Code ist

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; 
    } 
} 
} 

Jede Hilfe sehr

geschätzt
+0

wenn searchval ist nicht in string, es wird wieder enthält? (! = anstelle von ==) – Charlie

+0

Wenn searchval in string gefunden wird, der "! = string :: npos" -Teil, soll es den Wert zurückgeben und in welcher Zeile dieser Wert gefunden wurde, und wenn es nicht gefunden wird, gibt es das zurück searchval wurde nicht gefunden. Würde es zu "==" anstelle von "! =" Ändern? @Charlie – gonzato

+0

warum die 'cin.ignore(); '? –

Antwort

0

Sie benötigen die else Teil Seite while Schleife zu löschen. Andernfalls sucht Ihre Funktion nur nach der ersten Zeile.

+0

Danke !!!! dies löste mein Problem – gonzato

+0

Sie sind herzlich willkommen :) –

0

Ich war gelangweilt, also beschloss ich, es auch zu tun. Ich poste meins, obwohl es schon gelöst ist. (Upvoted die Frage zum Spaß zu lösen;))

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 
} 

der unter main() aufgerufen wird:

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; 
} 

Passing Werte durch Bezugnahme uns von ihnen Gebrauch in unserem ursprünglichen Umfang machen lassen. Daher kann die Funktion sowohl Fehler beim Debuggen geben als auch nützliche Ergebnisse für den Zweck unseres Bereichs liefern.

die fstream Closing ist nicht erforderlich, da der Umfang verlassen wird für uns darum kümmern: see here

Hehe, fast wie in der Schule zu sein;)

+0

Vielen Dank! Du hast es viel einfacher aussehen lassen, als es für mich war, haha! – gonzato

+0

Ich habe einen Fehler gefunden, der beim Editieren verloren gegangen ist. Ich vergesse, den Zeichenwert zu aktualisieren, bevor ich 0 zurückgebe, fixiere ihn jetzt auf @gonzato – Charlie

Verwandte Themen