Von Datei lesen und ueberpruefen

  • C++

  • XodoX
  • 2873 Aufrufe 3 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Von Datei lesen und ueberpruefen

    Also.. ich will von einer txt Datei lesen, das dann sortieren, und dann berechnen. In der Datei sind nur Multiplikation und Addierung drin. Also sowas hier:

    "2*4+3"
    "1+4+5*9"

    usw. Es darf auch ein Leerzeichen dazwischen sein.

    "2 * 4 + 3"

    Der Rest ist nicht erlaubt. Also kein

    "3++3"
    "3+2*4

    ( muss in " " sein)

    Naja, soweit bin ich erst gekommen...

    Quellcode

    1. #include<iostream>
    2. #include<string>
    3. #include<stdlib.h>
    4. using namespace std;
    5. std::ifstream inFile("file1.txt", std::ios::in);
    6. if ( ! inFile.is_open() ){
    7. std::cerr << "Error: unable to open file for input" << std::endl;
    8. return 1;
    9. }
    10. std::ofstream outFile( "file2.txt", std::ios::app );
    11. if ( ! outFile.is_open() ){
    12. std::cerr << "Error, unable to open file for output" << std::endl;
    13. return 2;
    14. }
    15. while ( inFile.good() ){
    16. std::string line;
    17. getline( inFile, line)
    18. outFile << line << std::endl;
    19. }
    20. static int eval(string line)
    21. {
    22. if(line.length() < 1) </b>ression is 0
    23. return 0;
    24. if(line.find_first_of('+') == string::npos)
    25. {
    26. if(line.find_first_of('*') == string::npos)
    27. return atoi(line.c_str());
    28. int pos = line.find_first_of('*');
    29. return eval(line.substr(0, pos)) * eval(line.substr(pos+1, line.length()));
    30. }
    31. int pos = line.find_first_of('+');
    32. return eval(line.substr(0, pos)) + eval(line.substr(pos+1, line.length()));
    33. }
    34. return 0;
    35. }
    Alles anzeigen


    Also erst einlesen, dann eine rekursive Funktion die mir das berechnet. Bin mir nicht sicher, ob das mit dem "linie" einfach so geht, aber da das ja hier "outFile << line << std::endl;" gespeichert wird, hab ich das halt bei der rekursiven Funktion natuerlich weiterbenutzt.
    Wie ueberpruefe ich jetzt, ob das auch alles im richtigen Format ist und es keine Abweichungen gibt? Hab da keine Ahnung ehrlich gesagt:(
  • Hallo,

    meiner Meinung nach ist Dein Code so nicht lauffähig. Um C++-Code usw mal laufen zu lassen rate ich Dir das Microsoft Visual C++ 2010 Express zu installieren(ich habe es für C#) das ist umsonst und reicht zum entwickeln und testen solcher Programme.

    Da kannst Du auch debuggen...

    Dein Programm würde ich dann als z.B. Konsolen-Applikation anlegen und dann
    die Funktionen ergänzen.

    Dann kannst Du Deine .txt immer wieder anpassen und schauen, welche Fehlermeldungen... Du bekommst, wenn Dein Inhalt der .txt nicht schlüssig ist, und diese dann abfangen.
  • Ich würde einen Parser für die Rechenoperationen schreiben, dann vermeidest du einerseits das evil eval und andererseits kannst du dir bei jeder Zeile sicher sein, dass sie gültig ist.
    "General, der Mensch ist sehr brauchbar. Er kann fliegen und er kann töten.
    Aber er hat einen Fehler: Er kann denken." - Brecht
    I Don't smoke, I don't drink, I don't fuck! At least I can fucking think!
  • Mh,

    eigentlich wollte ich ja nicht antworten, da das Thema bereits ein halbes Jahr alt ist.

    @undeath
    Der Parser klingt bissl nach Overkill, obwohl weitaus eleganter.
    Das ginge mit RegEx ganz einfach, fuer Ganzzahlen:

    Quellcode

    1. (\d+[\+\-\*\/])+\d+


    danach sollte man auch bedenkelos eval() ausfuehren koennen, soferns matcht.

    Pseudocode:

    Quellcode

    1. foreach(string line in file)
    2. {
    3. if(Regex.Match("(\\d+[\\+\\-\\*\\/])+\\d+", line))
    4. eval(line);
    5. }