8

我正在尝试将文件从指定库复制到当前目录。我可以完美地复制文本文件。任何其他文件都会损坏。程序在它应该检测到一个 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;
}
4

3 回答 3

19

你在 Windows 机器上吗?尝试在对fopen.

来自 man fopen(3):

模式字符串还可以包含字母“b”作为最后一个字符或作为上述任何两个字符串中的字符之间的字符。这完全是为了与 C8​​9 兼容,没有任何效果;'b' 在所有符合 POSIX 的系统上都被忽略,包括 Linux。(其他系统可能会以不同的方式处理文本文件和二进制文件,如果您对二进制文件执行 I/O 并希望您的程序可以移植到非 Unix 环境,则添加“b”可能是个好主意。)
于 2010-02-21T19:13:54.570 回答
6

您需要指定以下"b"选项fopen

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

没有它,文件将以文本 ( "t") 模式打开,这会导致行尾字符的翻译。

于 2010-02-21T19:12:02.133 回答
3

您需要以二进制格式而不是文本格式打开文件。在您对 的调用中fopen,分别使用"rb"and"wb"而不是"r"and "w"

于 2010-02-21T19:12:53.800 回答