2016-09-01 2 views
4

J'essaie d'écrire un programme où je lis un fichier texte, puis prend chaque ligne dans le fichier texte et les stocke dans un vecteur de chaîne. Je pense que je suis capable d'ouvrir le fichier texte mais j'ai remarqué qu'après avoir ouvert le fichier texte, tout ce qui se passe après ce point ne s'exécute pas. Par exemple, j'ai une déclaration cout à la fin de ma fonction principale qui sort quand j'entre le nom d'un fichier qui n'existe pas. Cependant, si je tape un nom de fichier existe, je n'obtiens aucune sortie de la dernière instruction cout. Quelqu'un sait pourquoi c'est? Merci!Pourquoi mes instructions cout ne s'impriment-elles pas après l'ouverture d'un fichier texte?

int main() { vector<string>line; string fileName = "test.txt"; ifstream myFile(fileName.c_str()); int i = 0; int count = 0; vector<string>lines; cout << "test" << endl; if (myFile.is_open()) { cout << "test2" << endl; while (!myFile.eof()) { getline(myFile, lines[i],'\n'); i++; } myFile.close(); } if (!myFile.is_open()) { cout<< "File not open"<< endl; } myFile.close(); cout << "Test3" <<endl; return 0; }

+4

'lines' est un vecteur vide. 'lines [i]' est invalide pour toute valeur de 'i'. Votre programme se bloque simplement. –

+8

[Pourquoi 'while (! MyFile.eof())' est faux] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – Barmar

+1

Vous écrire hors des limites du vecteur avec 'lignes [i]' –

Répondre

4

Essayez this:

string fileName = "test.txt"; 
ifstream myFile(fileName); // .c_str() not needed - ifstream can take an actual string 
vector<string> lines; 

string line; // temporary variable for std::getline 
while (getline(myFile, line)) { 
    lines.push_back(line); // use push_back to add new elements to the vector 
} 

Comme indiqué dans les commentaires, la raison la plus probable que votre programme semble « fin » est prématurément que ça s'écraser. std::getline prend comme référence un deuxième argument: string. Dans votre code, votre vecteur est vide; par conséquent lines[i] pour tout i renvoie une référence à la mémoire non valide. Lorsque getline essaie d'accéder à cette mémoire, le programme se bloque.

Si vous souhaitez qu'une exception soit levée lorsque vous essayez d'accéder à un index hors limites d'un vector, utilisez lines.at(i) au lieu de lines[i].

2

Vous devez utiliser push_back() car votre vecteur initial est vide et vous ne pouvez pas utiliser d'index sur un vecteur vide. Si vous le faites, cela conduira à un comportement indéfini.

std::ifstream input("filename.ext"); 
std::vector<std::string> lines; 
for(std::string line; getline(input, line);) 
{ 
    lines.push_back(line); 
}