Menu

Stockage de valeur dans un tableau a partir d'un fichier [Résolu]

- - Dernière réponse :  Aaa - 19 déc. 2018 à 21:17
bonjour, j'ai un fichier contenant des chiffre de 1 a 9, et deux type de caractere qui sont "." et "*", je dois lire ce fichier et stocker les valeurs dans un tableau de type entiers. j'ai commencer l'ecriture du programme mais quand j'affiche mon tableau je vois qu'il na pas du tout pris les valeurs qui sont dans mon fichier.
quelqu'un pourrait il me dire d'ou vient mon erreur. merci
le SUDOKU est un struct qui est mon tableau d'entiers a deux dimension

SUDOKU lire_fichier (char *nom) {
	SUDOKU S;
	FILE *f= fopen(nom, "r");
	int i,j;
	char c;
	
	for(i=0;i<9;i++){
		for(j=0; j<9; j++){ 
			c=fscanf(f,"%c",&c); 
			if(c=='.'){ 
				S.gl[i][j]=0;
				
			}
			 if(c=='*'){
				c= fscanf(f,"%c",&c);
				 S.gl[i][j]=atoi(&c);
				
			 }
			else { 
				S.gl[i][j]=atoi(&c); 
				
			}
		}
		}			
															
	return S;
}
Afficher la suite 

Votre réponse

1 réponse

Messages postés
4910
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 février 2019
904
0
Merci
Salut aaa,

Si ton
SUDOKU S
est un
struct
, en le déclarant comme variable automatique à l'intérieur de ta fonction, il devient en dehors du scope en sortant de la fonction.

Le plus simple est que la fonction appelante de
lire_fichier()
déclare
SUDOKU S
et qu'elle passe à
lire_fichier()
un pointeur sur celle-ci, afin que ta fonction puisse en modifier le contenu. Ainsi, le contenu modifié sera accessible à la fonction appelante.

Ton prototype deviendrait
void lire_fichier (char *nom, SUDOKU *S);
, tu supprimes ta déclaration en ligne 2 de
SUDOKU S;
et dans ta fonction, tu accèdes aux membres de la
struct
pointée par S avec la notation
->
au lieu du point.

Donc
S->gl[i][j]=0;
au lieu de
S.gl[i][j]=0;
... etc.

Et, bien sûr, tu n'as plus de
return S;
en fin de fonction.

Dal
mais je pourrait pas directemement replacer le
S->gl[i][j]=atoi(&c)
par
S->gl[i][j]= c-'0'
?
[Dal]
Messages postés
4910
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 février 2019
904 -
Mon code ci-dessus est un exemple illustratif, sous la forme d'un programme minimal fonctionnel pour répondre à ta question "est ce que je devrais utiliser le code ascii pour convertir un char en int".

Tu peux le faire directement si tu le veux, c'est à toi de voir et de gérer ton code comme tu l'entends.

Que ce que tu fasses soit un exercice ou une application réelle, tu dois prendre tes responsabilités :-)

Maintenant, si tu as un utilisateur qui met "Z" à la place d'un chiffre dans un fichier, tu vas avoir des valeurs inattendues dans ta
struct
et, dans un programme en production auquel on demande de la robustesse, on devrait faire ce genre de vérifications avant de mettre des choses dans une structure de données que le programme va réputer conformes ...

Cet aspect de ton code ne concerne pas que la conversion du
char
en
int
, mais tout le reste. Par exemple, tu ne vérifies pas que le fichier a été correctement ouvert avec
fopen()
, ni que
fscanf()
n''a pas produit d'erreurs ... cela réduit évidemment le niveau de robustesse et de fiabilité de ce que tu écris.
Je sais pas comment faire pour vérifier si j’ai bien ouvert mon fichier
[Dal]
Messages postés
4910
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 février 2019
904 -
Tu ne peux pas l'inventer, tu dois consulter la documentation de cette fonction de la bibliothèque standard en utilisant une source de référence.

Par exemple :

http://www.cplusplus.com/reference/cstdio/fopen/
ou https://en.cppreference.com/w/c/io/fopen

Je cite (tiré du 1er lien) :

Return Value
If the file is successfully opened, the function returns a pointer to a FILE object that can be used to identify the stream on future operations.
Otherwise, a null pointer is returned.
On most library implementations, the errno variable is also set to a system-specific error code on failure.


Sous Linux, tu as les pages de manuel auxquelles tu accèdes en tapant
man 3 fopen
(dans la section 3 des pages de manuel donnant accès aux documentations des bibliothèques, ici, la bibliotèque standard du C), ou juste
man fopen
(car il n'y a normalement pas d'homonymie avec d'autres types de pages de manuel sous Linux avec fopen .. ce n'est pas le cas de printf, par exemple, qui est sous Linux aussi une commande shell documentée dans la section 1 et où tu dois taper
man 3 printf
sur le terminal pour obtenir la bonne page de manuel).

Tu les retrouves aussi en ligne :

http://man7.org/linux/man-pages/man3/fopen.3.html
D’accord et merci pour ton aide.
Commenter la réponse de [Dal]