How to read a binary file in c? (video, images, or text)
Asked Answered
G

3

8

I am trying to copy a file from a specified library to the current directory. I can copy text files perfectly. Any other files become corrupt. The program detects a feof before it should.

#include <stdio.h>

int BUFFER_SIZE = 1024;
FILE *source;
FILE *destination;
int n;
int count = 0;
int written = 0;

int main() {
    unsigned char buffer[BUFFER_SIZE];

    source = fopen("./library/rfc1350.txt", "r");

    if (source) {
        destination = fopen("rfc1350.txt", "w");

        while (!feof(source)) {
            n = fread(buffer, 1, BUFFER_SIZE, source);
            count += n;
            printf("n = %d\n", n);
            fwrite(buffer, 1, n, destination);
        }
        printf("%d bytes read from library.\n", count);
    } else {
        printf("fail\n");
    }

    fclose(source);
    fclose(destination);

    return 0;
}
Gold answered 21/2, 2010 at 19:8 Comment(0)
C
19

Are you on a Windows machine? Try adding "b" to the mode strings in the calls to fopen.

From man fopen(3):

The mode string can also include the letter 'b' either as a last character or as a character between the characters in any of the two-character strings described above. This is strictly for compatibility with C89 and has no effect; the 'b' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the 'b' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-Unix environments.)
Caltanissetta answered 21/2, 2010 at 19:13 Comment(0)
M
6

You need to specify the "b" option to fopen:

source = fopen("./library/rfc1350.txt", "rb");
...
destination = fopen("rfc1350.txt", "wb");

Without it, the file is opened in text ("t") mode, and this results in translation of end-of-line characters.

Magnific answered 21/2, 2010 at 19:12 Comment(0)
P
3

You need to open the files in binary format rather than text format. In your calls to fopen, use "rb" and "wb" rather than "r" and "w" respectively.

Proprietress answered 21/2, 2010 at 19:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.