Posez votre question Signaler

Fichier langage c [Résolu]

MRextra 157Messages postés 26 décembre 2007Date d'inscription - Dernière réponse le 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
Lire la suite 

Fichier langage c »

6 réponses
Réponse
+1
moins plus
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.
Ajouter un commentaire
Réponse
+1
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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)
Ajouter un commentaire
Réponse
+0
moins plus
certe mich, tu as raison, mais là le problème viens à la compilation.
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Ce document intitulé « fichier langage c » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook