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?
- 1472 megtekintés
Hozzászólások
"a+b"
=>
"wb"
ad.nev="Kiss Pista";
=>
strcpy(ad.nev,"Kiss Pista");
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
A probléma valszeg az a+b r+b lenne a jó. Az a egyből a fájl végére pozicionál.
- A hozzászóláshoz be kell jelentkezni
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 ;)
- A hozzászóláshoz be kell jelentkezni
Igen, köszönöm a segítségeket!
---------------------------
Oszt jónapot!
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
fp=fopen("adatok.dat","r+b");
Így kell megnyitni a fájlt, ahogy nekem kell.
---------------------------
Oszt jónapot!
- A hozzászóláshoz be kell jelentkezni
Hasznalj inkabb alacsonyabb szintu iras-olvasast, az sokkal okosabb. man 2 open, man 2 write
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
Vagy - ha van C++ - STL-t.
--
http://www.naszta.hu
- A hozzászóláshoz be kell jelentkezni
KIfejtenéd bővebben?
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
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'.
- A hozzászóláshoz be kell jelentkezni
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.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
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é.
- A hozzászóláshoz be kell jelentkezni
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...
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
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... ;)
- A hozzászóláshoz be kell jelentkezni
Rosszul emlekeztem, a helyes valasz az O_CREAT & ~O_TRUNC
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
Köszi az infót, utána olvasok!
---------------------------
Oszt jónapot!
- A hozzászóláshoz be kell jelentkezni