[WinApi]ReadFile frage.

ed0x

Grünschnabel
Hallo...

Ich möchte gerne eine ->belibig<- große datei einlesen lassen...

ich mach das volgendermaßen:

Code:
	CHAR ReadBuffer[100];
	DWORD dwBytesRead;
	HANDLE hFile;

	hFile = CreateFile("C:/test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	if (hFile == INVALID_HANDLE_VALUE) 
		MessageBox(hWnd, (LPCSTR)GetLastError(), "Could not open file", MB_OK);

	if(ReadFile(hFile, ReadBuffer, 100, &dwBytesRead, NULL) == FALSE) {
		MessageBox(hWnd, (LPCSTR)GetLastError(), "Could not read from file", MB_OK);
		CloseHandle(hFile);
	}

	if (dwBytesRead > 0) {
		ReadBuffer[dwBytesRead]='\0'; // NULL character	
	} else {
		MessageBox(hWnd, "error", "error", MB_OK);
	}
	CloseHandle(hFile);

jetzt hab ich aber nur 100 frei in ReadBuffer...

Jetzt dachte ich mir, ich kann doch mit GetFileSize, die größe der datei herrausfinden und erst DANN ReadBuffer Dekliniren...

Praktisch so:

Code:
	DWORD dwBytesRead;
	DWORD FileSize; //new
	HANDLE hFile;

	hFile = CreateFile("C:/test.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	if (hFile == INVALID_HANDLE_VALUE) 
		MessageBox(hWnd, (LPCSTR)GetLastError(), "Could not open file", MB_OK);

	FileSize = GetFileSize(hFile, NULL); //new
	CHAR ReadBuffer[FileSize]; //new <- Zeile 177

	if(ReadFile(hFile, ReadBuffer, FileSize, &dwBytesRead, NULL) == FALSE) {
		MessageBox(hWnd, (LPCSTR)GetLastError(), "Could not read from file", MB_OK);
		CloseHandle(hFile);
	}

	if (dwBytesRead > 0) {
		ReadBuffer[dwBytesRead]='\0'; // NULL character	
	} else {
		MessageBox(hWnd, "error", "error", MB_OK);
	}
	CloseHandle(hFile);

aber da bekomm ich immer volgende Fehlermeldung:

(177) : error C2057: Konstanter Ausdruck erwartet
(177) : error C2466: Zuordnung eines Arrays der konstanten Größe 0 nicht möglich.
(177) : error C2133: 'ReadBuffer': Unbekannte Größe

Mach ich das i.wie falsch?
 

engelmarkus

Erfahrenes Mitglied
Du musst beim Array die Größe entweder direkt als Zahl oder eine Konstante angeben. Der Compiler muss wissen, wie groß das Array wird. Das kann er nicht, wenn erst zur Laufzeit die Größe bestimmt wird.
 

ed0x

Grünschnabel
hm...wie soll ich das dann realisiren?

ich habs auch schon so probiert:

char *ReadBuffer;

und dann ReadBuffer = malloc(FileSize*sizeof(char));

-> dann bekomm ich den fehler hier: error C2440: '=': 'void *' kann nicht in 'char *' konvertiert werden

wobei das ja das gleiche macht wie CHAR ReadBuffer[FileSize];

Wie soll ich das dann am besten machen?
 
Zuletzt bearbeitet:

engelmarkus

Erfahrenes Mitglied
Ja was hast du denn mit den Daten aus der Datei vor?
Du könntest z. B. ein char-array als Puffer nehmen, dann einfach sagen wir 100 Zeichen einlesen und das in eine Schleife packen. So kriegst du die ganze Datei.
Wenn du was brauchst, wo du die Daten ablegen kannst, dann kannst ja einen vector oder sowas in der Richtung benutzen. Sag uns mal, was du vorhast :) .
 

engelmarkus

Erfahrenes Mitglied
Angenommen, deine Daten liegen in der Datei so vor:

Code:
huhu wie
gehts dir

Das heißt, pro Zeile ein Datensatz, die einzelnen Felder durch Leerzeichen getrennt.

Dann kannst du die z. B. so einlesen und dann auch entsprechend ausgeben:

Code:
#include <iostream>
#include <fstream>
#include <vector>

struct datensatz
{
	char teil1[10];
	char teil2[10];
};

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<datensatz> *Daten = new std::vector<datensatz>();
	std::ifstream sr("c:\\test.txt", std::ifstream::in);

	while (sr.good())
	{
		struct datensatz d;

		sr >> d.teil1 >> d.teil2;

		Daten->push_back(d);
	}

	std::cout << Daten->at(1).teil1 << std::endl;

	getchar();
	return 0;
}

Bitte nicht hauen, wenn ich da einen rechten Quatsch mache, ich hab mich nie sonderlich intensiv mit C++ beschäftigt. Zumindest gehts bei mir.
Ich hab vergessen, die Datei nach dem Einlesen wieder zu schließen...

EDIT: Jetzt seh ich grade, dass du ja die WinApi benutzen wolltest? Gibts dafür einen bestimmten Grund?
 
Zuletzt bearbeitet:

ed0x

Grünschnabel
also, volgendes:

ich hab mir schon ein solches programm geschreiben, nur in C++ Konsolenanwendung...

Jetzt wollt ich halt ne schöne GUI dazu machen...^^

Kann ich eigentlich das eingelesene aus der datei auch in einem String speichern?