lire un fichier texte caractere par caractere et effacer la lettre lu

lire un fichier texte caractere par caractere et effacer la lettre lu - C - Programmation

Marsh Posté le 17-09-2008 à 07:01:08    

plop,  
alors voila, je veux faire ce qu'il y a dans le titre, noter que par effacer je veux dire, remplacer par un autre caractere, j'ai penser a ça :
 

Code :
  1. void main(){
  2. long size = -1;
  3. char cara;
  4. FILE*pFile;
  5. pFile = fopen("teste.txt", "r+" );
  6. cara = getcara();
  7. blablabla
  8. cara = getcara();
  9. blablabla
  10. cara = getcara();
  11. blablabla
  12. cara = getcara();
  13. blablabla
  14. fclose(pFile);
  15. }
  16. char getcara(void){
  17. char carac
  18. cara=getc(pFile);                         //lis le caractere et fait avancer le curseur d'un cran
  19. fseek ( pFile , size , SEEK_CUR );    //recule le curseur d'un cran
  20. fputs ( "0" , pFile );                      //ecrit un 0 et avance le curseur d'un cran
  21. return carac;
  22. }


 
imaginon que j'applique ce programme sur un fichier texte qui contient "abcdefgh" ce que je voudrais c'est avoir a la fin "0000efgh" et que la valeur de cara soit passé a "a" puis "b" puis "c" puis "d".
 
mais a la place, j'ai bien "0000efgh" mais la valeur de cara a fait : "a", "b", "b", "b"
 
je ne comprend pas comment les deux dernier b on pu etre lu vu que le b avait été effacer, des idée? un erreur evidente ? un autre code a proposer?
 
merci
 
ps, est-il possible de faire un tableau de chaine? du genre, chaine[0]="blabla", chaine[1]="lol", etc?


Message édité par sliders_alpha le 17-09-2008 à 07:02:59
Reply

Marsh Posté le 17-09-2008 à 07:01:08   

Reply

Marsh Posté le 17-09-2008 à 08:38:56    

Dans "getcara" tu retourne "carac" qui est une variable locale non initialisée alors que tu affectes la valeur lue lors du "cara=getc(pFile);" à la variable "cara" (qui n'est d'ailleurs pas déclarée ou alors en variable globale quelque pars).
Sinon essaye de poster du code qui compile la prochaine fois.
 
PS: oui, il possible de faire un tableau de chaînes : char* chaine[N];
 
PS2: pour écrire un caractère il y a fputc plutôt que fputs, sinon avec getc/fgetc il renvoie un int pas un char et il faut tester que ce ne soit pas EOF.


Message édité par Tarabiscote le 17-09-2008 à 08:48:30
Reply

Marsh Posté le 17-09-2008 à 20:34:30    

oui, j'ai retaper ce code de tete, plutot que de copier le bout de mon programme, dans le programme, j'ai utiliser des pointeur pour pouvoir faire sortir les variable de getcara()
 
le but etait en fait de rechercher 10 url associé a un lien apellé reply dans une page html, puis de stocker ces 10 url dans un fichier texte.
 
mon problemme etait que je fermais la page html a chaque stokcage dans l'autre fichier texte (et donc, je perdais la position du curseur et a la prochaine ouverture j'allais encore lire le meme url, d'ou le besoin d'effacer ce qui avait ete lu)
 
mais maintenant, que je sais faire un tableau de chaine, aucun problemme, je stocke les 10 chaine, je ferme le fichier et j'ouvre le fichier de stockage pour ensuite y stocker les 10 chaine.
 
si je veux faire un sous programme dont un parametre est mon tableau de chaine, il faut que je le definisse comme ça?
 
void(type para1, type para2, char **tabchaine);
 
####edit
 
si je declare mon tableau de chaine ainsi : char* chaine[N];  (N est le nombre de chaine, je supose)
comment est ce que je definit la taille des chaine?


Message édité par sliders_alpha le 18-09-2008 à 17:23:40
Reply

Marsh Posté le 18-09-2008 à 23:36:12    

j'ai encore besoin d'aide^^
 
alors voila, je veux creer des dossier (et j'y arrive)
par exemple, je fourni ça a mon programme :
 

Code :
  1. 31
  2. res/669157.html
  3. res/670137.html
  4. res/671065.html
  5. res/670916.html
  6. res/85882968.html
  7. res/85883348.html
  8. res/85880009.html
  9. res/85885122.html
  10. res/85876095.html
  11. res/85877510.html
  12. res/85884950.html
  13. res/85881064.html
  14. res/85884372.html
  15. res/85882112.html
  16. res/85885639.html
  17. res/85885249.html
  18. res/85884979.html
  19. res/85880267.html
  20. res/85874468.html
  21. res/85884745.html
  22. res/85885696.html
  23. res/85874353.html
  24. res/85884299.html
  25. res/85880652.html
  26. res/85885711.html
  27. res/85885369.html
  28. res/85885023.html
  29. res/85885614.html
  30. res/85885735.html
  31. res/85880748.html
  32. res/85884269.html


 
et mon programme me fait 31 dossier avec leur nom.
 
mais moi je veux placer tous ces dossier dans un autre dossier appelé "download" je veux donc rajouter "Download\\" a ma chaine qui contient le nom de dossier, je rajoute donc la ligne :
 

Code :
  1. strcat(mainfolder ,chaine);

a mon programme, mainfolder contient "Download\\" et chaine contient le nom de dossier
 
le programme ce lance, compteur se charge a 31, on recupere la premiere chaine, on concatene les deux chaine, et BAM! counter = 908096356
 
why?
 
programme :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <windows.h>
  5. void main()
  6. {
  7. int NbUrl, counter;
  8. char chaine[20];
  9. char mainfolder[] = "Download\\";
  10.     FILE*pBDL;
  11. pBDL = fopen("BoardDlUrl.txt","r" );
  12. fscanf(pBDL, "%d", &NbUrl);
  13. printf ("Nombre d'url presente = %d\nCreation des dossiers\n", NbUrl);
  14. counter = NbUrl;
  15.     while(counter != 0)
  16.  {
  17.  fscanf(pBDL, "%s", chaine);
  18.  printf("creation de %s counter = %d\n",chaine, counter);
  19.  chaine[3] = ' ';   /*************************************************efface le caractere interdit********/
  20.  strcat(mainfolder ,chaine);    /******BAM :/ */
  21.  CreateDirectory(mainfolder,NULL); 
  22.  sleep(500);
  23.  counter--;
  24.  }
  25. printf("dossier créer, fermeture du fichier\n" );
  26.     fclose(pBDL);
  27. }


 
pourquoi le fait de contatener deux chaine modifie telle une varialbe qui n'est meme pas ecrit dans cette ligne?


Message édité par sliders_alpha le 18-09-2008 à 23:53:51
Reply

Marsh Posté le 19-09-2008 à 07:34:02    

Parceque mainfolder est un tableau qui a la taille juste suffisante pour contenir la chaine "Download\\" et que tu concatènes dans le décor avec des conséquences pour le moins imprévisibles.
Si tu es sous Windows déclare  
char mainfolder[MAX_PATH] !

Message cité 1 fois
Message édité par Trap D le 19-09-2008 à 07:35:51
Reply

Marsh Posté le 19-09-2008 à 08:32:07    

man ungetc

Reply

Marsh Posté le 19-09-2008 à 13:11:42    

man ungetc :

Citation :

Notice though, that this only affects the next reading operation on that character, not the content of the physical file associated with the stream, which is not modified by any calls to this function.


 
Je ne pense pas que ce soit ce qu'il veut.

Reply

Marsh Posté le 19-09-2008 à 18:46:13    

en effet, il ma fallut plus d'un heure d'essais avant de remarquer ça, de plus il y avait une erreur d'algorythme, car au premier passage ça faisait ce que je voulais :  
 
Download\\res/669157.html
 
mais au deuxiemme, j'oubliait d'effacer l'ancien bout URL et j'avais
 
Download\\res 669157.htmlres 670137.html et ainsi de suite
 
 

Citation :

char mainfolder[MAX_PATH]


 
pourquoi?

Reply

Marsh Posté le 20-09-2008 à 17:55:40    

Pour réserver une taille assez grande pour les noms de fichiers. MAX_PATH est défini aux alentours de 250 caractères.

Reply

Marsh Posté le 20-09-2008 à 21:31:16    

Trap D a écrit :

Parceque mainfolder est un tableau qui a la taille juste suffisante pour contenir la chaine "Download\\" et que tu concatènes dans le décor avec des conséquences pour le moins imprévisibles.
Si tu es sous Windows déclare  
char mainfolder[MAX_PATH] !


Et si t'es sous Linux, tu peux utiliser MAX_PATh_LEn et ne pas oublier l'espace pour le '\0' => "char mainfolder[MAX_PATH_LEN + 1]"
 

sliders_alpha a écrit :


Citation :

char mainfolder[MAX_PATH]


pourquoi?


Parce que cette macro définie (si je me souviens bien) dans "limits.h" définit la taille maximale d'un nom de fichier. Donc si tu dois stocker un nom de fichier et que tu utilises un buffer pour ça, ben en taillant ton buffer à la taille maximale d'un nom t'es certain de pouvoir y stocker n'importe quel nom...


Message édité par Sve@r le 20-09-2008 à 21:33:53

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 20-09-2008 à 21:31:16   

Reply

Marsh Posté le 20-09-2008 à 22:46:58    

Quelqu'un a-t-il déjà essayé de faire une arbo qui ferai plus de 256 caractères ?
Moi j'en ai jamais eu le courage ni l'occasion.

Reply

Marsh Posté le 20-09-2008 à 23:09:40    

Ça m'est déjà arrivé, mais après faut faire du win32, je ne crois pas que ce soit possible de le gérer en c standard.

Reply

Marsh Posté le 20-09-2008 à 23:44:58    

oki, merci de vos conseil.
je vien de decouvrir que je pouvais ouvrir plusieur fichier en meme temps (apparament jusqu'a 30) ça simplifie grandement mon programme (je suis plus obliger de surveiller la position du curseur, la stocker pour ensuite me replacer).
 
par contre je n'ai jamais reussi de faire de tableau de chaine
 
int counter=0;
char *StringTab[10];
 
blablabla;
 
strcpy(Stingtab[counter], UneChaineQuiContientUnTruc);
 
n'a jamais marché

Reply

Marsh Posté le 21-09-2008 à 08:41:36    

Soit tu alloues ta chaine avant avec malloc et tu la stockes dans ton tableau.
Soit tu continues avec [MAX_PATH] en mettant : char StringTab[10][MAX_PATH]

Reply

Marsh Posté le 25-09-2008 à 06:32:45    

sliders_alpha a écrit :

par contre je n'ai jamais reussi de faire de tableau de chaine
 
int counter=0;
char *StringTab[10];
 
strcpy(Stingtab[counter], UneChaineQuiContientUnTruc);
 
n'a jamais marché


Ben peut-être parce que ce que tu nous écrit ne correspond pas à un tableau de chaines mais un tableau de 10 pointeurs "char étoile" et que, comme le dit Tarabiscote, un pointeur ne peut contenir de la data que s'il a été alloué (généralement avec malloc)...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 25-09-2008 à 18:36:36    

huuum, je crois avoir compris, vais esseyer.
 
dites, sur les µC on a un "watchdog" c'est un compteur qui reboot le µC quand il arrive en fin de cylcle, du coup on met des reninitialisation dans le prog et si jamais le prog reste coincé dans une boucle, redemarrage.
 
parfois mon programme reste bloqué et je n'arrive pas a savoir pourquoi (c'est aleatoire, et faudrait faire des centaine de millier de pas avant d'avoir l'erreur) si un truc pouvais me permetre de rebooter le programme lorsqu'il se bloque ça serait bien, ça existe en C?
 
merci

Reply

Marsh Posté le 25-09-2008 à 19:11:16    

ouai mais bon si il bloque c'ets qu'il y a une erreur hein. Faudrait mieux voir à la corriger [:dawa]

Reply

Marsh Posté le 25-09-2008 à 20:23:13    

je vien de trouver le problemme, il semblerais que parfois la page n'arrive pas entierement, et lui il est censer trouver 10 url dans la page, mais etant donnée qu'elle n'est pas complete, ben il bloque......
 
 
j'ai bien esseyer de recuperer le numero d'erreur de la fonction gethttpurl pour savoir si la page arrive bien ou pas, mais  
 
intvar = GetLastError();
 
me donne toujours le code "telechargement reussi"
 
huuuuum, damnnit


Message édité par sliders_alpha le 25-09-2008 à 20:39:38
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed