Fichier langage c
Résolu
MRextra
Messages postés
153
Date d'inscription
Statut
Membre
Dernière intervention
-
MRextra Messages postés 153 Date d'inscription Statut Membre Dernière intervention -
MRextra Messages postés 153 Date d'inscription Statut Membre Dernière intervention -
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
A voir également:
- Fichier langage c
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
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
dans
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
= 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)
Pourquoi ne pas faire :
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.
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.
Saliut,
Ce que je ne comprends pas c'est que tu ouvres deux fois pf sans refermer entre deux.
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
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
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)
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
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
#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