web-dev-qa-db-fra.com

C++ vector :: _ M_range_check Erreur?

Voici ma fonction:

void loadfromfile(string fn, vector<string>& file){
    int x = 0;
    ifstream text(fn.c_str());
    while(text.good()){
        getline(text, file.at(x));
        x++;
    }
    //cout << fn << endl;
}    

La valeur de fn que je transmets est simplement le nom d'un fichier texte ('10a.txt'). La valeur du fichier que je transmets est déclarée comme suit:

vector<string> file1;

La raison pour laquelle je n'ai pas défini de taille, c'est parce que je ne pensais pas avoir à utiliser de vecteurs, ils sont dynamiques ... n'est-ce pas?

Cette fonction est supposée lire un fichier texte donné et stocker le contenu complet de chaque ligne dans une seule cellule vectorielle.

Ex. Stocker le contenu de la première ligne dans file.at (0) Stocker le contenu de la deuxième ligne dans file.at (1) Et ainsi de suite, jusqu'à ce qu'il n'y ait plus de lignes dans le fichier texte.

L'erreur:

se termine après avoir lancé une instance de 'std :: out_of_range' what (): vector :: _ M_range_check

Je pensais que la vérification dans la boucle while devrait empêcher cette erreur!

Merci d'avance pour votre aide.

9
Mark S.

le vecteur file est vide, file.at(x) lève une exception hors limites. Vous avez besoin de std :: vector :: Push_back ici:

std::string line;
while(std::getline(text, line))
{
    file.Push_back(line);
}

Ou vous pouvez simplement construire un vecteur de chaîne à partir d'un fichier:

std::vector<std::string> lines((std::istream_iterator<std::string>(fn.c_str())),
                                std::istream_iterator<std::string>());
3
billz

file.at(x) accède à l'élément à la xième position, mais cela doit exister, il n'est pas créé automatiquement s'il n'est pas présent. Pour ajouter des éléments à votre vecteur, vous devez utiliser Push_back ou insert. Par exemple:

file.Push_back(std::string()); // add a new blank string
getline(text, file.back());    // get line and store it in the last element of the vector
0
ChronoTrigger