Dateien lesen - Anfängerproblem



  • Hi,

    ich will einen Dateiinhalt in eine Variable lesen.
    Das mach ich so:

    // Liefert die Größe einer Datei
    DWORD GetFileSize(char* pcFilename)
    {
    	DWORD dwSize;
    
    	int iFile = open(pcFilename, O_RDONLY);
    	dwSize = filelength(iFile);
    	close(iFile);
    
    	return dwSize;
    }
    
    // Das liest die Datei aus:
    
    	char* pcScript = NULL;
    
    	// Dateigröße abfragen und entsprechend viel Speicher reservieren
    	DWORD dwFileSize = GetFileSize(pcFilename);
    	pcScript = new char[dwFileSize];
    	ZeroMemory(pcScript, dwFileSize);
    
    	// Die Datei öffnen
    	FILE* pFile = fopen(pcFilename, "r");
    	if(pFile != NULL)
    	{
    		// Die Datei komplett lesen und dann schließen
    		fread(pcScript, sizeof(char), dwFileSize, pFile);
    
    		fclose(pFile);
    	}
    	else
    	{
    		return false;
    	}
    
    	return true;
    

    Das klappt auch meistens, aber nicht immer. Bei der Datei mit dem Inhalt:

    string INFO = "Bestimmt den Platz, an dem der Spieler das Level betritt";
    string TYPE = "Spielerstartpunkt";
    string ICON = "Spielerstart.tga";
    
    function Platzieren
    {
    MessageBox("Wenn das hier als MessageBox erscheint, ist Weihnachten bestimmt schon vorbei!");
    }
    

    wird am Ende etwas abgeschnitten. Der Text in pcScript geht dann nur bis "bestimmt" und kein Zeichen weiter.

    Ich denke, es hängt mit der Anzahl an Zeilen zusammen, dwFileSize scheint immer um die Anzahl der Zeilenumbrüche zu lang zu sein. Aber wie soll ich das Problem beheben?



  • Was fürn pcScript? Durch deinen 2.Code steige ich nicht durch, was das sein soll.

    Zum ersten : Es gibt schon eine Winapi funktion, die exakt so heisst wie deine.
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/getfilesize.asp

    Wieso benutzt du fopen und nicht CreateFile? Wenn du versuchst eine Binärdatei (Spielerstart.tga ?) zu öffnen, dann musst du dies bei fopen auch angeben, also "rb" anstelle von "r" da sonst beim ersten 0 Zeichen Schluss mit einlesen ist.



  • 1. Das pcScript ist nur eine char* - Variable, die den Dateiinhalt aufnehmen soll.

    2. Ich versuche die angegebene Datei zu öffnen (Der 2. Code), nicht "Spielerstart.tga", das ist nur eine Textur, auf die in der Datei verwiesen wird.

    Das ganze soll ein Skriptsystem werden, deswegen schaut die Datei so aus. Der Inhalt hat aber nichts zu sagen, es geht nur darum, dass sie falsch gelesen wird.

    Ich habe das Ganze nun umgeschrieben:

    char* pcScript = NULL;
    
    	HANDLE hFile = CreateFile(pcFilename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
    		// Dateigröße abfragen und entsprechend viel Speicher reservieren
    		DWORD dwFileSize = GetFileSize(hFile, NULL);
    		pcScript = new char[dwFileSize];
    		ZeroMemory(pcScript, dwFileSize);
    
    		DWORD dwRead;
    		ReadFile(hFile, pcScript, dwFileSize, &dwRead, NULL);
    
    	CloseHandle(hFile);
    

    Nun ist es noch schlechter:
    Wenn ich die Datei mit dem Inhalt

    string INFO = "Heilt den Spieler bei Kontakt.";
    string TYPE = "Heilung";
    string ICON = "Heilung.tga";

    einlese, steht in pcScript nun:

    string INFO = "Heilt den Spieler bei Kontakt.";
    string TYPE = "Heilung";
    string ICON = "Heilung.tga";ýýýý

    Denselben Effekt hatte ich auch, als ich im vorigen Code das "r" in "rb" änderte.

    Was mache ich jetzt schon wieder falsch? 😕



  • pcScript = new char[dwFileSize + 1];



  • ZeroMemory(pcScript, dwFileSize + 1);



  • Ok, so klappt es!

    Es ging aber auch schon vorher: das Problem war nur dass MSVC++6 nicht den ganzen Inhalt der Variable angezeigt hat, deswegen sah es so aus als ob er abgeschnitten würde.

    Danke für die Antworten!


Anmelden zum Antworten