|
|
|
|
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
Configuration: Windows XP Firefox 3.0.1
Bonjour,
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. |
Saliut,
...
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 "Lu et à prouver" Mich |
Apres quelques modification le programme s'est compile ,l'erreur invalid argument of unary* ete due a la chaine de caractere nom
|