Share Mode in den stdio-Routinen?



  • Hallo,

    ich muss von mehreren Threads aus die ein und die selbe Datei lesen und eine andere von beiden Threads aus schreiben.

    Dass ist unkritisch, da Thread 1 nie im Bereich von Thread 2 schreibt und umgekehrt.
    Das Problem dabei ist, dass Datei 1 (zum lesen) im SHARE_READ und Datei 2 (zum schreiben) im SHARE_WRITE Modus geöffnet werden muss.
    Dass ist standardmäßig aber nicht der Fall.

    Leider kann man mit "fopen(_s)" nur den Modus angeben, in dem man die Datei selber öffnet.

    Muss ich die WinAPI-Funktionen benutzen oder hab ich auch hier eine Chance?



  • Hi,
    du kannst doch auf eine mit fopen zum Schreiben geöffnete Datei locker mit zwei Threads zugreifen.



  • Big Brother schrieb:

    Hi,
    du kannst doch auf eine mit fopen zum Schreiben geöffnete Datei locker mit zwei Threads zugreifen.

    Mein größtes Problem ist eher gerade, dass ich keine Dateien > 2^31 -1 verwalten kann.
    Kann mir jemand sagen, wie ich dass mit ANSI-C hinbekomme ohne ein eigenes FileManagement zu programmieren?



  • FrEEzE2046 schrieb:

    Mein größtes Problem ist eher gerade, dass ich keine Dateien > 2^31 -1 verwalten kann.

    was meinste mit verwalten? fseek, ftell und so? fread/fwrite usw. ist doch eigentlich egal, wie gross eine datei ist.
    🙂



  • Wenn die Dateien größer sind musst du halt mehrfach fseek benutzen um weit genug zu springen. Mehr als 4GB auf einmal lesen oder schreiben sollte eh nicht vorkommen. Du kannst dir ja eine 64-Bit-Version von fseek bauen was einfach fseek entsprechend oft aufruft. Das geht bis 64Tb oder so gut, das reicht eine Weile.



  • ;fricky schrieb:

    was meinste mit verwalten? fseek, ftell und so? fread/fwrite usw. ist doch eigentlich egal, wie gross eine datei ist.
    🙂

    Im Endeffekt betrifft das natürlich nur den internen FilePointer. Da dieser sich doch auch irgendwie gemerkt werden muss, dachte ich eigentlich, dass es sich um einen int32 handelt?!

    Dann würde der mehrfache Aufruf von fseek überhaupt nichts bringen. Oder kann ich vom aktuellen Pointer aus immer einen 2^31 großen Offset erreichen?



  • FrEEzE2046 schrieb:

    Im Endeffekt betrifft das natürlich nur den internen FilePointer. Da dieser sich doch auch irgendwie gemerkt werden muss, dachte ich eigentlich, dass es sich um einen int32 handelt?!

    das sollte eigentlich egal sein. wahrscheinlich kannste nicht mehr als 2^32 bytes in einem rutsch schreiben/lesen, aber das darunterliegende filesystem kommt bestimmt auch mit grösseren dateien klar.
    🙂


Anmelden zum Antworten