web-dev-qa-db-fra.com

En C++, existe-t-il un moyen de passer à une ligne spécifique dans un fichier texte?

Si j'ouvre un fichier texte à l'aide de fstream, existe-t-il un moyen simple de passer à une ligne spécifique, telle que la ligne 8?

20
Jim

Boucle ton chemin là-bas.

#include <fstream>
#include <limits>

std::fstream& GotoLine(std::fstream& file, unsigned int num){
    file.seekg(std::ios::beg);
    for(int i=0; i < num - 1; ++i){
        file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    }
    return file;
}

Définit le pointeur de recherche de file au début de la ligne num.

Tester un fichier avec le contenu suivant:

1
2
3
4
5
6
7
8
9
10

Testprogram:

int main(){
    using namespace std;
    fstream file("bla.txt");

    GotoLine(file, 8);

    string line8;
    file >> line8;

    cout << line8;
    cin.get();
    return 0;
}

Sortie: 8

34
Xeo

Si chaque ligne a la même longueur, vous pouvez utiliser istream :: seekg () pour aller à l'emplacement et lire à partir de là.

6

Voici un exemple pratique et pratique avec std::getline() si les lignes ont la même longueur:

#include <iostream>
#include <fstream>
#include <string>

const int LINE = 4;

int main() {
std::ifstream f("FILE.txt");
std::string s;

for (int i = 1; i <= LINE; i++)
        std::getline(f, s);

std::cout << s;
return 0;
}
3
Teodor Ciuraru

En général, no, vous devez utiliser une stratégie semblable à celle que Xeo montre .

Si, comme netrom dit vous savez que les lignes ont une longueur fixe, yes.

Et même si les longueurs de lignes ne sont pas connues à l’avance, mais (1) vous allez vouloir sauter beaucoup de choses et (2) vous pouvez être certain que personne ne manipule votre fichier entre-temps, vous pourriez en créer un. passer pour former un index, et l'utiliser par la suite.

0
dmckee