OVH Cloud OVH Cloud

Lire et écrire

13 réponses
Avatar
rico34
Connaissez vous un site qui proposent des exemples de lecture et écriture
dans un fichier
- texte
- typé.

Autrement, j'ai récupéré du code et j'ai une erreur sur la première ligne
quand je compile.
#include fstream.h
C:\Dev-Cpp\include\c++\3.4.2\backward\fstream.h:31, from
D:\EcritureFichier.cpp

Excusez moi pour cette question un peu simpliste, mais je débute en C++.
Si la question est trop simpliste, indiquez moi un forum où je pourrai la
poser.

Merci pour les réponses.

10 réponses

1 2
Avatar
Loïc Joly
Connaissez vous un site qui proposent des exemples de lecture et écriture
dans un fichier
- texte
- typé.
Je ne sais pas ce que tu entends par ce mot...


A part ça, je n'ai pas vraiment de bonne référence à filer... Non pas
que ça ne soit pas utilisé, mais ce genre de chose se trouve plus dans
des livres que dans des sites web.

A partir du moment où tu sais lire depuis un clavier avecv cin, écrire
sur l'écran avec cout, tu sais déjà presque faire la même chose dans un
fichier. Un petit exemple complet d'un code qui compte le nombre
d'occurence d'un mot dans un texte (avec une définition de mot qui est
un peu simpliste, puisque "toto" et "toto;" sont considérés comme
différents).

#include <map>
#include <fstream>
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
ifstream is("c:/temp/cyrano.txt");
string mot;
map<string, int> compteMots;
while (is >> mot)
{
compteMots[mot]++;
}
for(map<string, int>::iterator it = compteMots.begin() ;
it != compteMots.end();
++it)
{
cout << setw(20) << it->first << 't' << it->second << endl;
}
cin.ignore( numeric_limits<streamsize>::max(), 'n' );
}






Autrement, j'ai récupéré du code et j'ai une erreur sur la première ligne
quand je compile.
#include fstream.h


#include <fstream.h>

Mais en fait, c'est un vieux header en train de disparaitre de nombraux
compilateurs, auquel il faut préférer le standard :
#include <fstream>

J'ai bien peur que tu aies récupéré du code qui va te faire plus de mal
que de bien.


C:Dev-Cppincludec++3.4.2backwardfstream.h:31, from
D:EcritureFichier.cpp

Excusez moi pour cette question un peu simpliste, mais je débute en C++.
Si la question est trop simpliste, indiquez moi un forum où je pourrai la
poser.


Tous les niveaux sont bienvenus ici, tant que les questions parlent du C++.

--
Loïc

Avatar
rico34
"Loïc Joly" a écrit dans le message de
news: 43efb3db$0$165$
Connaissez vous un site qui proposent des exemples de lecture et écriture
dans un fichier
- texte
- typé.
Je ne sais pas ce que tu entends par ce mot...


fichier typé correspond à un fichier de structure qui ne sera pas codé en

clair dans le fichier.

A part ça, je n'ai pas vraiment de bonne référence à filer... Non pas que
ça ne soit pas utilisé, mais ce genre de chose se trouve plus dans des
livres que dans des sites web.

A partir du moment où tu sais lire depuis un clavier avecv cin, écrire sur
l'écran avec cout, tu sais déjà presque faire la même chose dans un
fichier. Un petit exemple complet d'un code qui compte le nombre
d'occurence d'un mot dans un texte (avec une définition de mot qui est un
peu simpliste, puisque "toto" et "toto;" sont considérés comme
différents).

#include <map>
#include <fstream>
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
ifstream is("c:/temp/cyrano.txt");
string mot;
map<string, int> compteMots;
while (is >> mot)
{
compteMots[mot]++;
}
for(map<string, int>::iterator it = compteMots.begin() ;
it != compteMots.end();
++it)
{
cout << setw(20) << it->first << 't' << it->second << endl;
}
cin.ignore( numeric_limits<streamsize>::max(), 'n' ); }

Autrement, j'ai récupéré du code et j'ai une erreur sur la première ligne
quand je compile.
#include fstream.h


#include <fstream.h>

Mais en fait, c'est un vieux header en train de disparaitre de nombraux
compilateurs, auquel il faut préférer le standard :
#include <fstream>

J'ai bien peur que tu aies récupéré du code qui va te faire plus de mal
que de bien.



Je pense que tu as complètement raison. J'ai d'autres erreurs du même style.


C:Dev-Cppincludec++3.4.2backwardfstream.h:31, from
D:EcritureFichier.cpp

Excusez moi pour cette question un peu simpliste, mais je débute en C++.
Si la question est trop simpliste, indiquez moi un forum où je pourrai la
poser.


Tous les niveaux sont bienvenus ici, tant que les questions parlent du
C++.
--
Loïc


En tout cas, merci.


Avatar
Marc Boyer
Le 12-02-2006, rico34 a écrit :
Connaissez vous un site qui proposent des exemples de lecture et écriture
dans un fichier
- texte


Un fichier texte est un flux comme les autres ;-)
Les mots clefs sont ofstream et ifstream, et Google
te donnera plein d'exemples.
- typé.


Fichier typé, ce sont des souvenirs de Pascal ça, non ?

En C++, on parlerait plutôt de sérialisation. Le problème
est simple dans les cas simples, et assez complexe dans les
cas généraux.

La cas simple, c'est lire et écrire un fichier qui contient
un seul type de donnée, sans pointeurs, les lectures et
écritures étant toujours fait sur la même machine par le
même programme.

Après, si on veut pouvoir écrire le fichier sur une
machine petit-boutien avec un code compilé avec VC++,
les lire sur une machine grand-boutien le code étant
compilé avec g++, en gérant le polymorphisme et les
pointeurs, c'est moins simple.

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain

Avatar
kanze
rico34 wrote:
"Loïc Joly" a écrit dans le messag e de
news: 43efb3db$0$165$
Connaissez vous un site qui proposent des exemples de
lecture et écriture dans un fichier
- texte
- typé.
Je ne sais pas ce que tu entends par ce mot...



fichier typé correspond à un fichier de structure qui ne sera
pas codé en clair dans le fichier.


Comme un fichier de configuration, ou quelque chose du genre ?
Ce qu'il te faut alors, c'est un parseur. Plus ou moins
complexe, selon la structure en question -- sans savoir plus sur
la structure, c'est difficile à en dire plus.

Si la structure est basée sur les lignes, très souvent, on lit
le fichier avec std::getline, puis traite chaque ligne,
éventuellement au moyen de std::istringstream, mais boost::regex
est aussi très utile à cet égard.

Ce qui, je crains, ne fait que te donner d'autres sujets de
questions. Pour commencer, essayer d'apprendre les iostream.
(C'est trop pour être couvert par la réponse à une question
simple, ici -- il vaut mieux un livre.) Et aussi des expressions
rationnelles ou regulières. Avec ces deux outils seulement, on
peut déjà faire pas mal de choses.

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



Avatar
rico34
"Marc Boyer" a écrit dans le message
de news:
Connaissez vous un site qui proposent des exemples de lecture et écriture
dans un fichier
- texte


Un fichier texte est un flux comme les autres ;-)
Les mots clefs sont ofstream et ifstream, et Google
te donnera plein d'exemples.
- typé.


Fichier typé, ce sont des souvenirs de Pascal ça, non ?

Et oui


En C++, on parlerait plutôt de sérialisation. Le problème
est simple dans les cas simples, et assez complexe dans les
cas généraux.

La cas simple, c'est lire et écrire un fichier qui contient
un seul type de donnée, sans pointeurs, les lectures et
écritures étant toujours fait sur la même machine par le
même programme.

Après, si on veut pouvoir écrire le fichier sur une
machine petit-boutien avec un code compilé avec VC++,
les lire sur une machine grand-boutien le code étant
compilé avec g++, en gérant le polymorphisme et les
pointeurs, c'est moins simple.

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain


Type tpersonne = struct
Num : entier;
Nom : cc;
Fin structure
var f : fichier de tpersonne;

J'essai de réaliser en c++ quelque chose de simple: lecture et ecriture dans
un
- fichier texte
- fichier avec structure.

Je recherche juste un site avec quelques exemples dans les deux cas.


Avatar
Marc Boyer
Le 13-02-2006, rico34 a écrit :
"Marc Boyer" a écrit dans le message
de news:
Connaissez vous un site qui proposent des exemples de lecture et écriture
dans un fichier
- texte


Un fichier texte est un flux comme les autres ;-)
Les mots clefs sont ofstream et ifstream, et Google
te donnera plein d'exemples.
- typé.


Fichier typé, ce sont des souvenirs de Pascal ça, non ?

Et oui



Bon, donc, je comprends au moins ce que tu veux.

En C++, on parlerait plutôt de sérialisation. Le problème
est simple dans les cas simples, et assez complexe dans les
cas généraux.

La cas simple, c'est lire et écrire un fichier qui contient
un seul type de donnée, sans pointeurs, les lectures et
écritures étant toujours fait sur la même machine par le
même programme.

Après, si on veut pouvoir écrire le fichier sur une
machine petit-boutien avec un code compilé avec VC++,
les lire sur une machine grand-boutien le code étant
compilé avec g++, en gérant le polymorphisme et les
pointeurs, c'est moins simple.

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain


Type tpersonne = struct
Num : entier;
Nom : cc;
Fin structure
var f : fichier de tpersonne;

J'essai de réaliser en c++ quelque chose de simple: lecture et ecriture dans
un
- fichier texte
- fichier avec structure.

Je recherche juste un site avec quelques exemples dans les deux cas.


J'ose pas trop de poster du code parce que, primo, là, j'ai du mal à
tester, et secundo, je réalise à quel point ma pratique est bien loin de
ma connaissance théorique.

Je me permets juste de t'indiquer des points théoriques:
- le "fichier texte", c'est surement le mieux en ce qui concerne la
portabilité, la maintenabilité, et c'est juste un peu plus gros.
Il te faut définir un format de stockage. Dans ton cas,
une Personne par ligne, le numéro en décimal d'abord un espace puis
le nom.

Ecrire, c'est facile.

class Personne {
int num;
std::string nom;
virtual void print(std::ostream& out){
out<<num<<' '<<name<<endl;
}
void read(std::istream& in);
};

La lecture, c'est plus dur. On peut vite faire une version naïve.

void read(std::istream& in);{
in>>num;
char space;
in>>space;
getline(in,nom);
}
Mais elle ne gère pas les cas d'erreur. On peut aussi discuter sur
le fait d'en faire un constructeur. Et puis si on fait de l'héritage,
l'écriture reste simple, mais la lecture nettement moins.

Après, ouvir un fichier en lecture ou écriture, un coup de Google
avec ifstream et ofstream te dira tout.

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain



Avatar
Luc Hermitte
"kanze" wrote in
news::

rico34 wrote:
"Loïc Joly" a écrit dans le
message de news: 43efb3db$0$165$
Connaissez vous un site qui proposent des exemples de
lecture et écriture dans un fichier
- texte
- typé.
Je ne sais pas ce que tu entends par ce mot...



fichier typé correspond à un fichier de structure qui ne sera pas
codé en clair dans le fichier.


Comme un fichier de configuration, ou quelque chose du genre ?


Je pense plutôt aux vieux trucs que je faisais en Pascal (il y avait
toujours un chapitre sur les fichiers typés et autres fichiers à accès
direct), Basic, ...

Bref, tu prends un POD à taille fixe et sans pointeur au milieu (les
chaines sont dans des tableaux statiques dimensionnés à tout jamais), et
tu conclues tes écritures/lectures à coup de std::write +
reinterpret_cast. Si tu es initié, tu gères l'endianess.
Bref, des fichiers typés avec possibilité d'accès direct suivant comment
tu gères d'éventuelles zones de type en-tête qui servent à stucturer.

J'ai comme un doute que cela se fasse encore beaucoup.

--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>




Avatar
Luc Hermitte
Luc Hermitte wrote in
news::

Bref, tu prends un POD à taille fixe et sans pointeur au milieu (les
chaines sont dans des tableaux statiques dimensionnés à tout jamais), et
tu conclues tes écritures/lectures à coup de std::write +


:s/std::write/std::fstream::write/
évidemment.

reinterpret_cast.
--

Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>

Avatar
kanze
Luc Hermitte wrote:
"kanze" wrote in
news::

rico34 wrote:
"Loïc Joly" a écrit dans le
message de news: 43efb3db$0$165$
Connaissez vous un site qui proposent des exemples de
lecture et écriture dans un fichier
- texte
- typé.
Je ne sais pas ce que tu entends par ce mot...



fichier typé correspond à un fichier de structure qui ne
sera pas codé en clair dans le fichier.


Comme un fichier de configuration, ou quelque chose du genre ?


Je pense plutôt aux vieux trucs que je faisais en Pascal (il y
avait toujours un chapitre sur les fichiers typés et autres
fichiers à accès direct), Basic, ...


Attention. La chose en C++, la plus proche au type FILE de
Pascal, c'est std::deque, je crois. Voire l'adaptateur
std::queue. Ce n'est pas ce qu'on entend par un fichier en C++.
(Au moins en Pascal standard. Il y a tellement eu de dialects de
Pascal, alors rien m'étonnerait dans un dialect donné.)

Aussi, on se trouve aujourd'hui en 2005, non 1975. Notre
compréhension des entrées/sorties et de ce que c'est qu'un
« fichier » a évolué. En 1975, on travaillait sur une machine ;
le code qui lisait un fichier était toujours le même code que
celui qui l'a écrit. Pour ne faire que ça en C++, il suffit de
istream::read et de ostream::write, et quelques coups de
reinterpret_cast. Seulement, est-ce bien réaliste de ne faire
que ça aujourd'hui ? Aujourd'hui, je dirais qu'on s'est rendu
compte qu'au minimum, il faut s'assurer pouvoir lire les données
à l'avenir. Après une mise à jour du hardware, par exemple.

Le résultat, c'est qu'à part les fichiers temporaires (qui sont
devenus rares suite à la mémoire virtuelle), on s'est rendu
compte qu'il faut définir un format, et écrire et lire ce
format ; on ne se contente plus des formats « aléatoires » qui
correspondent simplement aux bits tels qu'ils se trouvent dans
la mémoire du processeur.

Bref, tu prends un POD à taille fixe et sans pointeur au
milieu (les chaines sont dans des tableaux statiques
dimensionnés à tout jamais), et tu conclues tes
écritures/lectures à coup de std::write + reinterpret_cast.


Et tu n'est plus capable de lire les données après une mise à
jour du compilateur.

Si tu es initié, tu gères l'endianess.


C'est le pic de l'iceberg. Et encore. Pour un entier de quatre
octets, 24 ordres sont possibles. J'en ai déjà rencontrait
trois. Et j'ai eu l'ordre qui a changé d'une version du
compilateur à la prochaine.

Pour les flottants (double, float), je connais au moins deux
formats répandus -- IEEE et IBM.

Et tout ça, sans parler des exotiques -- des machines à mot de
36 bits, des bytes de 9 bits, et une représentation en
complément à un. (Et oui, il en existe un qui est encore
fabriqué.)

Bref, des fichiers typés avec possibilité d'accès direct
suivant comment tu gères d'éventuelles zones de type en-tête
qui servent à stucturer.

J'ai comme un doute que cela se fasse encore beaucoup.


Celà se fait beaucoup.

Dans des protocols des couches basses de transmission, par
exemple : IP, TCP et UDP sont tous des protocols binaires.
(Beaucoup de protocols des couches hautes, genre SMTP, NNTP et
HTTP, utilisent Internet ASCII, qui est orienté ligne. Et qui,
malgré son nom, accepte UTF-8 ou d'autres, selon le contexte --
HTTP permet même du binaire dans le corps du message.

Il y a aussi des formats de fichier binaire, pour les
graphiques, le son, et même le texte mis en page. Mais là aussi,
il y a également du texte : Postscript est texte, PDF binaire,
par exemple.

Pour les accès aléatoire, dans tout sauf les cas les plus
triviaux, il est plus simple à utiliser une base de données, qui
optimise les accès et assure en plus l'intégrité
transactionnelle. (ProgreSQL et mySQL sont tout les deux open
source; ProgreSQL permet même une utilisation commerciale sans
license.)

Ce qui se fait assez rarement, je crois, c'est d'écrire ou de
lire son propre format ; on a prèsque toujours à faire avec un
format existant. L'époque des programmes qui travaillent dans
une vide est révolus (mais il y a sans doute des exceptions).

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





Avatar
kanze
rico34 wrote:
"Marc Boyer" a écrit dans le mes sage
de news:

Type tpersonne
Num : entier;
Nom : cc;
Fin structure
var f : fichier de tpersonne;


Ce n'est pas du Pascal. En Pascal, je pourrais écrire :

type
tpersonne = record
entier : integer ;
cc : array 20 of char ;
end ;
tfile = file of tpersonne ;

var
f : tfile ;

L'équivalent en C++ serait :

struct tpersonne
{
int entier ;
std::string cc ;
} ;
typedef std::queue< tpersonne > tfile ;

tfile f ;

Au moins en ce qui concerne le Pascal standard.

Mais j'ai plutôt l'impression que tu veux un fichier aux
enrégistrements à longueur fixe, de façon à pouvoir aller
directement au nième enrégistrement. Pour ce faire, le plus
simple en C++, c'est de définir la structure de
l'enrégistrement, l'écrire dans une chaîne au moyen de
ostringstream, de rembourrer la chaîne à la longueur voulue, et
de l'écrire avec ostream::write( chaine.data(), chaine.size() ).
Pour lire, on fait l'inverse, ce qui est un peu plus compliqué,
parce qu'on ne peut pas lire directement dans un std::string ;
il faut passer par un std::vector<char> :

std::vector< char > record( tailleDeRecord ) ;
in.read( &record[ 0 ], record.size() ) ;
std::istringstream parser(
std::string( record.begin(), record.end() ) ) ;
// ...

Note bien que si tu veux faire des seek à des positions
arbitraire, il faut ouvrir le fichier en mode binaire, même s'il
ne contient que du texte.

Si les enrégistrements ne contiennent pas autrement de 'n', on
pourrait en mettre un systèmatiquement à la fin de chaque
enrégistrement, et les lire avec getline directement dans un
std::string.

J'essai de réaliser en c++ quelque chose de simple: lecture et
ecriture dans un

- fichier texte


Un fichier texte ne doit pas poser des problèmes, non ? Tu
définis un ifstream ou un ofstream -- ensuite, tu l'utilises
comme n'importe quel flux, comme std::cin ou std::cout, par
exemple.

- fichier avec structure.


Là, il faut commencer par définir la structure. Une struct C++
ne définit pas une structure de fichier externe.

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

1 2