2011-09-08 5 views
1

Je veux juste lire un fichier texte et stocker les données dans un vecteur. Ainsi, le poids de la valeur doit être la somme jusqu'à ce que la limite soit atteinte. Les quatre premières lignes seront lues correctement mais les suivantes ne seront pas lues. Quelle est l'erreur?Mauvaise lecture du fichier texte en C++

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <limits> 

/* 
Data.txt 

John 
6543 
23 

Max 
342 
2 

A Team 
5645 
23 
*/ 

struct entry 
{ 
    // passengers data 
    std::string name; 
    int weight; // kg 
    std::string group_code; 
}; 

void reservations() 
{ 
    std::ofstream file; 
    file.clear(); 
    file.open("reservations.txt"); 
    file.close(); 
} 

entry read_passenger(std::ifstream &stream_in) 
{ 
    entry passenger; 
    if (stream_in) 
    { 
     std::getline(stream_in, passenger.name); 
     stream_in >> passenger.weight; 
     std::getline(stream_in, passenger.group_code); 
     stream_in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     return passenger; 
    } 

    return passenger; 
} 

int main(void) 
{ 
    std::ifstream stream_in("data.txt"); 
    std::vector<entry> v; // contains the passengers data 
    const int limit_total_weight = 10000; // kg 
    int total_weight = 0;     // kg 
    entry current; 
    while (!stream_in.eof()) 
    { 
     current = read_passenger(stream_in); 
     total_weight = total_weight + current.weight; 
     std::cout << current.name << std::endl; 
     if (total_weight >= limit_total_weight) 
     { 
      break; 
     } 

    } 
     return 0; 
} 

Répondre

1

Ces deux lignes,

std::getline(stream_in, passenger.group_code); 
    stream_in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

devrait être dans l'ordre inverse:

stream_in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    std::getline(stream_in, passenger.group_code); 

Pensez à ce que le but du ignore est.

De même, au lieu de vérifier uniquement EOF, recherchez une erreur générale.

à savoir, au lieu de

while (!stream_in.eof()) 

écrire

while (stream_in) 

Peut-être il y a plus de mal, mais ce qui précède est ce que j'ai vu tout de suite.

Vive & HTH.,

+0

Ce que vous dites est presque correct, mais vous devez placer l'ignorer aussi après la « passenger.groupcode » pour sauter le newline séparant les entrées. –

+0

oh il y a des lignes vides. À ce moment-là, ignorer est un moyen de les gérer. –

+0

Clement Bellot: alors ça marche !! Merci – burner007

1

j'essaie de ne pas mélanger formaté et entrée orientée ligne précisément pour cette raison. Si elle était moi, et je devais utiliser getline partout, je l'utilise partout getline:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <limits> 
#include <sstream> 

struct entry 
{ 
    // passengers data 
    std::string name; 
    int weight; // kg 
    std::string group_code; 
}; 

void reservations() 
{ 
    std::ofstream file; 
    file.clear(); 
    file.open("reservations.txt"); 
    file.close(); 
} 

std::istream& operator>>(std::istream& stream_in, entry& passenger) 
{ 
    std::getline(stream_in, passenger.name); 

    std::string weightString; 
    std::getline(stream_in, weightString); 
    std::istringstream (weightString) >> passenger.weight; 

    std::getline(stream_in, passenger.group_code); 

    return stream_in; 
} 

void read_blankline(std::istream& stream_in) { 
    std::string blank; 
    std::getline(stream_in, blank); 
} 

int main(void) 
{ 
    std::ifstream stream_in("data.txt"); 
    std::vector<entry> v; // contains the passengers data 
    const int limit_total_weight = 10000; // kg 
    int total_weight = 0;     // kg 
    entry current; 
    while (stream_in >> current) 
    { 
     total_weight = total_weight + current.weight; 
     std::cout << current.name << std::endl; 
     if (total_weight >= limit_total_weight) 
     { 
      break; 
     } 
     read_blankline(stream_in); 
    } 
    return 0; 
}