Как прочитать двоичный файл в c? (видео, изображения или текст) - PullRequest
7 голосов
/ 21 февраля 2010

Я пытаюсь скопировать файл из указанной библиотеки в текущий каталог. Я могу скопировать текстовые файлы отлично. Любые другие файлы становятся поврежденными. Программа обнаруживает феоф раньше, чем должна.

#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;
}

Ответы [ 3 ]

18 голосов
/ 21 февраля 2010

Вы на машине с Windows? Попробуйте добавить "b" к строкам режима в вызовах к fopen.

От человека (3):

Строка режима может также включать букву «b» либо в качестве последнего символа, либо в качестве символа между символами в любой из двухсимвольных строк, описанных выше. Это строго для совместимости с C89 и не имеет никакого эффекта; 'b' игнорируется во всех системах, соответствующих POSIX, включая Linux. (Другие системы могут обрабатывать текстовые файлы и двоичные файлы файлы по-разному, и добавление «b» может быть хорошей идеей, если вы делаете ввод / вывод в двоичный файл и ожидать, что ваша программа может быть перенесена в не-Unix сред.)
5 голосов
/ 21 февраля 2010

Вам необходимо указать "b" для fopen:

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

Без него файл открывается в текстовом ("t") режиме, что приводит к переводу символов конца строки.

2 голосов
/ 21 февраля 2010

Вам нужно открывать файлы в двоичном формате, а не в текстовом формате. При звонках на fopen используйте "rb" и "wb" вместо "r" и "w" соответственно.

...