Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
problème avec getc
Envoyé par: didou2

salut

je débute en prog et j'ai besoin de votre aide

j'ai fait un prog qui prend un fichier,le lit octet par octet avec getc,fait des modif,et met le resultat dans un autre fichier

sauf que le fichier final ne contient tout les octets: il s' arréte à environ 60 ko.

j'imagine que c'est une histoire de buffer trop petit mais j'ai pas trouvé de moyen d' arranger ça.

si qq'un peut m'aider ...


Poste le Saturday 14 May 2005 19:45:30
Répondre     Citer    
Re: problème avec getc
Envoyé par: madko

montre nous ton code sinon on pourra pas faire grand chose

Poste le Sunday 15 May 2005 16:17:04
Répondre     Citer    
Re: problème avec getc
Envoyé par: didou2

par exemple
ce prog là ne marche pas:


#include <stdio.h>
int main()
{
char c;
char *path;
char *path1;
char *path2;
char tmp[60];
int k,i=54,j=96470;

scanf("%s",tmp);
path=tmp;
scanf("%s",tmp);
path1=tmp;
FILE *f=fopen(path,"r");
FILE *g=fopen(path1,"w");

while (j>0)
{
if (i>0)
{
i--;
c=getc(f);
putc(c,g);
}
else
{
c=getc(f);
k=c;
if (k%2==0)
putc(c+1,g);
else
putc(c,g);
}
j--;
}
fclose(f);
fclose(g);
}



j'ai tout mis;je sais pas trop ce qui peut être utile.

Poste le Sunday 15 May 2005 22:47:03
Répondre     Citer    
Re: problème avec getc
Envoyé par: Eric92

Citation
didou2
scanf("%s",tmp);
path=tmp;
scanf("%s",tmp);
path1=tmp;
FILE *f=fopen(path,"r");
FILE *g=fopen(path1,"w");
Il me semble que le 2ème scanf écrase le résultat du premier dans tmp, donc
path et path1 auraient le même contenu, donc même fichier ouvert 2 fois ?

Ce serait plus prudent de déclarer ainsi :
char path[257];
char path1[257];
+ Apparemment path2 ne sert pas.

Poste le Monday 16 May 2005 03:37:34
Répondre     Citer    
Re: problème avec getc
Envoyé par: abgech

Il y a beaucoup d'erreurs dans ton code.
1) En premier, le plus important:
Citation

char *path;
char *path1;
char *path2;
char tmp[60];
int k,i=54,j=96470;

scanf("%s",tmp);
path=tmp;
scanf("%s",tmp);
path1=tmp;
Tu fais un scanf dans tmp, ok. Par contre path = tmp, va prendre l'adresse de tmp (le nom d'un tableau en C est un pointeur sur le premier élément de ce tableau) et mettre cette adresse dans path. path pointe maintenant sur tmp. Et, ensuite, tu recommence avec path1, qui va alors pointer également sur tmp.
Au final, tu te retrouve avec path et path1 pointant tous les deux sur tmp, qui contient le dernier nom de fichier que tu as lu.

2) Tu utilises beaucoup trop de variables intermédiaire. C'est typique de quelqu'un qui n'a pas pensé à son algorithme avant de commencer à programmer. On ne repétera jamais assez que le premier travail de programmation consiste à empoigner une feuille de papier, un crayon et une gomme.

3) Tu ne gère pas les conditions de fin de fichier du fichier d'entrée.

4) Il n'a jamais été dit que les commentaires étaient inutiles !

Je te propose ma version de ton programme. Attention, je n'ai pas regardé la logique de ton programme (la sémantique), je me suis juste attaché à corriger la syntaxe.
Citation

#include <stdio.h>~
int main()~
{~
int c;~
char fname_inp[256]; // NOM DE FICHIER INPUT~
char fname_out[256]; // NOM DE FICHIER OUTPUT~
int i=54,~
j=96470;~
FILE *f_inp, // FICHIER INPUT~
*f_out; // FICHIER OUTPUT~
~
/* OUVERTURE DES FICHIERS */~
scanf("%s",fname_inp); // LECTURE NOM FICHIER INPUT (ATT.: OVERFLOW POSSIBLE)
f_inp = fopen(fname_inp,"r"); // OUVERTURE FICHIER INPUT~
scanf("%s",fname_out); // LECTURE NOM FICHIER OUTPUT (ATT.: OVERFLOW POSSIBLE
f_out = fopen(fname_out,"w"); // OUVERTURE FICHIER OUTPUT~
~
/* BOUCLE PRINCIPALE */~
while (--j > 0)~
if (--i > 0)~
{if (putc(getc(f_inp),f_out) == EOF)~
break;~
}~
else {if ( (c = getc(f_inp)) == EOF)~
break;~
if (!(c%2))~
putc(c+1,f_out);~
else putc(c,f_out);~
}~
~
/* FERMETURE DES FICHIERS */~
fclose(f_inp);~
fclose(f_out);~
}~

