"Zwischenspeicher" in c++



  • also einfach mit fopen() einlesen?
    OK! Nochwas: Bei zigtausent Dateien wär der Speicher schnell voll 😃
    Kann mir jemand auf die Sprünge helfen, wie ich nur solange daten einlese bis ein bestimmtes Maximum erreicht ist, und Dateien die dieses Maximum überschreiten in Teile zerlege und sie so geschrieben werden? 😕
    Nachdem ich die Datei geschrieben hab, bleibt sie im RAM? wenn ja, wie lösche ich sie dort?



  • Nexus_Sphere schrieb:

    hallo erstmal!
    Ich will ein kopierprogramm in C++ schreiben und nutze dafür DevCpp.
    Mein Programm soll die Dateien erstmal alle einlesen, im Arbeitsspeicher zwischenspeichern und erst danach auf die Festplatte schreiben.
    Mit welchen befehlen kann ich das erreichen?
    [Ich stell mir da eine Art Datenkontainer im RAM vor, wo die Daten gelagert werden]

    Hi,

    Man nimmt dazu MapViewOfFile().

    HANDLE hFile;

    hFile = CreateFile( ... )
    HANDLE hMap = CreateFileMapping( ... )

    hOffset = MapViewOfFile(hMap, ...)

    hOffset ist ein Pointer auf die in den virtuellen Speicher gemappte Datei.
    Jede Änderung über hOffset gemacht wirkt sich unmittelbar auch in der Datei selbst aus.



  • OK danke erstmal
    bis morgen hab ich dann ja jetzt was zu tun 😉
    meld mich wenn ich mehr fragen hab!
    gute Nacht 😃



  • OK kann mir villeicht doch noch jemand ein Codebeispiel geben? durch msdn blick ich net durch -.-



  • CStern schrieb:

    HANDLE hFile;
    
    hFile = CreateFile( ... )
    HANDLE hMap = CreateFileMapping( ... )
    
    hOffset = MapViewOfFile(hMap, ...)
    


  • Hab ich schon gesehn^^

    Nur: um die Uhrzeit stell ich mich manchmal etwas dumm an 😃
    Ich meine ein Beispiel das kommplett ist und teoretisch arbeiten würde!
    (Mini program das funktioniert) Dann seh ich wie genau ich welche der Befehle verwenden muss.

    P.S. Sorry wenn ich euch mit meiner Unwissenheit nerve, aber ich bin ja hier um zu lernen^^


  • Mod

    👎

    Nexus_Sphere schrieb:

    OK kann mir villeicht doch noch jemand ein Codebeispiel geben? durch msdn blick ich net durch -.-

    👎

    Nexus_Sphere schrieb:

    Ich meine ein Beispiel das kommplett ist und teoretisch arbeiten würde!
    (Mini program das funktioniert) Dann seh ich wie genau ich welche der Befehle verwenden muss.

    P.S. Sorry wenn ich euch mit meiner Unwissenheit nerve, aber ich bin ja hier um zu lernen^^

    Dann solltest Du bevor Du weiter programmierst verstehen lernen wie man die MSDN liest und deren Beispiele dort. Und vor allem solltest Du ein bisschen mehr Eigeninitiative zeigen.
    Das primitivste wäre ja wohl gewesen mal eine der Funktionen nachzuschlagen z.B.: CreateFileMapping
    http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx

    Und was sehen Deine müden Augen ziemlich weit unten, slebst zu später Stunde:

    For an example, see Creating Named Shared Memory or Creating a File Mapping Using Large Pages.

    Mit zwei wünderschönen Links:
    http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx
    http://msdn.microsoft.com/en-us/library/aa366543(VS.85).aspx

    Ganz Allgemein lies mal:
    http://msdn.microsoft.com/en-us/library/aa366883(VS.85).aspx



  • Er sollte programmieren lernen.
    Jmd. der nicht programmieren kann, muss die MSDN nicht verstehen (bzw. kann es IMO garnicht).



  • Mein problem ist mein Schulenglisch. Auf msdn komm ich da nicht sooo sehr weit, weshalb ich diese Seite möglichst meide, trotzdem Danke für die hilfe!
    P.S. Ich bin ja grad dabei Programmieren zu lernen 😃
    Ich dachte mir nur, da ich kleinere Sachen schon schreiben kann, wachsen meine Fähigkeiten nur mit dem Schwierigkeitsgrad meiner Aufgaben.

    @Martin Richter
    der Link http://msdn.microsoft.com/en-us/library/aa366551 ist wirklich hilfreich. jetzt wo nicht mehr so viel englischer Text und mehr Code zu finden ist, kann ich auch was daraus lernen.



  • So, hab jetzt ein wenig gebastelt:

    ================================================================================
    #include <cstdlib>
    #include <iostream>
    #include <conio.h>
    #include <tchar.h>

    int BufferSize = 500;

    using namespace std;

    int main(int argc, char *argv[])
    {
    HANDLE hFile;

    hFile = CreateFile(
    INVALID_HANDLE_VALUE,
    NULL, //Standard Accessrights
    PAGE_READWRITE, // read/write access
    0, // max. object size
    BufferSize,
    File1);

    if (hMapFile == NULL)
    {
    printf("fehlschlag...");
    getchar();
    return 1;
    }

    pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
    FILE_MAP_ALL_ACCESS, // read/write permission
    0,
    0,
    BufferSize);

    if (pBuf == NULL)
    {
    printf("fehlschlag...");
    return 1;
    }

    ================================================================================
    [Ist natürlich noch nicht fertig]
    1.Bin ich auf dem richtigen Weg?
    2.DevCpp mekert weil HANDLE nicht declariert wurde... Hab ich was vergessen einzubinden 😕



  • Nexus_Sphere schrieb:

    1.Bin ich auf dem richtigen Weg?

    Auf den ersten Blick, ja.

    Nexus_Sphere schrieb:

    2.DevCpp mekert weil HANDLE nicht declariert wurde... Hab ich was vergessen einzubinden 😕

    <windows.h> ?!

    cheers, Swordfish

    PS: Code-Tags ( [cpp] ) sind was Tolles...



  • CStern schrieb:

    Nexus_Sphere schrieb:

    hallo erstmal!
    Ich will ein kopierprogramm in C++ schreiben und nutze dafür DevCpp.
    Mein Programm soll die Dateien erstmal alle einlesen, im Arbeitsspeicher zwischenspeichern und erst danach auf die Festplatte schreiben.
    Mit welchen befehlen kann ich das erreichen?
    [Ich stell mir da eine Art Datenkontainer im RAM vor, wo die Daten gelagert werden]

    Hi,

    Man nimmt dazu MapViewOfFile().

    HANDLE hFile;

    hFile = CreateFile( ... )
    HANDLE hMap = CreateFileMapping( ... )

    hOffset = MapViewOfFile(hMap, ...)

    hOffset ist ein Pointer auf die in den virtuellen Speicher gemappte Datei.
    Jede Änderung über hOffset gemacht wirkt sich unmittelbar auch in der Datei selbst aus.

    Hier File-Mapping zu verwenden halte ich für höchst unsinnig.

    Der Sinn des Programms soll ja wohl sein dass es selbst entscheidet was wann wo gelesen und geschrieben wird.
    Davon abgesehen kann eine Datei schnell grösser sein als der Bereich den man in den verfügbaren Adressraum mappen kann. Natürlich kann man nur einen Teil einer Datei mappen, und dann den nächsten etc. - aber das ist wohl kaum geeignet jmd. zu empfehlen der noch dabei ist die Grundlagen zu lernen.

    Also doppelt unsinnig: nicht geeignet um das zu machen was der OP vermutlich möchte, und nicht geeignet ihm vorzuschlagen, da er damit nicht weit kommen wird.

    ----

    @Nexus_Sphere:
    Nö, du bist total auf dem Holzweg.

    hFile = CreateFile( 
    INVALID_HANDLE_VALUE, 
    NULL, //Standard Accessrights 
    PAGE_READWRITE, // read/write access 
    0, // max. object size 
    BufferSize, 
    File1);
    

    CreateFile != CreateFileMapping - sind zwei total unterschiedliche Funktionen.

    Versuche das ganze über die ganz normalen Win32 File-Funktionen (CreateFile, ReadFile, WriteFile etc.) zu lösen. Oder aber über die IO Funktionen der Standard-Library (fopen, fread, fwrite etc.).



  • File-Mapping hätte ich für so ein triviales Problem auch niemals verwendet.

    Wenn schon in C++ programmiert wird, würde ich auch auf die STL und die darin enthaltene IOstream Library zurückgreifen.

    http://www.cplusplus.com/reference/iostream/



  • Das ganze Vorhaben ist doch totaler Käse 👎


Anmelden zum Antworten