2016-10-20 1 views
0

Ich habe folgende wie mein Code zu lesen:Ärger eine TXT-Datei

string file_name; 
int weight; 
int distance; 
char slash = '/'; 
string line = ""; 

ifstream myfile(file_name); 

cout << "Enter the path of the file you want to read from. \n"; 
cin >> file_name; 
ifstream inFile (file_name); 
inFile.open(file_name.c_str()); 
if (inFile.is_open()) 
{ 
    while (getline (inFile,line)) 
    { 
     inFile >> setw(7) >> weight >> setw(7) >> distance; 
     cout << "\n" << setw(4) << weight << setw(4) << distance; 
    } 
    inFile.close(); 
} 
else cout << "Unable to open file"; 

Ich versuche, durch jede Zeile einer Datei zu bewegen, dass der Benutzer den Pfad eingibt. Die Datei, die ich benutze, hat Hunderte von Zeilen von Daten und ich möchte durch jede Zeile gehen und jedes Element trennen (jede Zeile hat den gleichen Satz von Elementen), dann zur nächsten Zeile gehen und dasselbe tun. Es wird jedoch nichts extrahiert, und nichts wird verkauft. Hat jemand irgendwelche Ideen, warum dies nicht wie vorgesehen funktioniert?

+0

Gibt es weitere Fehlermeldungen? Können Sie eine Probe Ihrer Daten einfügen? – roelofs

+0

@roelofs nope keine anderen Fehlermeldungen – lottie3

+0

Datenbeispiel: 2016/3/16 2016/3/23 f 581 3980 3 nn 15 Ken Jones [email protected] – lottie3

Antwort

0

Geht X-Y auf Sie. Das ist C++, also versuchen wir etwas Objektorientierung, sollen wir?

Anstatt mit vielen verschiedenen Datentypen und komplexen Parserregeln zu arbeiten, empfehle ich, den Daten eine Reihenfolge aufzuerlegen und die Reihenfolge zu verwenden, um das Parsing zu vereinfachen.

Ich zeige nur mit den Daten, aber der Rest der Informationen kann auch in Klassen und Strukturen gesammelt werden, wie Ihre Bedürfnisse und Logik vermuten lässt.

#include <sstream> 
#include <iostream> 

using namespace std; 

// a simple date structure. Could be a class, but this is C++. structs ARE classes. 
struct Date 
{ 
    string year; 
    string month; 
    string day; 

}; 

// make a input stream reader for Date 
istream & operator>>(istream & in, Date & date) 
{ 
    getline(in, date.year,'/'); // grab everything up to the first/
    getline(in, date.month,'/'); // grab from first/to the second/
    getline(in, date.day, ' '); // grab from second/to first space 
    return in; 
} 

// make a output stream writer for Date 
ostream & operator<<(ostream & out, const Date & date) 
{ 
    return out << date.year << '/' << date.month << '/' << date.day; 
} 
int main() 
{ 
    string file_name; 
    string line; 

    // using a preloaded string stream instead of file. Easier to debug. 
    stringstream inFile("2016/3/16 2016/3/23 f 581 3980 3 n n 15 Ken Jones [email protected]\n2016/5/28 2016/11/3 s 248 17 3 n y 20 Katy Perry [email protected]\n2016/2/13 2016/8/8 w 79 1123 2 n y 21 Betty White [email protected]\n2016/2/22 2016/4/14 f 641 162 2 n n 22 Earl Grey [email protected]"); 
    while (getline(inFile, line)) // read a line 
    { 
     stringstream linestream(line); // put line into another stream 
     Date est; // allocate a couplte Dates 
     Date mv; 
     linestream >> est >> mv; // read into Dates 

     cout << "\n" 
      << est.year << '/' << est.month << '/' << est.day << " " // print hard way 
      << mv; // print easy way 
    } 
} 

Beispielausgabe:

2016/3/16 2016/3/23 
2016/5/28 2016/11/3 
2016/2/13 2016/8/8 
2016/2/22 2016/4/14