Ouverture fichier voumineux....

Signaler
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006
-
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
-
Bonjour,
J'ai une appli en C++ ou je dois ouvrir plusieurs fichiers texte qui peuvent faire plusieurs mégas (jusqu'à 5megs pour le moment...)
Je dois les traiter ligne par ligne et y lancer plusieurs fonctions (assez proche de la programmation par contrainte)
Si j'ouvre un fichier assez petit, ça va, mais quand je passe à un fichier de 1,5mega ou plus, j'ia le message suivant :

Debug assertion failed!
Program....
Line : ...
Expression : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

Ensuite, il me demande les fichiers suivant pour le debug:

DBGDEL.cpp
NEW.cpp

Pour enfin me dire :

User breakpoint called from code as 0x40a759

Si quelqu'un connait ce genre d'erreur, ça m'aiderait beaucoup! Je pense bien qu'il s'agit d'une surcharge au niveau de la mémoire, mais je ne sais pas comment el gérer... pourtant, je gère ligne par ligne et pas le fichier en entier et j'essaye au maximum de supprimer les variables trop grandes...

7 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
A mon avis, ton problèm n'est pas lié à la taille du fichier, mais à celle des lignes. Je ne pense pas non plus que lire par ligne est une bonne solution. Moi je lirais par paquets de taille constante avec ReadFile comme ca pas de risque de problème de mémoire.
Pour ton erreur, il serait utile d'avoir un peu de code (comment a tu alloué la mémoire et comment lis-tu le fichier?)
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006

Bon, j'ia déjà écris une réponse, mais apparemment elle ne se montre pas...

Bah oui, comme tu dis, apparemment c'est un problème de taille de ligne (ou du moins de variable...)

Je dois absolument lire ligne par ligne le fichier : je dois lancer plusieurs fonctions de vérification sur caque ligne et suivant les résultats de ces fonctions, écrire ou non la ligne dans un autre fichier...

J'ai pu tester pas mal de trucs depuis, il me lit mon fichier tant bien que mal (C du ligne par ligne quoi...) et commence le traitement, tout va mal dès qu'il commence à décomposer ma ligne et y appliquer des fonctions (je suis pas encore descendu assez bas dans mes tests...)

Si tu as une solution pour lire le fichier d'un coup dans un buffer et gérer les retour à la ligne, je suis pour!
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Ben tu peux lire un paquet de taille constante, et puis traiter celui ci pour recuperer chaque ligne, si tu comprens pas, dis moi, j'ai une fonction qui fais ca, jla posterai...
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006

j'ai complètement compris ce que tu dis, mais je sais pas torp comment tu veux gérer ça...
Si tu veux bien poster ta fonciton, ça m'aiderait ouais, merci!
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Bon jl'ai pas retrouvé, mais ca doit ressembler a ca :
DWORD dwRead 0, dwReadTot 0, size;
HANDLE hFile;
char szBuffer[256], *c;int i 0, ok 0;

hFile = CreateFile("pass.txt", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
if (hFile == INVALID_HANDLE_VALUE) { CloseHandle(hFile); return FALSE; }
size = GetFileSize(hFile, NULL);

while (dwReadTot < size) {
ReadFile(hFile, szBuffer, 256, &dwRead, 0);
szBuffer[dwRead] = 0;
c = szBuffer;
while (*c != '\r') { c++, i++;}
*c = 0; i += 2; //+2 pour sauter \r\n;
dwReadTot += i;
SetFilePointer(hFile, i, 0, FILE_BEGIN);
}
CloseHandle(hFile);
return ok;

La ligne complete est stockée ds szBuffer...

++
Messages postés
278
Date d'inscription
mardi 22 janvier 2002
Statut
Membre
Dernière intervention
29 août 2006

Meric, mias mon erreur ne vietn pas de là en fait...
C'est pas le fichier qui fait tout planter...
là je teste un fichier de 18000 lignes, tout se passe bien jusqu'à la 8069ème ligne, là quoiqu'il se passe, que je teste la ligne ou pas, je plante irrémédiablement...
Soit j'en suis à un dépassemetn de capacité, soit j'ai débordé quelque part dans un tableau.
Peros, j'ia pas d'idée fixe là dessus pour le moment.
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Le bout de code que je t'ai donné recuperait une paquet de 255 octets, prenait la premiere ligne du paquet, et placait le pointeur du fichier sur le debut de la ligne suivante, c pas ca que tu voulais ? Envoie ton code ds le cas contraire, pour kon regarde ensemble ou sont les erreurs !

++