Rechercher : dans
Par :

Problème fscanf c++

Dernière réponse le 24 fév 2009 à 12:49:57 ptit81, le 23 fév 2009 à 17:10:25 
 Signaler ce message aux modérateurs

Bonjour,

Je souhaite lire un fichier texte pour le réécrire différemment dans un autre fichier texte.
Je crée une en-tête manuellement dans le second fichier (celui où je dois écrire)

Je veux donc commencer à écrire dans ce second fichier juste après ce que j'ai déjà écris.
Pour ça, je me place à la fin du fichier de la façon suivante:

while(!feof(f_F1_inp))
{
fscanf(f_F1_inp,"%s");
}

Ensuite, je rempli mon deuxième fichier texte de la façon suivante:

while(!feof(f_F1_txt))
{
fscanf(f_F1_txt,"%s",s_tmp_F1);
fprintf(f_F1_inp,"%s%s"," ",s_tmp_F1);
}

Tout ça marche très bien...
Le problème, c'est que dans le même main(), je voudrais faire la même chose avec deux autres fichiers qui ont exactement les mêmes formes et qui au lieu de s'appeler "F1" s'appellent "E1". Je fais donc un copier coller de mon code et je change F1 en E1 et il arrive toujours à me faire F1 mais pas E1.
J'essaye donc d'inverser les deux parties de codes et cette fois, il arrive à faire E1 et pas F1...

J'ai réussi un peu à isoler le problème et je trouve qu'il est au niveau du fscanf qui ne veux pas se faire une deuxième fois sur un autre fichier!!!!!!!!!!!!!

Est ce que quelqu'un peut m'éclairer là dessus?


Pour info, je vous met le code complet (c'est peut être plus simple après ces applications:

////////////// matrice F1///////////////

// ouverture du fichier à lire
FILE * f_F1_txt;
f_F1_txt=fopen("mat_F1.txt","r");
rewind(f_F1_txt);

//ouverture du fichier .inp
FILE * f_F1_inp;
f_F1_inp=fopen("F1.inp","r+");
rewind(f_F1_inp);

// je place le curseur à la fin du fichier
while(!feof(f_F1_inp))
{
fscanf(f_F1_inp,"%s");
}

//remplissage
char s_tmp_F1[256];
while(!feof(f_F1_txt))
{
fscanf(f_F1_txt,"%s",s_tmp_F1);
fprintf(f_F1_inp,"%s%s"," ",s_tmp_F1);
}

fclose(f_F1_txt);
fclose(f_F1_inp);


////////////// matrice E1///////////////

// ouverture du fichier à lire
FILE * f_E1_txt;
f_E1_txt=fopen("mat_E1.txt","r");
rewind(f_E1_txt);

//ouverture du fichier .inp
FILE *f_E1_inp;
f_E1_inp=fopen("E1.inp","r+");

rewind(f_E1_inp);
// je place le curseur à la fin du fichier
while(!feof(f_E1_inp))
{
fscanf(f_E1_inp,"%s");
//////////////c'est ici que ça ne marche plus....////////////////////
}

//remplissage
char s_tmp_E1[256];
while(!feof(f_E1_txt))
{
fscanf(f_E1_txt,"%s",s_tmp_E1);
fprintf(f_E1_inp,"%s%s"," ",s_tmp_E1);
}

fclose(f_E1_txt);
fclose(f_E1_inp);

Configuration: Windows XP
Safari 525.19

Meilleures réponses pour « problème fscanf c++ » dans :
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Compiler du C sous Linux/UNIX VoirSous Linux, le compilateur de C est gcc. Il est installé de base sur plusieurs distributions, mais sur Debian (et celles qui en découlent) il faudra l'installer (aptitude install gcc). gcc Syntaxe de GCC gcc Tout d'abord, il faut savoir...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...

1

loupius, le 23 fév 2009 à 19:02:15

Comme personne ne répond, je vais m'y coller; mais il eût été préférable que ce fût fiffy qui s'y connait beaucoup mieux que moi; il t'aurait d'ailleurs conseillé de ne pas utiliser 'scanf' qui a un comportement parfois surprenant mais plutôt une fonction du style 'gets' ou plutôt dans ton cas 'fgets'.
Dans la ligne suivante:
fscanf(f_E1_inp,"%s"); //////////////c'est ici que ça ne marche plus....////////////////////
le compilateur, s'il est bien réglé, doit râler et cela devrait te mettre la puce à l'oreille... il y a bien une chaîne de format avec un %s, mais... rien ne correspond au '%s'.

Répondre à loupius

2

fiddy, le 24 fév 2009 à 00:59:35

Salut,
Effectivement, loupius a mis le doigt sur le problème.

fscanf(f_F1_inp,"%s"); 

Il n'y a pas de chaîne spécifiée correspondant au %s. Du coup, le compilateur va prendre la première variable suivante se trouvant dans la pile. Bref, un comportement "difficile" à prévoir. Ce qui peut conduire à des cas bizarres comme dans ton exemple ;) Pour résoudre cela, il te suffit de spécifier l'argument :
char toto[256]; fscanf(f_F1_inp,"%s",toto); 
.

Sinon, une petite remarque sur ton code. Tu utilises rewind pour remettre l'indicateur de flux en début de fichier. Mais ceci est inutile étant donné que tu utilises le mode r et r+ qui te garantissent déjà que le pointeur de flux sera en début. Lorsque tu souhaites mettre le pointeur de flux en fin de fichier, plutôt que d'utiliser fscanf en boucle, tu peux utiliser :
fseek(fichier,0,SEEK_END);

Ou pourquoi pas utiliser tout simplement le mode "a" de fopen() qui te placera directement le flux en fin de fichier. Ce qui t'évitera d'utiliser ton rewind, et ta boucle while contenant ton fscanf.

Et enfin, comme te l'a dit loupius, attention à l'utilisation de scanf qui est très complexe et peut vite devenir dangereux sans précaution particulière. Imagine par exemple que ton fichier contienne une ligne de plus de 260 caractères. Bug assuré. A la place, tu peux utiliser fgets (et non gets) comme l'a souligné si justement loupius.

Cdlt
Google is your friend

Répondre à fiddy

3

ptit81, le 24 fév 2009 à 08:46:03

Bonjour

Merci beaucoup pour tous vos conseils.

En effet, le compilateur galérait pas mal... Maintenant, c'est très rapide en utilisant fseek(fichier,0,SEEK_END); et le code tourne bien.
Par contre, j'utilise toujours le fscanf pour la partie lecture du fichier car j'ai un problème dans l'utilisation du fgets où je dois spécifier le nombre de terme à garder à chaque fois alors que ce qui me plaisait dans le fscanf, c'était le fait qu'il prenne les termes un par un sans se soucier de leur taille en s'arrêtant quand il y avait un blanc.
Est ce qu'on peut faire la même chose avec le fgets?

Merci d'avance

Répondre à ptit81

4

fiddy, le 24 fév 2009 à 11:59:47

Non, on ne peut pas faire la même chose avec le fgets.
Dans ce cas, spécifie la taille avec le fscanf.
Par exemple :

char buffer[256]; fscanf(fichier,"%255s",buffer);

Cela t'évitera de joli segfault en cas de lignes trop longues dans ton fichier ;)
Google is your friend

Répondre à fiddy

5

 ptit81, le 24 fév 2009 à 12:49:57

Merci beaucoup pour votre aide précieuse à tous les deux.

Cordialement

pitit

Répondre à ptit81
Collection CommentÇaMarche.net