2010-05-02 8 views
0

J'écris un programme pour un exercice qui va lire les données d'un fichier et le formater pour qu'il soit lisible. Jusqu'à présent, j'ai un peu de code qui va séparer un en-tête des données qui vont dessous. Ici, il est:Pourquoi cette boucle for-line ne s'exécute-t-elle pas?

int main() { 
    ifstream in("records.txt"); 
    ofstream out("formatted_records.txt"); 
    vector<string> temp; 
    vector<string> headers; 
    for (int i = 0; getline(in,temp[i]); ++i) { 
     static int k = -1; 
     if (str_isalpha(temp[i])) { 
      headers[++k] = temp[i]; 
      temp.erase(temp.begin() + i); 
     } 
     else { 
      temp[i] += "," + headers[k]; 
     } 
    } 
} 

(. str_isalpha() est juste une fonction qui applique isalpha() à chaque caractère dans une chaîne) Maintenant, la boucle for dans ce programme ne s'exécute pas, et je ne peux pas comprendre pourquoi . Est-ce que quelqu'un sait?

EDIT: Comme l'a suggéré, je l'ai changé à

string line; 
for (int i = 0; getline(in,line); ++i) { 
    temp.push_back(line); 

encore la saute pour boucle tout à fait.

+0

est qu'une virgule dans le paramètre getline? – Holograham

+0

Ouais, c'est comme ça que les arguments sont séparés dans une fonction, n'est-ce pas? – Maulrus

Répondre

4

Si la boucle ne s'exécute toujours pas après avoir vérifié que vous lisez une référence de chaîne valide, vous devez vérifier que le flux que vous lisez est valide. Le flux sera invalide si le fichier n'existe pas ou si vous n'êtes pas autorisé à le lire, par exemple. Lorsque le flux n'est pas valide, getline ne lira rien. Sa valeur de retour est le même flux, et lorsqu'il est converti en bool, il est évalué comme false. Vérifiez l'état du flux avant de continuer.

ifstream in("records.txt"); 
if (!in.is_open()) { 
    std::cerr << "Uh-oh.\n"; 
    return EXIT_FAILURE; 
} 
+0

Merci, cela s'est avéré être le problème. – Maulrus

5

vector<string> temp; fait un vide vecteur. Lorsque vous essayez alors de lire dans temp[0], ce comportement n'est pas défini. Vous devez passer comme second argument getline une variable distincte string, disons string foo; avant la boucle, puis temp.push_back(foo); comme première instruction dans le corps de la boucle.

Questions connexes