我正在尝试将文件从指定的库复制到当前目录。我可以完美地复制文本文件。任何其他文件都会损坏。该程序在它应该之前检测到一个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;
}
答案 0 :(得分:18)
你在Windows机器上吗?尝试在调用fopen
。
来自man fopen(3):
模式字符串还可以包括字母'b'作为最后一个字符或作为上述任意两个字符串中的字符之间的字符。这完全是为了与C89兼容而没有效果;所有符合POSIX标准的系统(包括Linux)都会忽略'b'。 (其他系统可以处理文本文件和二进制文件 文件不同,如果你做I / O,添加'b'可能是一个好主意 到二进制文件,并期望您的程序可以移植到非Unix 环境。)
答案 1 :(得分:5)
您需要为"b"
指定fopen
选项:
source = fopen("./library/rfc1350.txt", "rb");
...
destination = fopen("rfc1350.txt", "wb");
如果没有它,文件将以文本("t"
)模式打开,这会导致行尾字符的翻译。
答案 2 :(得分:2)
您需要以二进制格式而不是文本格式打开文件。在致电fopen
时,请分别使用"rb"
和"wb"
而不是"r"
和"w"
。