Kezdőoldal » Számítástechnika » Programozás » Nagy txt fájlokat, hogy kell...

Nagy txt fájlokat, hogy kell kezelni c-ben?

Figyelt kérdés

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?



#programozás #C nyelv #nagy-fájlok
2012. nov. 16. 22:40
1 2
 11/18 _Jessy_ ***** válasza:

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?

2012. nov. 17. 11:07
Hasznos számodra ez a válasz?
 12/18 A kérdező kommentje:

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.

2012. nov. 17. 12:39
 13/18 A kérdező kommentje:

#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;

}

2012. nov. 17. 12:39
 14/18 A kérdező kommentje:
a kiírásnál az utolsó elem természetesen T[i][21]
2012. nov. 17. 12:40
 15/18 iostream ***** válasza:

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.

2012. nov. 17. 13:19
Hasznos számodra ez a válasz?
 16/18 A kérdező kommentje:
Rendben van köszönöm kipróbálom. :) Megint későn reagáltam, na majd megírom hogy működött-e.
2012. nov. 17. 14:23
 17/18 A kérdező kommentje:

:( Í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?

2012. nov. 17. 15:50
 18/18 _Jessy_ ***** válasza:

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);

}

...

2012. nov. 17. 17:44
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!