Fichier langage c
Résolu
MRextra
Messages postés
154
Statut
Membre
-
MRextra Messages postés 154 Statut Membre -
MRextra Messages postés 154 Statut Membre -
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
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
Configuration: Windows XP Firefox 3.0.1
6 réponses
-
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
dansstrcpy(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 junsigned 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. -
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
-
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 -
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) -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
certe mich, tu as raison, mais là le problème viens à la compilation.
-
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