Fórumok
A problémám az az, hogy van egy bináris fájl, amibe struc-ok vannak. És megvan szabva, hogy a 3. helyet felül kell írnom, de valamiért mindig a végére írja a fájlnak.
Kódrészletem:
struct adatok{
int id;
char nev[30];
int kor;
};
...
FILE *fp=fopen("adatok.dat","a+b");
struct adatok ad;
ad.id=2;
ad.nev="Kiss Pista";
ad.kor=30;
fseek(fp,3*sizeof(ad),SEEK_SET);
fwrite(&ad,sizeof(ad),1,fp);
...
Az "adatok.dat" -ban van elegendő adat, mégis mindig a végére írja valami miatt.
Esetleg tud valaki segíteni?
Hozzászólások
=>
=>
Igen, az strcpy kell a string-ek másolásához, ezt elírtam, de a "wb" nem lesz jó nekem, mert akkor kitörli az bináris fájl tartalmát és üreset hoz létre.
Szerk: Most olvasom csak, hogy az "a" az csak olvasni képes bárhonnan, írni csak a végére ír... Akkor ezt nem úszom meg ilyen könnyen...
---------------------------
Oszt jónapot!
A probléma valszeg az a+b r+b lenne a jó. Az a egyből a fájl végére pozicionál.
http://www.cplusplus.com/reference/clibrary/cstdio/fopen/
tehát: "r+"
de nem értem, "a" -> append -> hozzáír (minimális gondolkodás)
"w": nem jó; szumma, nem értek hozzá -> rtfm; örül ;)
Igen, köszönöm a segítségeket!
---------------------------
Oszt jónapot!
a "wb" nem lesz jó nekem, mert akkor kitörli az bináris fájl tartalmát és üreset hoz létre.
uh, ezt beneztem, valoban, elnezest. ezt a level2-es filekezelest en is csak a legprimitivebb esetekben hasznalom, azaz: 1/ siman szekvencialisan kell beolvasni egy file-t 2/ kockazat nelkul kell irni bele, azaz nem tragedia ha _barmi_ elhasal kozben es/vagy eleve felul kell irni valamit (es nem baj, ha a felulirasnal pl ugy szakad meg hogy az eredetit torolte). ha ennel tobb kell, akkor azonnal open(), read(), write(), ... es nem f*(). ahogy a kollega is mondja, lejjebb.
fp=fopen("adatok.dat","r+b");
Így kell megnyitni a fájlt, ahogy nekem kell.
---------------------------
Oszt jónapot!
Hasznalj inkabb alacsonyabb szintu iras-olvasast, az sokkal okosabb. man 2 open, man 2 write
--
Vagy - ha van C++ - STL-t.
--
http://www.naszta.hu
KIfejtenéd bővebben?
Unix IO
--
http://www.naszta.hu
hrgy84-hez szólt a kérdésem.
Az általad hívatkozott link pedig semmit nem mond arról hogy az 'alacsony szintű irás-olvasás miért okosabb'.
Okosabb, mert az open-nek sokkal tobb flagje van, mint a fopen-nek, es millio fele esetet le tudsz vele kezelni. Ha kell az l2 IO, akor van fdopen(3), ami ugyanugy FILE * eroforrast ad vissza, de parameterkent az open(2) altal adott descriptort var.
Nem akarok sok szot vesztegetni ra, olvasd el a man 2 open oldalt, es rajossz.
--
Amit te alacsony (és gondolom magas) szintű I/O-nak nevezel, az tkp. két egymásra épülő szint: 'unbuffered' és 'buffered' I/O.
A 'buffered' (fopen, stb.) ráépült az 'ubuffered'-re (open, stb.), és se nem okosabb, se nem butább, egyszerűen buffer-elt I/O-t tesz lehetővé.
Annyiban mindenkeppen "butabb", hogy a fopen sokkal kevesebb opciot tesz lehetove a fajlmegnyitashoz, pl. a open-nek meg lehet adni azt, hogy O_CREAT | O_NOTRUNC, ami tok jo, mert egyben lekezeli a ketfele problemat. Azonfelul a file modot is meg lehet adni tok kenyelmesen, amit a fopen-nal nehezkesebb. Pesze, ez az en privat velemenyem...
--
O_NOTRUNC nincs, hanem vszeg. O_CREAT|O_TRUNC
A 'man fopen'-ben ezt olvashatjuk:
w+ Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. The stream is positioned at the beginning of the file.
de, Te tudod... ;)
Rosszul emlekeztem, a helyes valasz az O_CREAT & ~O_TRUNC
--
Köszi az infót, utána olvasok!
---------------------------
Oszt jónapot!