Stockage de valeur dans un tableau a partir d'un fichier

Résolu/Fermé
aaa - 19 déc. 2018 à 15:43
 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;
}
A voir également:

1 réponse

[Dal] Messages postés 6203 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 29 janvier 2025 1 099
Modifié le 19 déc. 2018 à 16:00
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
0
[Dal] Messages postés 6203 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 29 janvier 2025 1 099
Modifié le 19 déc. 2018 à 16:03
Je n'ai vraiment regardé le reste de ton code, mais pour convertir un
char
en
int
, tu ne peux pas utiliser
atoi()
, qui sert à convertir des chaînes C, et non pas un
char
.

http://www.cplusplus.com/reference/cstdlib/atoi/
0
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=='.'){ //case de travaille vide
				S->gl[i][j]=0;
				S->type[i][j]=1;
			}
			 if(c=='*'){ //case de travaille non vide
				fscanf(f,"%c",&c);
				S->gl[i][j]=atoi(&c);
				 S->type[i][j]=2;
			 }
			else { 
				S->gl[i][j]=atoi(&c); // case depart
				S->type[i][j]=0;
			}
		}
		}
				
												
					

}



quand j'essaye avec le pointeur le compilation ne se fait plus et j'ai un message d'erreur qui est " warning control reaches end of non-void function".
pour le atoi, est ce que je devrais utiliser le code ascii pour convertir un char en int?
0
[Dal] Messages postés 6203 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 29 janvier 2025 1 099
19 déc. 2018 à 16:22
C'est un warning, et non pas une erreur de compilation. Il se manifeste car tu as oublié de modifier ton prototype avec un retour en
void
, comme je te disais de le faire.

Pour convertir un char (qui est un type entier), tu peux utiliser la façon suivante puisque le C requiert que les codes entiers correspondant aux char représentant '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' soient des entiers consécutifs.

#include <stdio.h>

int main(void) {
    char c = '5';
    int i = c - '0';
    printf("c has code %d, and i is %d\n", c, i);
 
    return 0;
}

donne sur ma machine

$ ./a.out 
c has code 53, and i is 5
$

ma machine, comme la tienne probablement (53 étant le code ASCII de '5')

Dal
0
mais je pourrait pas directemement replacer le
S->gl[i][j]=atoi(&c)
par
S->gl[i][j]= c-'0'
?
0
[Dal] Messages postés 6203 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 29 janvier 2025 1 099
Modifié le 19 déc. 2018 à 17:31
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.
0