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
 1/18 A kérdező kommentje:
Lehetséges hogy hardveres korlátai vannak, vagy egy másik programot kéne használni? Én devC-t használok most.
2012. nov. 16. 22:42
 2/18 A kérdező kommentje:
Ha ez számít akkor leírom ,hogy egy sorban 22 darab egy és kétjegyű egész számok vannak. Tehát a programban int-nek vannak deklarálva a tömbök is.
2012. nov. 16. 22:45
 3/18 _Jessy_ ***** válasza:
100%
Valószínűleg nem szabadítod fel a memóriát, így szépen lassan elfogyogat :D
2012. nov. 16. 22:59
Hasznos számodra ez a válasz?
 4/18 A kérdező kommentje:
Értem, köszi. Megpróbálom azt. Bár 4giga memória nem elég?
2012. nov. 16. 23:07
 5/18 _Jessy_ ***** válasza:

int *k;

int _1G = 1024*1024;

for(int i = 0; i < _1G; ++i){

k = new int[100];

}

igaz c++ de a memóriát felzabálja, pedig csak 100 int típusú változónak foglal helyet egyszerre.

A másik ok lehet az, hogy túlindexelted a tömböt, amit használsz.

2012. nov. 16. 23:25
Hasznos számodra ez a válasz?
 6/18 _Jessy_ ***** válasza:

Hopp. Lemaradott egy 1024-es szorzó a _1G-ből :)

Szóval unsigned int _1G = 1024*1024*1024, valamint a ciklusba unsigned int a ciklusváltozó. Késő van már ehhez...

2012. nov. 16. 23:27
Hasznos számodra ez a válasz?
 7/18 A kérdező kommentje:
Ok. köszi.
2012. nov. 16. 23:28
 8/18 iostream ***** válasza:
Kód nélkül nehéz megmondani, mit ronthattál el.
2012. nov. 16. 23:54
Hasznos számodra ez a válasz?
 9/18 zsomkovacs ***** válasza:

Beolvasod tömbbe az összes elemet? A C++ valahogy nem szereti a nagy méretű tömböket (bár a dinamikus memóriában nincs gondja velük, úgyhogy nem értem...). Mindenesetre ha az egyes sorok módosításai egymástól függetlenül elvégezhetők (pl. nem rendezel), akkor a következő módszer jobban működne:


1) Megnyitod a bemeneti és a kimeneti fájlt.

2) Ciklus amíg nem értünk a bemeneti fájl végére

3) Sor beolvasása

4) Beolvasott sor módosítása

5) Módosított sor kiírása

6) Ciklus vége

7) Bemeneti és kimeneti fájl bezárása


Ha adnál kódot, az egyébként sokat segítene.

2012. nov. 17. 07:50
Hasznos számodra ez a válasz?
 10/18 iostream ***** válasza:

"A C++ valahogy nem szereti a nagy méretű tömböket (bár a dinamikus memóriában nincs gondja velük, úgyhogy nem értem...)."


Ez azért van, mert a nem-dinamikus tömb a vermen van, és a veremnek sokkal korlátozottabb a mérete, mint a heapnek.

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

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, 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!