#include #include #define MAX_FILE_NAME_LEN 1023 int main( ) { int maxLen = 2; int i = 0; char *str = (char *) malloc( maxLen ); int ch; FILE *fp; char fileName[ MAX_FILE_NAME_LEN + 1 ]; char formatString[ 25 ]; printf( "Please enter a file name: " ); /* Instead of using %s for scanf, we want %1023s to avoid overflow */ /* It's not the easy to do; have to create a string for it */ /* And watch out for % signs */ sprintf( formatString, "%%%ds", MAX_FILE_NAME_LEN ); if( scanf( formatString, fileName ) != 1 ) { fprintf( stderr, "Cannot get a filename\n" ); return 1; } printf( "Opening %s\n", fileName ); fp = fopen( fileName, "r" ); if( fp == NULL ) { fprintf( stderr, "Error opening %s\n", fileName ); return 1; } /* Build it character at a time */ while( ( ch = fgetc( fp ) ) != EOF ) { if( i + 1 >= maxLen ) // so there is room for '\0' at end if needed { maxLen *= 2; str = (char *) realloc( str, maxLen ); } str[ i++ ] = ch; } str[ i ] = '\0'; if( strlen( str ) < 4000 ) printf( "%s\n", str ); printf( "Read %d (%d) characters\n", strlen( str ), i ); return 0; }