C nyelv: alábbi fájlmásoló programba hogy lehet időmérést, százalék-kijelzést tenni? (bővebben lent)
Az alábbi kis programot hogyan, miképpen lehetne úgy átírni, hogy a bemeneti fájl tartalmát kimeneti fájlba másolja, mindig annyit olvasson be, amennyi a memóriába éppen befér? A másolás előrehaladásáról tájékoztasson százalékos formában, de csak akkor ha az adott százalékos érték osztható 10 számmal?
Azt miképpen lehet megoldani, hogy az időt is mérje, másolás elejétől és a végén írja ki mennyi ideig tartott a teljes másolás?
Ezek nagy részét másik programozási nyelvben meg tudom valósítani (kivéve a "memóriába annyit olvasni mint amennyi belefér problémát"), de C nyelven sajnos nem.
Milyen függvények kellenek? A fseek-ről azt olvastam például, hogy csak 2 GB méretű fájlokig jó.
Malloc függvény kell talán a memóriába történő olvasásra.
Ha ekkor nincs puffer, mert a memóriába annyi van olvasva mint amennyi belefér, akkor ha meg szeretnék változtatni egy-két bájtot például a fájlon, hogy kimenetbe már a változtatás kerüljön, azt hogy kell csinálni?
Sajnos, hibás a program:
fajlos.c: In function ‘main’:
fajlos.c:15:1: error: expected declaration or statement at end of input
}
#include <stdio.h>
int main(int argc, char *argv[]){
FILE *be, *ki;
int ertek;
be=fopen(argv[1],"rb");
ki=fopen(argv[2],"wb");
while((ertek=fgetc(be))!=EOF){
ertek=fputc(ertek,ki);
fclose(ki);
fclose(be);
return 0;
}
Az a kérdés, hogy mi a jelentős?
Én írtam már effélét és nem számottevő a különbség, de ízlés (és üzemi leterheltség) kérdése. Egy kihasználtabb szervernél már okozhat számottevő lassulást.
A tömb is nagyon jó puffernek, de akár byte-onként is lehet másolni, csak ha nagy a másolandó file akkor ugye, nem tanácsos, meg hát nem is ésszerű.
Ha megfelel kis C++ is, akkor itt a megoldás:
Dinamikus memóriába lefoglal alapból 40MB-ot, azt használja buffernek. Simán átmásoltam vele egy 9GB-os .mkv-t és ment gond nélkül, 20mp alatt meg is volt az SSD-men.
Ha csak C kell, akkor a chrono mérést kicseréled GetTickCount-ra (Windows.h szükséges azt hiszem, de az csak windowson fog menni), a new és delete kulcsszót meg malloc és free-re.
Nagyon szépen köszönöm a válaszokat, a képet és a forráskódot is.
A kód sima C nyelvre történő átírásakor az include-ot nem kell lecserélni? (#include <stdio.h>})
Nagyon köszönöm a kód megírását.
Szívesen. Már vagy 3 hónapja nem írtam egy sor kódot se, szóval örültem a kihívásnak :D
Amúgy nem értem a kérdésed, hogy mit akarsz az stdio.h-val. Szerintem ez megy nélküle is, mert én se includoltam azt. Ha véletlenül mégsem, akkor tedd csak oda.
Elnézést, mivel kell ezt lefordítani? Se cpp, se gcc nem fordítja le, már a legelső sornál megáll, az "iostream" nem tetszik neki.
Átírva include részeket "stdio.h", "string.h", "time.h": a helyzet így sem javul.
Sajnos C-ből nagyon kezdő vagyok még.
Azoknak is lekéne, hogy tudják fordítani, viszont fogalmam sincs, hogy. Elméletileg ugyanúgy kéne működni, mitn a visual studionak. Soha nem használtam őket windowson. Csak linuxon GCC-t jó pár éve.
Windowson ajánlatos Visual Studio-t használni, talán az a legelterjedtebb és ingyenes is. Ha bármit is írok windowsra, csak ezt használom.
Itt simán rámész h New project -> C++ console app, létrehozod. Beállítod a beállításokban a Multi-byte character set-et (Properties -> Advanced -> Character set), berakod a kódot a main.cpp-be és fordíthatod is.
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!