Stephen Burns
Stephen Burns

Reputation: 172

Length of character array after fread is smaller than expected

I am attempting to read a file into a character array, but when I try to pass in a value for MAXBYTES of 100 (the arguments are FUNCTION FILENAME MAXBYTES), the length of the string array is 7.

 FILE * fin = fopen(argv[1], "r");
    if (fin == NULL) {                                                                                 
      printf("Error opening file \"%s\"\n", argv[1]);
      return EXIT_SUCCESS;
    }
    int readSize;

    //get file size
    fseek(fin, 0L, SEEK_END);
    int fileSize = ftell(fin);
    fseek(fin, 0L, SEEK_SET);
    if (argc < 3) {
      readSize = fileSize;
    } else {
      readSize = atof(argv[2]);
    }

    char *p = malloc(fileSize);     

    fread(p, 1, readSize, fin);
    int length = strlen(p);
    filedump(p, length);

As you can see, the memory allocation for p is always equal to filesize. When I use fread, I am trying to read in the 100 bytes (readSize is set to 100 as it should be) and store them in p. However, strlen(p) results in 7 during if I pass in that argument. Am I using fread wrong, or is there something else going on?

Thanks

Upvotes: 0

Views: 803

Answers (1)

David C. Rankin
David C. Rankin

Reputation: 84609

That is the limitation with attempting to read text with fread. There is nothing wrong with doing so, but you must know whether the file contains something other than ASCII characters (such as the nul-character) and you certainly cannot treat any part of the buffer as a string until you manually nul-terminate it at some point.

fread does not guarantee the buffer will contain a nul-terminating character at all -- and it doesn't guarantee that the first character read will not be the nul-character.

Again, there is nothing wrong with reading an entire file into an allocated buffer. That's quite common, you just cannot treat what you have read as a string. That is a further reason why there are character oriented, formatted, and line oriented input functions. (getchar, fgetc, fscanf, fgets and POSIX getline, to list a few). The formatted and line oriented functions guarantee a nul-terminated buffer, otherwise, you are on your own to account for what you have read, and insure you nul-terminate your buffer -- before treating it as a string.

Upvotes: 1

Related Questions