Nagy txt fájlokat, hogy kell kezelni c-ben?
Egy érdekes problémám akadt. Van egy 30Mb-os txt fájlom ami számokat tartalmaz, de talán nem is a mérete a fontos, hanem az hogy kb 540 ezer sor van benne és a kis algoritmus amit írtam módosít rajtuk és kiírja őket egy új fájlba.
Nem kell semmi bonyolult műveleten gondolkodni egyszerűen pl a ; karaktereket kicserélem sima , -re, meg ilyenek, csak hogy beírtam a beolvasó ciklusba hogy 540 000-ig fusson a ciklus, de amikor leakarom futtatni akkor az írja ki, hogy a program leállt és megoldást keres.....
Szóval kipróbáltam azt hogy átteszem az 20 ezer sort egy másik txt-be és azon futtatom le a programot. Akkor működött!
Megcsinálnám 40-szer ugyanezt csak kicsit lusta vagyok mindig 20000 soronként menni. Van erre megoldás, hogy a nagyobb fájlokkal is ilyen szépen dolgozhasson?
3) Sor beolvasása
4) Beolvasott sor módosítása
Szerintem karakterek cseréléséhez felesleges soronként olvasni, inkább blokkonként. Egyrészt gyorsabb, másrészt adott esetben kevésbé memóriaigényes.
Egyébként egyre jobban afelé hajlok, hogy túlindexelted a tömböt. Az ilyen elszállásoknak általában ez a leggyakoribb oka. Nem akarsz esetleg egy kódot mutatni nekünk?
Itt van a kód, és bocs hogy csak most reagálok. Tudom elég undorító ez a kód, mert a sorok beolvasását is meglehetett volna csinálni ciklussal, de kérlek most nézzétek el. nekem.
Az a helyzet, hogy ebben a kódban nincs memória kezelés, mert ahhoz még nagyon nem értem. Így próbáltam megcsinálni és nem fut le, de ahogy írtam kisebb állományokkal működik, mondjuk ami nem 540000 sorból áll hanem csak 20000.
#include<stdio.h>
int main(){
#define N 540058
int i;
int T[N][22];
FILE* BE = fopen("szamok.txt", "r");
FILE* KI = fopen("modosit.txt", "w");
for(i=0;i<N;i++){
fscanf(BE, "%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d", &T[i][0], &T[i][1],&T[i][2],
&T[i][3], &T[i][4], &T[i][5], &T[i][6], &T[i][7], &T[i][8], &T[i][9], &T[i][10], &T[i][11], &T[i][12], &T[i][13],
&T[i][14], &T[i][15], &T[i][16], &T[i][17], &T[i][18], &T[i][19], &T[i][20], &T[i][22]);
fprintf(KI, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", T[i][0], T[i][1],T[i][2],
T[i][3], T[i][4], T[i][5], T[i][6], T[i][7], T[i][8], T[i][9], T[i][10], T[i][11], T[i][12], T[i][13],
T[i][14], T[i][15], T[i][16], T[i][17], T[i][18], T[i][19], T[i][20], T[i][22]);
}
fclose(BE);
fclose(KI);
getch();
return 0;
}
int T[N][22];
Teljesen felesleges az az [N] dimenzió. Egyszerre egy sorral foglalkozol, tehát egy sort elég tárolni. Hagyd le az első dimenziót mindenhol (a ciklusban ezek az [i] indexelések), és jó lesz.
:( Így meg az volt a gondom, hogy nem lépked a sorok között. Nézd:
#include<stdio.h>
int main(){
#define N 540058
int i;
int T[22];
FILE* BE = fopen("szamok.txt", "r");
FILE* KI = fopen("modosit.txt", "w");
for(i=0;i<N;i++){
fscanf(BE, "%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d", &T[0], &T[1],&T[2],
&T[3], &T[4], &T[5], &T[6], &T[7], &T[8], &T[9], &T[10], &T[11], &T[12],
&T[13], &T[14], &T[15], &T[16], &T[17], &T[18], &T[19], &T[20], &T[22]);
fprintf(KI, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", T[0], T[1], T[2],
T[3], T[4], T[5], T[6], T[7], T[8], T[9], T[10], T[11], T[12],
T[13], T[14], T[15], T[16], T[17], T[18], T[19], T[20], T[22]);
}
fclose(BE);
fclose(KI);
getch();
return 0;
}
Csak az első sort ismételgeti. Szóval hogy oldjam meg hogy a sorok között is lépjen?
nem tudom mire kell, de ennél jóval egyszerűbb lenne fread()-el blokkonként olvasva, aztán lecserélni a ';'-t ','-re, és visszaírni.
...
char buff[4096];
int len;
while((len = fread(buff, 1, 4096, INFILE)) > 0){
//karakterek kicserélése
fwrite(buffer, 1, len, OUTFILE);
}
...
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!