#1 Le 10/10/2008, à 20:47
- lebossejames
sauvegarde/lecture d'un tableau dans un fichier texte en C
Bonjour,
je débute en C, je voulais savoir si c'est possible de sauvegarder un tableau et de l'ouvrir afin de le réutiliser dans un fichier texte?
merci.
Hors ligne
#2 Le 10/10/2008, à 20:53
- slasher_fun
Re : sauvegarde/lecture d'un tableau dans un fichier texte en C
Toutafé Regarde du côté des fonctions fopen, fprintf, fputs, fscanf, fgets
Hors ligne
#3 Le 10/10/2008, à 21:07
- tiky
Re : sauvegarde/lecture d'un tableau dans un fichier texte en C
Du moment que le tableau contient des entiers, floats, des caractères ou des chaînes de caractères, c'est facile à réaliser. Après s'il contient des pointeurs ou des structures, c'est beaucoup moins simple avec un fichier texte.
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#4 Le 11/10/2008, à 17:53
- lebossejames
Re : sauvegarde/lecture d'un tableau dans un fichier texte en C
j'arrive à lire une chaine de caractère dans un fichier mais je n'arrive pas pour un tableau à 2 dimensions.
Hors ligne
#5 Le 12/10/2008, à 22:28
- lebossejames
Re : sauvegarde/lecture d'un tableau dans un fichier texte en C
j'ai à moitié réussi mais ne prend pas tout le tableau.
Hors ligne
#6 Le 13/10/2008, à 01:09
- tiky
Re : sauvegarde/lecture d'un tableau dans un fichier texte en C
Voilà un exemple de code. On choisit un séparateur, par exemple pour un nombre, l'espace convient tout à fait. On utilise ensuite le saut de ligne pour séparer chaque ligne du tableau. Enfin le fichier doit se terminer par un saut de ligne pour spécifier la fin du tableau ( tout les caractères suivants seront ignorés ).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROWS 5
#define COLS 3
int read_table( FILE * fp, int * tab, int rows, int cols, char sep )
{
char c;
int z=0, y=0, x=0;
char buffer[11];
memset( buffer, 0, 11 );
while( ( c = getc( fp ) ) != EOF )
{
if( c >= 0x30 && c <= 0x39 )
{
if( z < 11 )
{
buffer[z] = c;
z++;
}
else
return -1;
}
else if( c == sep || c == '\n' )
{
if( z > 0 )
{
if( y >= cols )
return -1;
*( tab + x*cols + y ) = atoi( buffer );
memset( buffer, 0, 11 );
z=0;
y++;
}
}
else
return -1;
if( c == '\n' )
{
if( y < cols )
return -1;
y=0;
x++;
if( x == rows )
break;
}
}
return 0;
}
int main( void )
{
FILE * fp = NULL;
fp = fopen( "./in", "r" );
if( fp != NULL )
{
int tab[ROWS][COLS];
int rc = read_table( fp, (int *)tab, ROWS, COLS, ' ' );
if( rc == 0 )
{
int x, y;
for( x=0; x < 5; x++ )
{
for( y=0; y < 3; y++ )
printf( "%10i ", tab[x][y] );
printf( "\n" );
}
}
fclose( fp );
}
return 0;
}
La position d'un caractère ( ici un chiffre ) est déterminée par trois coordonnées.
y: la position du nombre dans la ligne
x: le numéro de la ligne
z: la position du chiffre dans le nombre ( pour le buffer )
le tableau buffer contient le nombre entrain d'être lu. Ce n'est pas une chaîne de caractère C mais comme tout ses octets sont initialisés à 0, il se comporte comme tel.
3 cas se présentent lors de la lecture d'un caractère:
- Il s'agit d'un chiffre, on le place dans le buffer et on augmente z de 1. On veille à ce que le buffer ne soit pas dépassé ( le buffer et de 11 caractères, 10 chiffres + le caractère de \0 ).
- Il s'agit d'un séparateur ( ici un blanc ou un espace ). Si des données sont contenues dans le buffer, on l'écrit dans le tableau à la position [x][y]. On nettoie le buffer. On vérifie également avant qu'on n'a pas dépassé le nombre de colonne.
- Il s'agit ni d'un séparateur, ni d'un nombre. Le tableau est invalide.
Lorsqu'on arrive a un saut de ligne, on doit vérifier qu'on a atteint le nombre de colonne et qu'on est pas arrivé à la fin du tableau.
Exemple de tableau à mettre dans un fichier:
123 203 182
283 382 102
1920 29289 182982
192 34 23
10101 2947 12
Attention: Il faut pas oublier le saut de ligne à la fin du fichier, sinon le dernier nombre ne sera pas enregistré dans le tableau.
Le code gère de façon très simple les erreurs, il faut évidemment améliorer ça. Autre amélioration, on pourrait fournir les dimensions du tableau dans le fichier
Dernière modification par tiky (Le 13/10/2008, à 01:57)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne