CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

C++ ; Décortiquer un fichier

techslash
techslash
Niveau 8
05 juillet 2003 à 04:47:48

Ça commence à me mettre sérieusement en rogne cette merde :-(( .

J´ai réussi à récupérer le contenu d´un fichier texte avec un stream ( merci à Altonfrère d´ailleurs).

Maintenant, je cherche à le diviser en ligne pour pouvoir ensuite analyser chaque ligne une par une. Je me lance donc avec strtok de la façon suivante ( à peu près).

char *token;
int numLine;
token = strtok(TXTDUFICHIER, " \n");
while(token ! = NULL)
{
token = strtok(NULL, " \n");
++numLine;
}

/* l´opération précédente obtient le nombre de ligne dans le fichier, me permet de ne pas faire une variable très grosse inutilement */

char *lineByLine[numLine + 1];
int i = 0;
lineByLine[i] = strtok(TXTDUFICHIER, " \n");
++i;
while(i < numLine)
{
lineByLine[i] = strtok(NULL, " \n");
++i;
}

Le tout semble fonctionner... sauf que si je fais printf sur un des lineByLine ( autre que le 0), SDL fait une erreur de segmentation et il semble que le tout soit vide... Je suis un peu beaucoup confus... :doute:

Merci pour votre aide !

hs_dino
hs_dino
Niveau 9
05 juillet 2003 à 09:40:00

Le strtok ne renvoie pas un pointeur sur la chaine TXTDUFICHIER, mais un pointeur sur un buffer crée lors du 1er appel de strtok, tu dois donc faire une copie du buffer retourné par strtok et non stocker le pointeur pour un usage ultérieur.

Ceci devrait corriger le probleme:

char *lineByLine[numLine + 1];
int i = 0;
lineByLine[i] = strdup( strtok(TXTDUFICHIER, " \n") ) ;
++i;
while(i < numLine)
{
lineByLine[i] = strdup( strtok(NULL, " \n") ) ;
++i;
}

// ne pas oublier de liberer les alloc memoires
for( int j = 0; j < numLine; j ++ )
{
if( lineByLine[j] )
{
free( lineByLine[j] ) ;
lineByLine[j] = NULL;
}
}

Question : Pourquoi tu mets " + 1" dans ton tableau lineByLine ?

Dino
The Zythum Project
http://www.zythum-project.com

Lightness1024
Lightness1024
Niveau 10
05 juillet 2003 à 10:46:21

info de vocabulaire, ca s´appelle un Parser ce genre de programme :)

techslash
techslash
Niveau 8
05 juillet 2003 à 20:12:45

Malheureusement, ça plante de plus belle, même avec le strdup :(

Je déteste vraiment manipulé des données externes au programme, ça foire tjrs :-(

" Pourquoi tu mets " + 1" dans ton tableau lineByLine ? "
Pas vraiment de bonne raison, j´voulais être sûr de pas avoir de bug à cause d´un dépassement.

" info de vocabulaire, ca s´appelle un Parser ce genre de programme"
Cool, je peux maintenant dire que je déteste les parsers :)

Merci pour votre aide... C´est ridicule, ça fonctionne une fois ( quand je compte le nombre de ligne avec

char *token;
int numLine;
token = strdup(strtok(TXTDUFICHIER, " \n"));
while(token ! = NULL)
{
token = strdup(strtok(NULL, " \n"));
++numLine;
}

et ensuite, rien à faire, ça plante... À la limite je pourrais faire une variable vraiment très grosse, tout storé dedans en comptant le nombre de ligne, refaire une variable basée sur le nombre de ligne, copié les infos de la grosse à la petite et détruire la grosse... mais c´est pas très propre :(

techslash
techslash
Niveau 8
05 juillet 2003 à 20:14:47

Hmmm je voulais dire que j´arrive à faire du strtoking pour compter le nombre de ligne et que ça plante que je le refais APRÈS pour storer mes données...

Oh et si jamais quelqu´un veut m´aider, j´ai essayé de copier/coller et adapter à mon prog le code de Dino sans succès :-( .

Altonfrere
Altonfrere
Niveau 10
05 juillet 2003 à 20:31:52

hum tu peux plus te passer de moi ou quoi ? lol

Bon est ce que ca te dérange si je te donne un exemple plus simple que le tien ?

techslash
techslash
Niveau 8
05 juillet 2003 à 20:32:40

Vas-y fort :)

Altonfrere
Altonfrere
Niveau 10
05 juillet 2003 à 20:43:58

euh attends je viens de relire ton post . .. mais comment as tu fais le printf ?

Altonfrere
Altonfrere
Niveau 10
05 juillet 2003 à 20:57:37

Bon bref c´est pas grave . .. de toute facon voilà pourquoi ca plante :

strtok remplace les caractères que tu souhaites rechercher par le caractère NULL

Donc lors de ta première recherche ( pour compter le nombre de lignes) tu perds la possibilité de recommencer. Vu que ta chaine ( de tout le texte) s´arrête à la fin de la première ligne.

techslash
techslash
Niveau 8
05 juillet 2003 à 21:20:06

Hourra ! Merci Al, j´ai faite une duplicate sur ma variable contenant le texte du fichier pour en avoir deux, j´en utilise une pour compter les lignes ( après quoi je la free) et ensuite j´utilise l´autre pour les trier ( après quoi je la free aussi) et ça fonctionne :ok: .

Merci pour tous vos contributions :) .

techslash
techslash
Niveau 8
05 juillet 2003 à 21:23:41

Quoique c´est quand même ± propre comme système... je sais qu´on peut faire getline sur un stream, ça aurait été beaucoup plus propre sauf que j´arrivais pas à forcer le programme à lire le fichier au complet.

Ma première idée était qq chose comme ( je ne sais plus trop de par coeur, mon exemple peut contenir des erreurs):

char buffer[100];
ifstream monFichier("fichier.txt");

while(buffer ! = 0)
{
monFichier.getline(buffer,"\n");
}

sauf que évidemment, avec ça, si le prog frappe une ligne qui contient juste un enter ( "\n"), il arrête de lire :(

M´enfin, merci !

Altonfrere
Altonfrere
Niveau 10
05 juillet 2003 à 21:39:10

bon plutôt que de copier 2 fois le buffer ( c´est un peu lourd quand même...) compte le nombre de " \n" comme tu le faisais au départ mais avec la fonction strchr :

char *ptr = TXTDUFICHIER;
int numLine = 0;

while(ptr = strchr(ptr,´\n´))
{
ptr++;
++numLine;
}

Altonfrere
Altonfrere
Niveau 10
05 juillet 2003 à 21:40:20

sinon l´exemple que je voulais te donner au départ c´était en utilisant gets(buffer) mais bon c´est une autre approche assez différente . ..

techslash
techslash
Niveau 8
05 juillet 2003 à 22:11:29

Woah... j´ai fait une recherche dans msdn sur fgets et puis... beh j´ai réécrit ma fonction au complet :ok: . C´est beaucoup plus efficace, je peux trier sur le volet, ligne par ligne, sans occuper plein d´espace en mémoire en y storant le texte au complet.

Pour ceux qui veulent me voir aller :lol; , le code ( jusqu´à maintenant :) )

printf(">> Reading your . ini;\n");
FILE *filePT;
filePT = fopen("palmtree.ini","r");
if(filePT == NULL)
{
printf("!> . ini not found;\n");
return tempStruct; // structure qui contient un " flag" indiquant une erreur
}
printf(">> Retrieving the size of your . ini;\n");
fseek(filePT, 0, SEEK_END);

long fileSize;

fileSize = ftell(filePT);
rewind(filePT);
printf("?> Found %ld", fileSize);
printf(" bytes;\n");

printf(">> Reading the file");
char *fileContent = new char[fileSize + 1];

while(ftell(filePT) < fileSize)
{
fgets(fileContent, fileSize, filePT);
printf(fileContent);
// Je dois mettre le code servant à analyser chaque ligne ici
}

delete[] fileContent;
fclose(filePT);

L´affaire est pas mal plus ketchup maintenant :) .

techslash
techslash
Niveau 8
05 juillet 2003 à 22:14:20

Et merci encore ! c´est des semaines et des semaines :mort: de recherches sans succès qui ont finalement menées à fruit :oui:

dpl3
dpl3
Niveau 4
06 juillet 2003 à 01:11:16

il y a des hack , des patch des demo de jeux, des crac.

il ya aussi des logiciel a telecharger du genre de rpg maker 2003, game marker, 3d studio max, mods, c++, devcpp, psp,mega-faq v2,direct 3d et autre.

explication de plusieur logiciel ( explication simple et facile)

http://www.outwar.com/page.php?x=1029343

techslash
techslash
Niveau 8
06 juillet 2003 à 01:48:55

Aaaah ouais, y´a tout ça sur un jeu en ligne de merde comme outwars ?

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment