2009-07-25 8 views
0

Je fais un exercice dans lequel je stocke les coordonnées dans un fichier .txt appelé mydata, puis je le relis à partir de ce fichier. Cependant, je "m de la difficulté à lire retourLecture de données à partir d'un fichier

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

Pour tester pour voir si les données sont lues à partir du fichier je poussais le dans un vecteur de points traités, mais quand Je lance le programme et d'entrer des points, il ne transmet aucun point du vecteur processed_points. Je pense que le problème est dans le ...

while(ist >> x >> y) 

et ce n'est pas la bonne façon de lire un fichier Toute aide serait appréciée, merci

Répondre

3

Le , vous émettez dans la ligne

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

est ce qui se trouve dans votre chemin, puisque vous n'êtes pas en les lisant! Soit utiliser un espace au lieu de la virgule, ou, LISEZ revenir ...

1

Si vous n'avez pas besoin de forcer la lecture nouvelle ligne:

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

La meilleure façon est de lire la ligne tout le premier , puis utilisez stringstream pour analyser le point.

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

Le code (ist >> x >> y) est correct, sauf que la virgule provoque l'échec de l'istream dans y. Le caractère est une virgule, pas un chiffre, donc la conversion échoue. Alex est sur la bonne voie ici.

Questions connexes