lire un fichier texte caractere par caractere et effacer la lettre lu - C - Programmation
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.
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?
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 :
|
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 :
|
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 :
|
pourquoi le fait de contatener deux chaine modifie telle une varialbe qui n'est meme pas ecrit dans cette ligne?
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] !
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.
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?
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.
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. |
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 :
|
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...
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.
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.
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é
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]
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 |
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)...
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
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
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
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 :
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