"Zwischenspeicher" in c++
-
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^^
-

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).aspxUnd 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).aspxGanz 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.
-
Das ganze Vorhaben ist doch totaler Käse
