Я пытаюсь скопировать файл от указанной библиотеки до текущего каталога. Я могу скопировать текстовые файлы отлично. Любые другие файлы становятся поврежденными. Программа обнаруживает 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;
}
Я нахожу только один способ завершить личный проект.
Сначала интеллектуальный код, затем запланируйте. Разработайте этот прототип, но сконструируйте его таким образом, чтобы любой отдельный элемент мог быть удален и заменен другим элементом.
Например, если ваш выбор языка ruby, создайте свои классы, чтобы иметь четко определенный интерфейс, который вы никогда не сломаете. Беспокойтесь о том, что каждая функция «делает» правильную вещь, не очень заботясь о том, как она делает.
Затем вернитесь к вашему прототипу, построенному по модулю, и исправьте одну деталь за раз.
-121--2953942- Необходимо открыть файлы в двоичном формате, а не в текстовом. При вызове fopen
используйте «rb»
и «wb»
, а не «r»
и «w»
соответственно.
Вы находитесь на компьютере с ОС Windows? Попробуйте добавить «b» в режим, последовательности в вызовах fopen
.
От man fopen (3):
Режим последовательности может также включать букву «b» либо в качестве последнего символа, либо в качестве символа между символами в любом из двухсимвольных последовательностей, описанных выше. Это строго для совместимости с C89 и не имеет эффекта; «b» игнорируется во всех системах, соответствующих POSIX, включая Linux. (Другие системы могут обрабатывать текстовые файлы и двоичные файлы по-другому, и добавление 'b' может быть хорошей идеей, если вы делаете ввод-вывод в двоичный файл и ожидать, что ваша программа может быть портирована на не-Unix среды.)
Вам необходимо указать опцию "b"
в fopen
:
source = fopen("./library/rfc1350.txt", "rb");
...
destination = fopen("rfc1350.txt", "wb");
Без нее файл открывается в текстовом ("t"
) режиме, что приводит к переводу символов конца строки.
Вам нужно открыть файлы в двоичном формате, а не в текстовом. В ваших вызовах fopen
используйте "rb"
и "wb"
, а не "r"
и "w"
соответственно.