[fread] Zuviel Inhalt
-
Mein Code:
#include <stdio.h> #include <io.h> FILE *stream; int FileSize; int main(int argc, char* argv[]) { if( (stream = fopen( argv[1], "r" )) == NULL ) printf( "Datei '%s' konnte nicht geöffnet werden\n",argv[1] ); else { FileSize = (int)(filelength(fileno(stream))); char* content= new char[FileSize]; printf( "%d\n", FileSize); fread(content,sizeof(char),FileSize,stream); printf( "%s\n", content); delete[] content; if( fclose( stream ) ) printf( "Datei '%s' konnte nicht geschlossen werden\n",argv[1] ); } return 0; }
Mein Problem:
In Content ist mehr enthalten als in der Datei stand, aber der am Ende angefügte Inhalt stammt inhaltlich auch aus der Datei. Ich vermute mal das content zu groß ist und der rest noch irgendwo im Speicher rumlag. Aber warum???
-
ich kenn filelength nicht, aber wenn das "länge des satzes" zurückgibt, dann musste new char[filelength(..) + 1] machen, weil '\0', die terminierung sonst fehlt.
-
@mnhg, du solltest darauf achten nicht zu viel C und C++ zu vermischen siehe: new/delete = C++ und fopen = ANSI C.
@mata, filelength kommt von Microsoft.
Hier mal dein Programm in reinem C
int main( int argc, char *argv[] ) { FILE *pFd; char *pBf; long lLen; pFd = fopen( argv[1], "r" ); if ( pFd ) { /* Dateilänge ermitteln */ fseek( pFd, 0, SEEK_END ); lLen = ftell( pFd ); fseek( pFd, 0, SEEK_SET ); /* Speicher für Puffer holen */ pBf = malloc( lLen +1 ); if ( pBf ) { memset( pBf, 0, lLen +1 ); fread( pBf, sizeof( char ), lLen, pFd ); printf( "%s\n", pBf ); free( pBf ); fclose( pFd ); return 0; }; fclose( pFd ); }; return 1; };
-
Wir kommen dem Problem näher...
Jetzt hört mein Char zwar da auf wo er soll, aber das was vorher mit nichtgewollten Inhalt meiner Datei aufgefüllt wurde sind jetzt =====²²²²
Übrigens Danke für den Hinweis C/C++, das kommt davon das ich aus der MSDN lerne...
EDIT:
Dein Code funktioniert auch nicht, ich erhalte den Fehlererror C2440: '=' : 'void *' kann nicht in 'char *' konvertiert werden Konvertierung von 'void*' in Zeiger auf nicht-'void' erfordert eine explizite Typumwandlung
in der Zeile mit malloc
-
pBf = (char *) malloc( lLen +1 );
Konvertierung von 'void*' in Zeiger auf nicht-'void' erfordert eine explizite Typumwandlung
sagt doch alles, musst in char* umwandeln :).