[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 Fehler

    error 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 :).


Anmelden zum Antworten