Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1434 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1787901
sliders_al​pha
Posté le 17-09-2008 à 07:01:08  profilanswer
 

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
mood
Publicité
Posté le 17-09-2008 à 07:01:08  profilanswer
 

n°1787913
Tarabiscot​e
Posté le 17-09-2008 à 08:38:56  profilanswer
 

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
n°1788388
sliders_al​pha
Posté le 17-09-2008 à 20:34:30  profilanswer
 

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
n°1788955
sliders_al​pha
Posté le 18-09-2008 à 23:36:12  profilanswer
 

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
n°1788987
Trap D
Posté le 19-09-2008 à 07:34:02  profilanswer
 

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
n°1788993
Taz
bisounours-codeur
Posté le 19-09-2008 à 08:32:07  profilanswer
 

man ungetc

n°1789289
Tarabiscot​e
Posté le 19-09-2008 à 13:11:42  profilanswer
 

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.

n°1789531
sliders_al​pha
Posté le 19-09-2008 à 18:46:13  profilanswer
 

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?

n°1789819
Trap D
Posté le 20-09-2008 à 17:55:40  profilanswer
 

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

n°1789916
Sve@r
Posté le 20-09-2008 à 21:31:16  profilanswer
 

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.
mood
Publicité
Posté le 20-09-2008 à 21:31:16  profilanswer
 

n°1789930
Trap D
Posté le 20-09-2008 à 22:46:58  profilanswer
 

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.

n°1789933
Tarabiscot​e
Posté le 20-09-2008 à 23:09:40  profilanswer
 

Ç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.

n°1789934
sliders_al​pha
Posté le 20-09-2008 à 23:44:58  profilanswer
 

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é

n°1789951
Tarabiscot​e
Posté le 21-09-2008 à 08:41:36  profilanswer
 

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]

n°1791670
Sve@r
Posté le 25-09-2008 à 06:32:45  profilanswer
 

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.
n°1792076
sliders_al​pha
Posté le 25-09-2008 à 18:36:36  profilanswer
 

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

n°1792085
Joel F
Real men use unique_ptr
Posté le 25-09-2008 à 19:11:16  profilanswer
 

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

n°1792105
sliders_al​pha
Posté le 25-09-2008 à 20:23:13  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Conversion fichier .sql 3.23 vers 5.0 (mysql)Utiliser json_decode() en PHP 4
script bat pour effacer sous repertoire, sauf certainCréer des tableaux, les enregistrer dans un fichier HTML et le chargé
capturer le texte sélectionné dans n'importe quelle applifichier bat qui ne marche pas
Isoler un texte avec du regex^pComment comparer des chaines de caractère avec une tolérance...
Batch pour effacer des sous-repertoiresImport Access fichier 'txt' à modifier via macro ...
Plus de sujets relatifs à : lire un fichier texte caractere par caractere et effacer la lettre lu


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR