Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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é smile Regarde du côté des fonctions fopen, fprintf, fputs, fscanf, fgets smile

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 wink

Dernière modification par tiky (Le 13/10/2008, à 01:57)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne