Problem beim Einlesen einer Datei
-
Hallo,
Ich möchte gerne eine Datei einlesen in einen String. Dabei gehe ich so vor, dass ich zuerst gucke ob die Datei größer als 256 Byte ist und dann immer 256 Byte aufeinmal einlese mit fread, damit es schneller geht. Wenn nur noch weniger als 256 Byte übrig sind, wird jedes Byte einzeln eingelesen bis zum Schluss. Das Problem ist, dass das Einlesen der 256-Byte-Abschnitte ohne Probleme geht, aber wenn dann am Ende der Datei Byte für Byte einlesen wird steht nur Müll im Buffer. Hier der Code:
string Daten1 = ""; try { FILE * pInfoFile2 = fopen (FileName.c_str(),"rb"); char* Daten2 = new char[2]; // 1 Byte + \0 char* Daten3 = new char[257]; //256 Byte + \0 int FileSize; FileSize = _filelength(_fileno(pInfoFile2)); if(!pInfoFile2 == NULL) { if (_filelength(_fileno(pInfoFile2)) > 256) // Ist die Datei größer als 256 Byte? { while(Daten1.length() < (_filelength(_fileno(pInfoFile2)) - 256)) //Dann Einlesen bis noch 256 Byte übrig sind { Sleep(3); fread(Daten3,1,256,pInfoFile2); //256 Byte aufeinmal einlesen Daten3[256] = '\0'; // Null-Terminiert Daten1 += (string)Daten3; //Daten in den String } } while(Daten1.length() < (_filelength(_fileno(pInfoFile2)))) // Den Rest der Datei einlesen { Sleep(3); fread(Daten2,1,1,pInfoFile2); //Jetzt immer nur 1 Byte lesen int i = GetLastError(); Daten2[1] = '\0'; //Null-Terminiert Daten1 += (string)Daten2; // Und Daten in den String } fclose(pInfoFile2); } } catch(...) { }
Beim Byteweise einlesen steht immer nur das Zeichen -51 im Buffer. Weiss jemand was da falsch ist?
-
Da du ja MFC nutzt kannst du ja auch die Klassen CFile oder CStdioFile nutzen um die Daten auszulesen.
Hier ein kleines Beispiel um eine Textdatei Zeilenweise einzulesen.CString Zeile; CStdioFile file("C:\\Infos.txt",CFile::modeRead ); while(file.ReadString(Zeile)) { AfxMessageBox(Zeile); }
-
Ja das geht bei MFC stimmt, habe ich aber deshalb nicht gemacht weil ich ohne die vorgefertigten Komponenten arbeiten wollte. Deshalb habe ich auch die FILE-Funktion benutzt und nicht CFile.
Weiss denn vielleicht jemand wo der Fehler im Code ist?