Как считать двоичный файл в c? (видео, изображения или текст)

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

#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;
}
7
задан Collin Price 21 February 2010 в 19:08
поделиться

3 ответа

Я нахожу только один способ завершить личный проект.

Сначала интеллектуальный код, затем запланируйте. Разработайте этот прототип, но сконструируйте его таким образом, чтобы любой отдельный элемент мог быть удален и заменен другим элементом.

Например, если ваш выбор языка ruby, создайте свои классы, чтобы иметь четко определенный интерфейс, который вы никогда не сломаете. Беспокойтесь о том, что каждая функция «делает» правильную вещь, не очень заботясь о том, как она делает.

Затем вернитесь к вашему прототипу, построенному по модулю, и исправьте одну деталь за раз.

-121--2953942-

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

-121--3791889-

Вы находитесь на компьютере с ОС Windows? Попробуйте добавить «b» в режим, последовательности в вызовах fopen .

От man fopen (3):

Режим последовательности может также включать букву «b» либо в качестве последнего символа, либо в качестве символа между символами в любом из двухсимвольных последовательностей, описанных выше. Это строго для совместимости с C89 и не имеет эффекта; «b» игнорируется во всех системах, соответствующих POSIX, включая Linux. (Другие системы могут обрабатывать текстовые файлы и двоичные файлы по-другому, и добавление 'b' может быть хорошей идеей, если вы делаете ввод-вывод в двоичный файл и ожидать, что ваша программа может быть портирована на не-Unix среды.)
18
ответ дан 6 December 2019 в 07:06
поделиться

Вам необходимо указать опцию "b" в fopen:

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

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

5
ответ дан 6 December 2019 в 07:06
поделиться

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

2
ответ дан 6 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: