Posez votre question Signaler

Langage C : lire un tableau depuis un fichier [Résolu]

Metabolic - Dernière réponse le 7 déc. 2010 à 00:11
Bonjour,
Je suis étudiant et je travaille sur un petit projet de bataille navale en langage C sur Unix.
J'ai une fonction save, qui écrit dans un fichier les grilles des deux joueurs du jeu en guise de sauvegarde.
Je voudrai maintenant pouvoir les charger et les utiliser dans mon programme pour continuer la partie. Comment faire?
Voici ma fonction save :
#include <stdio.h>
#include <cstdio.h>
void save(Grille A,Grille B,Grille A2,Grille B2){
freopen ("save.txt","w",stdout);
aff_Grille(A,B); //affiche les grilles en paramètre, cote a cote
printf("\n");
aff_Grille(A2,B2);
fclose(stdout);
}
et le type Grille :
#define N 10;
typedef char Grille[N][N];
Merci :)
Lire la suite 

Langage C : lire un tableau depuis un fichier »

15 réponses
Réponse
+0
moins plus
la lecture est en effet un peu plus compliqué compliqué. il faut utiliser fscanf pour lire le fichier.
ton freopen est plutôt malin pour éviter de faire une deuxième fonction d'écriture. Je me pose juste une question, est-ce que close(stdout) restaure le flux sur la sortie standard ?
Pour ta lecture de grille :
FILE* fi=fopen("save.txt","r");
for(j=0;j<2;++j)
for(n=0;n<N;++n)
{
     for(m=0;m<N;++m)
          scanf("%c",&grille[n][m]);
     scanf("\n");
}
fiddy- 2 déc. 2010 à 23:09
Bonjour Char Snipeur,

scanf("%\n") ?
Tu souhaites faire quoi ?
Ensuite, j'imagine que tu voulais mettre fscanf au lieu du scanf ?
Et pourquoi une boucle j<2 ?
Sinon, attention au redirection...
Il n'y a pas de solution portable pour restaurer le flux sur la sortie standard.
Pour réussir, il faut jouer avec dup / dup2 et sauvegarder le descripteur par dup(fileno(stdout));
Bref rien de très joli. Il vaut mieux éviter ce genre de redirection.

Cdlt,
Char Snipeur- 3 déc. 2010 à 08:19
ouai, c'est plein de merde. j'ai oublié le fscanf.
Je voulais juste donner l'algorithme général. La boucle sur "j", c'est car tu as deux grilles. Mais après relecture, il y en a 4 : 2 pour chaque joueur.
Merci de ta réponse sur stdout, ça me semblait trop simple aussi.
Ajouter un commentaire
Réponse
+0
moins plus
Merci pour le code mais tu dis qu'il faut utiliser fscanf et t'as juste utilisé des scanf.
(un oubli sans importance vu qu'ils sont bien placés :) )
Et pr répondre à ta question je pense que oui après le fclose, stdout redevient standard.
Ajouter un commentaire
Réponse
+0
moins plus
Hum sa serait quoi alors si je devais changer aussi mon code pour save?
Un truc genre :

FILE* fi=fopen("save.txt","r");
blabla avec fprintf
fclose(fi)

??
fiddy- 3 déc. 2010 à 14:00
Effectivement, c'est pas clair du tout.
Quand tu postes du code, utilise les balises "code" (à droite du bouton souligné), ça sera beaucoup plus lisible pour nous.
Sinon, tu as mis des fscanf("\n"), ça ne correspond à rien.
Ensuite, ton code est bien trop compliqué...
En une ligne, tu peux faire ta fonction load et open avec fread et fwrite. Pas besoin de faire de boucle etc.

Cdlt,
Metabolic - 3 déc. 2010 à 14:09
ya pas besoin de lire les retours a la ligne? ah ok....mais par contre je vois pas comment en une ligne je peux faire ma fonction load ou save vu que fread est assez compliqué à utiliser et j'ai 4 grilles et 2 structures à charger/sauvegarder.
On a pas encore vraiment étudié les pbs de fichier et mémoire en c donc je comprends pas tout...
Char Snipeur- 3 déc. 2010 à 14:43
fwrite(grilleA,sizeof(grilleA),1,fs); et hop tu écrit une grille, en binaire en plus je crois : donc gain de place.
Ajouter un commentaire
Réponse
+0
moins plus
le probleme avec fscanf est que cette fonction lit mot apres mot
alors que tu conviens avec moi que cela est un peut rude parcontre avec le cas de caractere par caractère tu gere ton contenue comme tu veux
fiddy- 7 déc. 2010 à 00:11
le probleme avec fscanf est que cette fonction lit mot apres mot
Sauf que fscanf n'est pas une fonction qui lit mot à mot. Cela dépend du format passé en argument. Dans nos exemples, on utilisait fscanf(fp,"%c",...) et dans ce cas ça lit caractère par caractère comme ton fgetc... Un petit lien pour voir ce que fait scanf : http://www.linux-france.org/article/man-fr/man3/scanf-3.html

alors que tu conviens avec moi que cela est un peut rude parcontre avec le cas de caractere par caractère tu gere ton contenue comme tu veux
Oui je conviens. Par contre, tu conviendras avec moi qu'un simple fread est encore moins rude que la gestion du caractère par caractère...
Ajouter un commentaire
Réponse
-1
moins plus
je suggère que tu utilise la fonction 'fget(FILE *fi)'.
cette fonction retourne un caractère.
cette fonction te permet de parcourir bien ton fichier et de copier dans ton tableau les caractères dont tu a besoin
exemple tu connais le code asci de tout les chiffres si c'est sa que tu as besoin
alors tu pourras copier tous les chiffres de la maniere qu'il ont été sauvegardé
fiddy- 5 déc. 2010 à 12:18
Ce n'est pas la fonction fget mais fgetc.
Et c'est un peu le même problème que la fonction scanf("%c",...), cela rend le code compliqué car il faut user de boucle for et traduire la "complexité" des structures.
Un simple fread suffit...
Ajouter un commentaire
Ce document intitulé « Langage C : lire un tableau depuis un fichier » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?