Comment se déplacer sur une ligne dans un fichier ifstream?

Le
Kubiak62
Bonjour à tous,

Mon problème est très simple, cependant, je n'arrive pas à le résoudre.

En C++, j'utilise des objets de type ofstream et ifstream afin de lire
et écrire dans des fichiers (de type texte).

L'enregistrement fonctionne parfaitement, je sépare mes données en
passant à la ligne (ofstream fichier << endl;).

Toutefois, lorsque je désire récupérer les données (avec un ifstream),
je ne trouve pas de focntion permettant de passer à la lignbe suivante
dans le fichier.

En effet, la fonction seekp(,) permet changer de position dans le
fichier mais en jouant sur des octets (et non des lignes).

Existe-t-il une fonction qui pourrait résoudre mon problème?

Merci d'avance
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Falk Tannhäuser
Le #710894
Kubiak62 wrote:
En C++, j'utilise des objets de type ofstream et ifstream afin de lire
et écrire dans des fichiers (de type texte).

L'enregistrement fonctionne parfaitement, je sépare mes données en
passant à la ligne (ofstream fichier << endl;).
Petite remarque au passage : 'endl' va non seulement insérer un

caractère 'n' mais aussi appeler 'flush' afin de vider la mémoire
tampon du stream, chose rarement nécessaire (sauf s'il s'agit
par exemple d'un fichier de 'log' dans une appli susceptible de
planter inopinément) mais qui va potentiellement dégrader les
performances. Normalement, "fichier << 'n'" suffit.

Toutefois, lorsque je désire récupérer les données (avec un ifstream),
je ne trouve pas de focntion permettant de passer à la lignbe suivante
dans le fichier.

En effet, la fonction seekp(...,...) permet changer de position dans le
fichier mais en jouant sur des octets (et non des lignes).

Existe-t-il une fonction qui pourrait résoudre mon problème?


Peut-être
input_file.ignore(std::numeric_limits<int>::max(), 'n');
afin d'extraire (et jeter) les caractères à partir de la position
courante jusqu'à la prochaine fin de ligne ?

Sinon, il y a la solution
std::string line;
while(std::getline(input_file, line)) // lire le fichier ligne par ligne
{
std::istringstream input_line(line);
// ... extraire les données de 'input_line', par exemple :
int foo;
double bar;
input_line >> foo >> bar;
// ... traitement des erreurs si nécessaire
}
qui permet de gérer plus facilement les éventuelles erreurs de formatage
dans le fichier d'entrée.

Falk

kanze
Le #715300
Kubiak62 news:
Mon problème est très simple, cependant, je n'arrive pas à le
résoudre.

En C++, j'utilise des objets de type ofstream et ifstream afin de lire
et écrire dans des fichiers (de type texte).

L'enregistrement fonctionne parfaitement, je sépare mes données en
passant à la ligne (ofstream fichier << endl;).

Toutefois, lorsque je désire récupérer les données (avec un ifstream),
je ne trouve pas de focntion permettant de passer à la lignbe suivante
dans le fichier.

En effet, la fonction seekp(...,...) permet changer de position dans
le fichier mais en jouant sur des octets (et non des lignes).

Existe-t-il une fonction qui pourrait résoudre mon problème?


La solution la plus habituelle consiste à lire le fichier ligne par
ligne, au moyen de getline. Sinon, il y a toujours istream::ignore.

Note que les fichiers C++ n'ont pas vraiment la notion d'enrégistrement,
auquel on peut accéder de façon aléatoire. La convention habituelle,
c'est bien d'utiliser les lignes, mais ça suppose une lecture sérielle,
parce qu'on ne peut pas savoir d'office, sans lire, où se termine un
enrégistrement.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Publicité
Poster une réponse
Anonyme