File megnyitása bővítésre és bővítése

Fórumok

Oké, ez nagyon amatőr kérdés, belátom, és valszleg tíz perc forrásböngészéssel meg tudnám válaszolni, de az utókor okulására álljon itt:

Hogyan kell egy file-t megnyitni, és a végéhez írni valamit?

w

Hozzászólások

#include "fileio.ch"

function main()
local fd
? fd:=fopen("append.prg",FO_READWRITE)
? fseek(fd,0,FS_END)
? fwrite(fd, "//megjegyzés"+chr(10) )
?
//megjegyzés

--
CCC3

Felhívnám a figyelmet egy nüansznyi különbségre az "írásra megnyitás és végére tekerés", valamint a "hozzáfűzésre megnyitás" között. Ha egyedül te írod a fájlt, akkor a két megoldás azonos. Ha azonban többen is írják, akkor már nem. Előbbi esetben lehet, hogy úgy adódik a két progi futása, hogy először mindketten a fájl végére tekernek, és utána mindketten arra a pozícióra kezdik el írni az adatokat, a későbbi felülírva a korábbi által odaírtat. Ha viszont hozzáfűzésre nyitod meg a fájlt, akkor minden írási művelet automatikusan a fájl végére történik (kivéve NFS fájlrendszeren), tehát a két progi üzenete valamilyen sorrendben egymás után fog megjelenni a fájlban.

Hát ezen nem kellett sokat gondolkozni. Megvan az FO_APPEND opció.

#include "fileio.ch"
function main(x)
local fd,n
fd:=fopen("app.txt",FO_READWRITE+FO_CREATE/*+FO_APPEND*/)
//fd:=fcreate("app.txt",FC_NOTRUNC+FC_APPEND)
for n:=1 to 100
fseek(fd,0,FS_END)
sleep(1) //1 millisec
fwrite(fd, replicate(x,9)+chr(10) )
sleep(1)
next

A teszt abból áll, hogy ezt a programot gyors egymásutánban 2x elindítom, és nézem az eredményt FO_APPEND-del és anélkül. Append módban nem szabad elvesznie kimenetnek. FO_APPEND nélkül a felülírások miatt a kimenet rövidebb. UNIX-on ez 100%-osan így van, winen viszont néha append módban is történik egy-két felülírás:( Winen egyetlen sopen() történik, világosan látszik, hogy érti az O_APPEND-et, de néha mégis hibázik. Ez a win (vagy a C könyvtár) "sajátossága", nem tudok vele mit kezdeni.

--
CCC3

set alternate to ("file") additive
set alternate on

Ezek az ősi Clipper utasítások megnyitják a filét append módban, a qout/qqout (vagy ?/??) tud írni bele. Emögött POSIX stream (fprintf) van, míg a CCC fopen mögött a POSIX file descriptor (read/write).

--
CCC3

Bocs, nem "append", hanem "additive".

Köszönöm a segítséget, egyelőre maradtam az első megfejtésnél, de tanulságos a set alternative to... is.

w