Malheureusement l'indentation de mon programme a disparu en le copiant dans le bloc.
Y-a-t-il, sous Lea, un type de bloc permettant de conserver l'indentation (qui est un moyen important, d'accroitre la lisibilité des programmes.


..................
Parce qu'il avait une clôture à utiliser, l'homme invente la propriété privée. --- F. Cavanna

Poste le Monday 16 May 2005 07:56:06
Répondre     Citer    
Re: problème avec getc
Envoyé par: abgech

Une dernière remarque, les ~ en fin de ligne du programme, proviennent de mon éditeur, ils symbolisent la fin de ligne (le return). Le copier/coller les a évidemment conservés et j'ai oublié de les enlever avec de poster. Pour reprendre le programme, il faut les enlever. Si l'on pouvait éditer les posts, ce serait déjà fait ...

..................
Parce qu'il avait une clôture à utiliser, l'homme invente la propriété privée. --- F. Cavanna

Poste le Monday 16 May 2005 07:58:53
Répondre     Citer    
Re: problème avec getc
Envoyé par: madko

il manque la gestion au cas ou le fopen foire smiling smiley

et ouai si yavait un truc special pour coller du code en gardant l'indentation (genre <pre>) ça serait cool

Poste le Monday 16 May 2005 13:45:20
Répondre     Citer    
Re: problème avec getc
Envoyé par: didou2

Citation
Eric92
Il me semble que le 2ème scanf écrase le résultat du premier dans tmp, donc
path et path1 auraient le même contenu, donc même fichier ouvert 2 fois ?

Citation
abgech
Au final, tu te retrouve avec path et path1 pointant tous les deux sur tmp, qui contient le dernier nom de fichier que tu as lu.

en fait,j'ai copié un brouillon de départ et j'ai pas trop vérifié:-))
effectivement,

scanf("%s",tmp);
path=tmp;
FILE *f=fopen(path,"r");
scanf("%s",tmp);
path1=tmp;
FILE *g=fopen(path1,"w");

est mieux ,je pense.

mais,le problème est que j'ai bien un fichier final qui contient bien mes 96470 octets ;
sauf qu'à partir de quelques ko, y'a plus que des 0xFF au lieu des octets modifiés du doc de départ et c'est ça que je pige pas :-(

Poste le Monday 16 May 2005 23:37:09
Répondre     Citer    
Re: problème avec getc
Envoyé par: madko

jsuis pas sur que ça soit mieux, il est clair que tu ecrase encore tes données.

si path à la meme adresse que tmp, et que tu ressaisi une autre chaine a la meme adresse et que path1 vaut cette adresse alors path = tmp = path1

soit tu utilise strncpy pour copier la valeur de temps, soit tu passe direct par scanf

char path1[60];
char path2[60];

scanf("%s",path1);
scanf("%s",path2);

et le top quand tu ne maitrise pas trop ce que tu fais, tu fais du printf pour verifier

fprintf(stdout,"%s %s\n",path1,path2); et la tu vois qu'ils sont different

j'aime bien tester comme ça

parce que je pense que si tu ecris et lis dans le meme fichier que tu modifies en plus, ba ça peut pas marcher

Poste le Tuesday 17 May 2005 00:10:26
Répondre     Citer    
Re: problème avec getc
Envoyé par: didou2

ouaismais...
j'écrase les données dans path aprés avoir ouvert le fichier en lecture donc c'est pas grave ,
une fois le fichier ouvert, path ne lui sert plus,je pense,non?

et je pense pas non plus qu'il m'aurait laissé ouvrir le meme fichier en lecture et en ecriture?

or,j'ai bien un fichier final au chemin indiqué dans path1,
sauf qu'il est pas comme je veux.

Poste le Tuesday 17 May 2005 14:40:43
Répondre     Citer    
Re: problème avec getc
Envoyé par: madko

ah ouai exact désolé, c'est le coup des variables temporaires qui m'ont enduit tout plein d'erreurs
elles servent a rien pourquoi s'embeter avec?

redonne voir ton programme

ah et les valeurs de i et j correspondent a quoi?

Poste le Tuesday 17 May 2005 15:44:13
Répondre     Citer    
Re: problème avec getc
Envoyé par: didou2

ben mon prog ,il est en haut
y'a qu'a remonter " FILE *f=fopen(path,"r"); " de 2 lignes vers le haut.

i=taille en octets de l'entete du document (image bitmap),sur laquelle on fait rien (sinon c'est plus un bitmap).

j=taille totale du doc(on l'a dans l'entete mais je savais pas comment l'extraire programmationnellement).

sinon je peux mettre le prog que je voulais faire, auquel je suis arrivé sans régler ce problème là.
mais il fait une centaine de lignes.

Poste le Tuesday 17 May 2005 18:10:57
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
problème avec getc
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons