Le langage SMS est exclu sur les forums ProgBoards, tout message ne respectant pas la charte sera déplacé, modifié, ou supprimé par nos modérateurs.

Forum Langages » C & Cie. » lecture fichiers en C

Amwus
ProgBoarder
Citer Linux Firefox 2 - Posté le 02/04/2007 à 18:18
Bonjour !

Y a -t- il moyen de lire un fichier caract par caract si je l'ai écrit en utilisant la fonction fprintf ?

Avec fputc, il m'écrit n'importe quoi dans mon fichier alors qu'avec fprintf, ça fonctionne parfaitement bien...

Merci !
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
zuzuf
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 02/04/2007 à 18:59
essaye fgetc, mais attention ce n'est pas la plus rapide des méthodes si le système d'exploitation n'improvise pas sur la lecture du fichier.

pour lire les données d'un fichier tu as principalement:
char fgetc( FILE * )
void fread( void *, int&, int&, FILE* )
char *fgets( char *, int &, FILE*)

fputc écrit n'importe quoi?? Attention fputc ne demande pas un pointeur!
Linux a un noyau, windows un pepin
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 02/04/2007 à 19:13
en fait j'essaie d'enregistrer dans un fichier le contenu d'une matrice que j'ai allouée dynamiquement. Donc avec un double pointeur.
Mais en fait, cette matrice fait partie d'une structure.
Je m'explique :

j'ai une structure disons myStruct, qui contient un double pointeur
int** tab;
J'alloue dans tab un tableau à deux dimensions avec malloc.
Bref, tout ça fonctionne parfaitement bien.

Ce que je veux faire apres, c'est écrire dans mon fichier le contenu de cette matrice.
Donc je fais une boucle et à chaque itération, je veux enregistrer
myStruct->tab[i][j]...

Mais quand je fais ça, j'ai des caractères abracadabrant avec fputc. Mais si j'utilise fprintf, ça fonctionne. Mais je ne suis pas sur que je pourrai récupérer les données carac par carac si j'ai écrit le fichier avec fprintf...

Voila voila, j'espère ne pas être trop compliqué !

Merci !
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
zuzuf
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 02/04/2007 à 22:26
aïe,
ta matrice n'est pas de type char donc tu vas perdre plein de données avec fputc qui n'enregistre qu'un char ( 0 (flèche)255 ), ce qui est illisible ouvert avec un éditeur de texte.

avec fprintf tu enregistre tes entiers écris en chiffres!! Donc pour les lire c'est un peu plus compliqué. Il faut, pour chaque nombre, récupérer ses chiffres ( et seulement ceux-là ), et faire l'opération inverse, convertir le nombre sous forme de chaîne en entier.

Mais je crois que le plus simple serait qqc comme ça pour écrire la matrice:


int tab[w][h];
for( int x = 0 ; x < w ; x++ )
for( int y = 0 ; y < h : y++ )
fwrite( &(tab[x][y]), sizeof( int ), 1, destination );



et comme ça pour la lire:


int tab[w][h];
for( int x = 0 ; x < w ; x++ )
for( int y = 0 ; y < h : y++ )
fread( &(tab[x][y]), sizeof( int ), 1, source );



encore plus simple si elle n'est constituée que d'un bloc de mémoire:


fwrite( tab[0], sizeof( int ) * w * h, 1, fichier );
fread( tab[0], sizeof( int ) * w * h, 1, fichier );



mais dans ces 2 cas ce ne sera pas lisible ouvert avec un éditeur de texte.

Si tu veux pouvoir lire les informations dans un éditeur de texte utilise fprintf et fgets, formate tes données en lignes et sépare les nombres par des virgules par exemple.

fgets te renverra les lignes, que tu analysera nombre par nombre avec la fonction atoi
Linux a un noyau, windows un pepin
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 03/04/2007 à 11:51
arf oui je dois pouvoir les lire avec un éditeur. Et de plus je ne peux pas séparer les élements par une virgule.

Le fichier doit être du type :

5 5 4
00000
00000
00000
00000

Sinon, si j'écrit avec scanf, je suppose que je pourrai extraire chaque ligne avec fscanf ou une fonction de ce genre. Après, strtod il doit y avoir moyen de parser la chaine ainsi obtenue...

Mais je ne sais pas si c'est une bonne méthode !
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
zuzuf
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 03/04/2007 à 12:43
tu sépares les nombres par des espaces ??

Tu pourrais nous détailler un peu la forme sous laquelle les données sont stockées dans le fichier?
Linux a un noyau, windows un pepin
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 03/04/2007 à 12:46
exactement comme je l'ai écrit ci dessus.
La première ligne contient la longueur, la hauteur et l'age, séparés par un espace.
Le reste est le contenu de la matrice, sans aucuns espaces...

Uééééé 500 posts ! jsuis conteent (héhé

Edité par Amwus ( 03/04/2007 12:46:37 )
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
zuzuf
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 03/04/2007 à 18:49
hum, tes nombres ils sont compris entre 0 et 9 inclus ??

parce que si c'est le cas alors ce n'est pas bien dur à lire. Pour chaque nombre tu lit un caractère avec fgetc et tu lui enlève '0', comme ça:


int matrice[w][h];
for( int y = 0 ; y < h ; y++ )
for( int x = 0 ; x < w ; x++ )
matrice[x][y] = fgetc( fichier ) - '0';



et ça passe tout seul... sinon il faut imposer un nombre fixe de chiffres par entier mémorisé et lire ces chiffres pour chaque nombre, ça donnerai ça:


int matrice[w][h];
for( int y = 0 ; y < h ; y++ )
for( int x = 0 ; x < w ; x++ ) {
matrice[x][y] = 0;
for( int c = 0 ; c < chiffres ; c++)
matrice[x][y] = matrice[x][y] * 10 + fgetc( fichier ) - '0';
}



là ça devrait le faire (héhé
Linux a un noyau, windows un pepin
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 03/04/2007 à 19:51
oui mes chiffres sont entre 0 et 9 inclus... je vais essayer ça, mais je ne comprend pas très bien. Pourquoi doit on faire -0 ? Le pire c'est que je l'ai déjà utilisé, mais je ne me souviens plus !

Je peux donc garder ma fonction d'écriture avec fprintf dans ce cas ?
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 03/04/2007 à 20:04
hmm alors encore une question.
Je dois aussi analyser ma première ligne. Donc, je fais d'abord un fgets pour récupérer toute la ligne et je la parserai par la suite.

Comment ensuite me mettre à la bonne position, càd à la ligne et premier caractère, pour commencer à lire la matrice ?
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
Freem
Modérateur
RemonterCiter Windows XP Msie 6 - Posté le 04/04/2007 à 10:48
A priori, tu ne doit lire qu'un caractère sur 2, non? (un ' ', puis un chiffre, puis un '\n' à la fin de la ligne, etc...)
Si tu utilise fgetc pour tout lire, (y compris la 1ère ligne), il te suffit de lire un caratère inutile après chaque caractère utile.
Si jamais tu as besoin d'utiliser des valeurs dépassant 9, tu peut faire un test sur le caractère qui vient d'être lu, histoire de vérifier que c'est un espace.
Si oui, tu incrémente x, et si x>h, x=0;y++; .
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

Poster une réponse

STOP aux fautes volontaires !
Message
Formatage
Note: pour partager du code source, merci d'utiliser le wall !
Smileys (sourire) (yekyek) (clein d'oeil) (désapprouve) (triste) (cool) (langue) (confus) (gêné) (neutre) (eek) (surpris) (diable) (flèche) (exclamation) (question) (diable) (idée) (méchant)
Pseudonyme
Recopiez le code
v6 © Computaid SPRL 2005-2008 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,106 s - Crédits - Stats
1 connecté