Fichier langage c

Résolu/Fermé
MRextra Messages postés 153 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 23 février 2009 - 30 juil. 2008 à 15:05
MRextra Messages postés 153 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 23 février 2009 - 31 juil. 2008 à 13:27
Bonjour,
j'ai écris un programme en C qui lit un fichier pdf.txt qui contient un livre et devant chaque chapitre du livre il a le caractere '*' ,ce programmme ouvre un nouveau fichier ,recopie le fichier empl1.txt ,recopie un chapitre du livre ensuite recopie le fichier expl2.txt , Donc mettre chaque chapitre dans un fichier
mais lors de la compilation j 'ai l'erreur suivant : invalid argument of unary * (la ligne est soulignée dans ci dessus)




/* Entrées: - fichier expl1 et expl2 qui contiennent la page html
-fichier "pdf.txt" qui contient le livre passé comme entrée à l'application "projet1" et Chaque chapitre est separé par une etoile


*/


#include<stdio.h>
#include<stdlib.h>



int main()
{
FILE *pf1,*pf2,*pf3;
FILE * pf;
int i=0,j;
char nom[17],mot[17]="livre",c,x,k,l[2];

//printf("donner le nombre de chapitres n ");
//scanf(" %d ",&n);
printf("donner le numero du livre j ");
scanf(" %d ",&j);
//printf("donner le mot clé");
//scanf(" %s ",mot);

strcpy(nom,"livre");
k=dtoa(j);
strcpy(l,k);
strcat(l,"\0");
strcat(nom,l);
strcat(nom,"chap\0");

/*ouvrir le fichier pdf*/

pf1=fopen("pdf.txt","rt");
if (pf1=NULL) return 0;
/*ouvrir le fichier exemple html1*/
pf2=fopen("expl1.txt","rt");
if (pf2=NULL) return 0;
/*ouvrir le fichier exemple html2*/
pf3=fopen("expl2.txt","rt");
if (pf3=NULL) return 0;
pf=fopen(nom,"wt");

while(1)
{ i++;

/*ouvrir le fichier livreJchapI.txt*/
k=dtoa(i);
strcpy(l,k);
strcat(l,"\0");

strcat(nom,l);
strcat(nom,".html\0");


pf=fopen(nom,"wt");
if (pf=NULL) return 0;


/*copier expl1.html dans le fichier*/
c=getc(pf2);
while (c!=EOF)
{
putc(c,pf);
c=getc(pf2);
}

/*copier le chapitre à partir de pdf.txt*/

x=getc(pf1);
while (x!=EOF && x!="*")
{
putc(x,pf);
getc(pf1);
}

/*copier expl1.html dans le fichier*/

c=getc(pf3);
while (c!=EOF)
{
putc(c,pf);
c=getc(pf3);
}

/*PASSER AU CHAPITRE SUIVANT*/
fclose(pf);

/*MAJ de la variable nom*/
strcpy(nom,"\0");
strcpy(nom,"livre");

k=dtoa(j);
strcpy(l,k);
strcat(l,"\0");
strcat(nom,l);
strcat(nom,"chap\0");


if(x==EOF) break;
}

fclose(pf1);
fclose(pf2);
fclose(pf3);

return 0;
}






help please
A voir également:

6 réponses

Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
30 juil. 2008 à 21:35
Bonjour,

Pour ma part, je n'obtiens pas l'erreur décrite en compilant ton code, est-ce bien la première erreur donnée ?

Ceci dit j'en ai d'autres :
Il manque par exemple l'inclusion de <string.h> pour les fonction strXXX

dans
strcpy(nom,"livre");
k=dtoa(j);
strcpy(l,k);
strcat(l,"\0");
strcat(nom,l);
strcat(nom,"chap\0");


k=dtoa(j); : j est un int, dtoa sert à transformer un double en caractère. (voir itoa)
strcpy(l,k); : strcpy veut deux char*, k est un char
strcat(l,"\0"); : strcat doit écrire "\0" à partir du premier \0 rencontré dans L, or il n'y en a pas.
Et la notation "tralala" contient huit caractères, le tralala + un \0, de même "\0" contient \0 + un \0

'\0' est le caractère et "\0" est une chaîne terminée par \0 qui contient ici le caractère \0 (donc doublon)
La ligne peut-être remplacée par l[1] = '\0';

'a' fait 1 caractère. (type : char)
"a" fait 2 caractères avec le \0 implicite. (type : char *)

idem pour "chap\0", celui-ci incluera un double \0 final.


sprintf( nom, "livre%dChap", j ); peut remplacer les lignes précédentes.

Pour s'assurer de la validité du j on peut :
Déclarer j en tant que unsigned int
Faire le scanf( "%u" &j ); correspondant.
Tester la valeur de retour du scanf pour s'assurer que l'utilisateur a bien saisi une valeur qui satisfait j
unsigned int j;

while ( scanf( "%u", &j ) != 1 )
	; // rien ou printf( "Valeur incorrecte, saisissez encore.\n" );




pf1=fopen("pdf.txt","rt");
if (pf1=NULL)   //    /!\/!\/!\
	return 0;

= est une affectation, pf1 prend la valeur NULL, puis l'opération d'affectation renvoie la valeur écrite dans la variable, qui est NULL, celle-ci est considérée comme la condition du if, comme NULL vaut souvent zéro, la condition sera évaluée à faux et le return sera fait. L'opérateur d'égalité est ==


Un dernier petit point (avant d'aller manger :D)
while(1)
{ i++;
....
	if(x==EOF)
		break;
} 

Pourquoi ne pas faire :
x = 'Z'
while( x != EOF )
{
	i++;
	....
} 


heum... pardon, étant un peu à la bourre je n'ai pas eu le temps d'y mettre de la dentelle, ça fait un peu liste de remarques mais le principal est de comprendre, n'hésite pas à reposer des questions si je me suis mal expliqué.

M.
1
mich62120 Messages postés 631 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 21 janvier 2010 6
31 juil. 2008 à 10:14
Saliut,

Ce que je ne comprends pas c'est que tu ouvres deux fois pf sans refermer entre deux.
...
pf=fopen(nom,"wt");

while(1)
{ i++;

/*ouvrir le fichier livreJchapI.txt*/
k=dtoa(i);
strcpy(l,k);
strcat(l,"\0");

strcat(nom,l);
strcat(nom,".html\0");


pf=fopen(nom,"wt");
if (pf=NULL) return 0;
...



Ce n'est peu être pas une erreur je ne sais pas si c'est possible.


Sinon essaye de mettre "livre.txt" parce que le nom est "livre" -->strcpy(nom,"livre");
Sans l'extension ce n'est peu être pas considéré comme un nom pointant vers un fichier donc l'argument est invalide.

Mich
1
MRextra Messages postés 153 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 23 février 2009 35
31 juil. 2008 à 01:55
Merci Mahmah pour m'avoir repondu et pour m'aider à optimiser mon programme
En ce qui concerne l'erreur invalid argument of unary* , c'est la seule erreur que j'ai avec des warnings
j'ai compilé avec devc++ sous windows et avec gcc sous linux et j'obtient la meme erreur
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
31 juil. 2008 à 09:02
si l'erreur est bien celle que tu dit à la ligne que tu dit, c'est étrange...
Donne la ligne exacte que tuilise pour compiler ainsi que la transcription exacte du message (un copier coller de la console serait l'idéal)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
31 juil. 2008 à 13:13
certe mich, tu as raison, mais là le problème viens à la compilation.
0
MRextra Messages postés 153 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 23 février 2009 35
31 juil. 2008 à 13:27
apres quelques modification le programme s'est compile ,l'erreur invalid argument of unary* ete due a la chaine de caractere nom

#include<stdio.h>
#include<stdlib.h>


int main()
{
FILE *pf1,*pf2,*pf3;
FILE * pf;
int i=0;
char nom[17],c,x='0',j,k[1];

printf("donner le numero du livre j \0");
/*scanf(" %c ",&j); */
gets(k);
j=k[0];

/*ouvrir le fichier pdf*/

pf1=fopen("pdf.txt","rt");
if (pf1==NULL) return 0;
/*ouvrir le fichier exemple html1*/
pf2=fopen("expl1.txt","rt");
if (pf2==NULL) return 0;;
/*ouvrir le fichier exemple html2*/
pf3=fopen("expl2.txt","rt");
if (pf3==NULL) return 0;

while(1)
{ i++;

sprintf(nom,"livre%cchap%d.html",j,i);

pf=fopen(nom,"wt");
if (pf==NULL) return 0;

/*copier expl1.html dans le fichier*/

c=getc(pf2);

while (c!=EOF)
{
putc(c,pf);
c=getc(pf2);
}

/*copier le chapitre à partir de pdf.txt*/

x=getc(pf1);

while (x!=EOF && x!='*')
{

putc(x,pf);
x=getc(pf1);
}

/*copier expl1.html dans le fichier*/

c=getc(pf3);
while (c!=EOF)
{
putc(c,pf);
c=getc(pf3);
}

/*PASSER AU CHAPITRE SUIVANT*/
printf(" %s terminé \0",nom);
fclose(pf);
rewind(pf2);
rewind(pf3);

if(x==EOF) break;
}

fclose(pf1);
fclose(pf2);
fclose(pf3);
return 0;
}


je vous remercie de votre aide
0