Comment se déplacer sur une ligne dans un fichier ifstream?
2 réponses
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?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Falk Tannhäuser
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
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.
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
Kubiak62 wrote in message news:<406bf1e3$0$5595$...
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
Kubiak62 <kubiak62@free.fr> wrote in message
news:<406bf1e3$0$5595$626a14ce@news.free.fr>...
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:kanze@gabi-soft.fr
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
Kubiak62 wrote in message news:<406bf1e3$0$5595$...
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