Fichier langage c

Résolu
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

6 réponses

  1. 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
    1. 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
      1. 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
        -1
        1. Contributeur
          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)
          -1
          1. Contributeur
            certe mich, tu as raison, mais là le problème viens à la compilation.
            -1
            1. 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