Alex Rivera | Logout

Why is my simple C program displaying garbage to stdout?

Asked 2008-11-03T22:43:55.353
10

Consider the following simple C program that read a file into a buffer and displays that buffer to the console:

#include<stdio.h>

main()
{
  FILE *file;
    char *buffer;
    unsigned long fileLen;
    //Open file
    file = fopen("HelloWorld.txt", "rb");
    if (!file)
    {
        fprintf(stderr, "Unable to open file %s", "HelloWorld.txt");
        return;
    }
    //Get file length
    fseek(file, 0, SEEK_END);
    fileLen=ftell(file);
    fseek(file, 0, SEEK_SET);
    //Allocate memory
    buffer=(char *)malloc(fileLen+1);
    if (!buffer)
    {
        fprintf(stderr, "Memory error!");
        fclose(file);
        return;
    }
    //Read file contents into buffer
    fread(buffer, fileLen, 1, file);
    //Send buffer contents to stdout
    printf("%s\n",buffer);    
    fclose(file);
}

The file it will read simply contains:

Hello World!

The output is:

Hello World!²²²²▌▌▌▌▌▌▌↔☺

It has been a while since I did anything significant in C/C++, but normally I would assume the buffer was being allocated larger than necessary, but this does not appear to be the case.

fileLen ends up being 12, which is accurate.

I am thinking now that I must just be displaying the buffer wrong, but I am not sure what I am doing wrong.

Can anyone clue me in to what I am doing wrong?

Edit
Report

2 Answers

40

You need to NUL-terminate your string. Add

buffer[fileLen] = 0;

before printing it.

answered 2008-11-03T22:45:52.823
28

JesperE's approach will work, but you may be interested to know that there's an alternate way of handling this.

You can always print a string of known length, even when there's no NUL-terminator, by providing the length to printf as the precision for the string field:

printf("%.*s\n", fileLen, buffer);

This allows you print the string without modifying the buffer.

answered 2008-11-03T23:14:40.737

Your Answer