2009-07-25 13 views
0

Ich mache eine Übung, wo ich Koordinaten in eine TXT-Datei mit dem Namen MeineDaten speichern und dann aus dieser Datei zurücklesen. Allerdings I "m Mühe, es wieder zu lesenLesen von Daten aus einer Datei

Code:.

#include "std_lib_facilities.h" 

// Classes---------------------------------------------------------------------- 

struct Point{ 
Point(int a, int b):x(a), y(b) {}; 
Point(){}; 
int x; 
int y; 
}; 

// Main------------------------------------------------------------------------- 

int main() 
{ 
    vector<Point> original_points; 
    vector<Point> processed_points; 
    cout << "Please enter 7 coordinate pairs.\n"; 
    int x, y; 
    while(cin >> x >> y){ 
       if(x == -1 || y == -1) break; 
       original_points.push_back(Point(x, y));} 
    cout << "Please enter file to send points to.\n"; 
    string name; 
    cin >> name; 
    ofstream ost(name.c_str()); 
    if(!ost)error("can't open output file", name); 
    for(int i = 0; i < original_points.size(); ++i) 
      ost << original_points[i].x << ',' << original_points[i].y << endl; 
    ost.close(); 
    cout << "Please enter file to read points from.\n"; 
    string iname; 
    cin >> iname; 
    ifstream ist(iname.c_str()); 
    if(!ist)error("can't write from input file", name); 
    while(ist >> x >> y) processed_points.push_back(Point(x, y)); 
    for(int i = 0; i < processed_points.size(); ++i) 
      cout << processed_points[i].x << ',' << processed_points[i].y << endl; 
    keep_window_open(); 
} 

Um zu testen, um zu sehen, ob die Daten aus der Datei gelesen wird, ich es zurück in ein verarbeitetes Punkte Vektor bin drängen, aber wenn ich betreiben das Programm und Punkte eingeben, es Ausgabe nicht alle Punkte aus dem processed_points Vektor. ich denke, das Problem in der ist ...

while(ist >> x >> y) 

und dies ist nicht der richtige Weg, aus einer Datei zu lesen Jede Hilfe wäre willkommen, danke.

Antwort

3

Die , Sie in der Zeile

 ost << original_points[i].x << ',' << original_points[i].y << endl; 
emittierende

ist das, was im Weg steht, da Sie es wieder nicht gerade lesen! Entweder verwenden Sie ein Leerzeichen anstelle von diesem Komma, oder, es liest zurück ...

1

Wenn Sie brauchen, um neue Linie nicht zwingen zu lesen:

while((ist >> x) && ist.ignore(1024,',') && (ist >> y)) 
    processed_points.push_back(Point(x, y)); 

Der beste Weg ist ganze Linie zuerst lesen und verwenden Sie dann stringstream, um den Punkt zu analysieren.

string temp; 
while(std::getline(ist,temp)) 
{ 
    std::stringstream line(temp); 
    if((line >> x) && line.ignore(1024,',') && (line >> y)) 
     processed_points.push_back(Point(x, y)); 
} 
0

Der Code (ist >> x >> y) ist in Ordnung, außer dass das Komma dazu führt, dass der istream in y fehlschlägt. Das Zeichen ist ein Komma, keine Ziffer, daher schlägt die Konvertierung fehl. Alex ist hier auf der richtigen Spur.