Rechercher : dans
Par :

Fichier langage c

Dernière réponse le 31 jui 2008 à 13:27:37 MRextra, le 30 jui 2008 à 15:05:52 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « fichier langage c » dans :
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
Caractéristiques du langage C VoirLe fichier source Le fichier source d'un programme écrit en langage C est un simple fichier texte dont l'extension est par convention .c. Note d'un visiteur (J.Grondin) : L'extension est en minuscules. Le .C (majuscule) est interprété par...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...

1

Mahmah, le 30 jui 2008 à 21:35:20
  • +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.

Répondre à Mahmah

2

MRextra, le 31 jui 2008 à 01:55:33

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

Répondre à MRextra

3

Char Snipeur, le 31 jui 2008 à 09:02:50

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) Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

4

mich62120, le 31 jui 2008 à 10:14:14
  • +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
"Lu et à prouver"    Mich

Répondre à mich62120

5

Char Snipeur, le 31 jui 2008 à 13:13:45

Certe mich, tu as raison, mais là le problème viens à la compilation. Salutation ! avant je croyais, maintenant je suis fixé.Jésus Christ
Char Snipeur

Répondre à Char Snipeur

6

 MRextra, le 31 jui 2008 à 13:27:37

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

Répondre à MRextra
Collection CommentÇaMarche.net