2017-06-07 2 views
1

Ich bin derzeit an einem Programm arbeiten, das angeblich die Daten aus einer Textdatei zu lesen, und Ort der Daten in einer verknüpften Liste. Ich habe eine ziemlich gute Vorstellung davon, was ich tue, aber die Sache ist, ich bin schließen Fehlerbehandlung soll, die in die nächste Zeile springt, wenn es irgendwelche Fehler in dem Datenformat in der Datei ist.Lesen von Daten aus einem Text verknüpft Listendatei, Fehlerbehandlung

Die Datei enthält Informationen über eine Anzahl von Terminatoren in Form ihres Modells und ihrer Seriennummer.

Ein Beispiel der Daten, die gelesen werden können, ist:

TERMINATOR T-800 1 

TERMINATOR T-1000 2 

TERMINATOR T-800 3 

TERMINATOR T-800 4 

In der ersten Zeile oberhalb, T-800 ist das Modell, und 1 die Seriennummer. Die vier Reihen sind vor allem gültig, aber wenn die fünfte Reihe wie folgt aussehen würde:

TORMONUTTUR T-800 1h6 

oder:

abc 2 

sollten die Daten verworfen werden und das Programm sollte auch weiterhin die nächste Zeile zu lesen .

Ich bin derzeit auf diese verloren, und in der richtigen Richtung nur ein Nicken würde schätzen, da ich nicht sicher bin, wie ich selbst mit diesem Problem beginnen soll.

+3

"Ich arbeite gerade an einem Programm, das Daten aus einer Textdatei lesen soll" -> posten Sie, was Sie bisher getan haben, um Klarheit zu den Fragen zu dieser ansonsten weit verbreiteten Frage zu schaffen. – chux

Antwort

0

Sie könnten versuchen, jeden Teil der Zeile als Zeichenfolge zu lesen Bei der Seriennummer sollten Sie überprüfen, ob es sich um eine Ganzzahl handelt, und wenn ja, konvertieren Sie sie in eine Zahl mit std::stoi.

Aus meiner answer und How do I check if a C++ string is an int?, bekam ich diese:

#include <fstream> 
#include <iostream> 
#include <string> 

inline bool isInteger(const std::string & s) 
{ 
    if(s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false ; 

    char * p ; 
    strtol(s.c_str(), &p, 10) ; 

    return (*p == 0) ; 
} 

int main(void) 
{ 

    std::ifstream infile("thefile.txt"); 
    if (infile.is_open()) { 
     int serial_number; 
     std::string model, terminator, serial_number_str; 
     while (infile >> terminator >> model >> serial_number_str) 
     { 
      if(terminator == "TERMINATOR" && isInteger(serial_number_str)) 
      { 
       serial_number = std::stoi(serial_number_str); 
       std::cout << terminator << " " << model << " " << serial_number << "\n"; 
      } 
     } 
    } 
    infile.close(); 
    return 0; 
} 

die für eine Datei:

Georgioss-MacBook-Pro: ~ gsamaras $ cat thefile.txt

TERMINATOR T-800 1 

TERMINATOR T-1000 2 

TERMINATOR T-800 3 

TERMINATOR T-800 4 

TORMONUTTUR T-800 1h6 

abc 2 

ergibt:

Georgioss-MacBook-Pro:~ gsamaras$ g++ main.cpp 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
TERMINATOR T-800 1 
TERMINATOR T-1000 2 
TERMINATOR T-800 3 
TERMINATOR T-800 4 

Sie können es weiter verbessern, indem std::regex mit dem Format von model zu überprüfen.

+1

Sie verwenden C++, aber die Antwort ist mit C markiert. – kamoroso94

1

Eine Möglichkeit, sich nicht zu überfordern, besteht darin, verschiedene Aktionen an verschiedene Funktionen zu delegieren, damit Sie sich nicht um alles auf einmal kümmern müssen. Ich würde empfehlen, die Datei zu öffnen und jeweils eine Zeile zu lesen. Für jede Zeile können Sie das Format validieren, dann die Daten an Ihre verknüpfte Liste anhängen, ansonsten nichts tun und mit der nächsten Zeile fortfahren. Das könnte ungefähr so ​​aussehen.

char line[128]; 
while(fgets(line, 128, (FILE*)fh) != NULL) { 
    if(isValidLine(line)) { 
     // add data to linked list 
    } 
} 

Die Logik ist dort leicht zu verstehen. Sie müssen nur Ihre Funktion isValidLine definieren, die Zeile zu lesen, um sicherzustellen, dass es gültige Daten enthält, und gibt den entsprechenden Booleschen Wert. Um dies zu überprüfen, können Sie sscanf oder einen anderen Zeichenfolgen-Tokenizer verwenden, um die Zeile zu analysieren, oder Sie können es manuell tun. Überprüfen Sie zum Beispiel, ob es mit der Zeichenfolge "TERMINATOR " beginnt und von dort fortfährt. Ein Alles wird ausgecheckt, es wird Wahr zurückgegeben, aber zu irgendeinem Zeitpunkt werden die Formatanforderungen nicht erfüllt und false wird sofort zurückgegeben.