C中的损坏文件

Broken files in C

我制作了一个简单的脚本来将一个文件内容重写到另一个文件中。 这是代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char filename[1024];
    scanf("%s", &filename);

    // printf("Filename: '%s'\n", filename);

    int bytesToModify; scanf("%d", &bytesToModify);

    FILE *fp;

    fp = fopen(filename, "r");
    fseek(fp, 0, SEEK_END);
    int fSize = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    printf("%d\n", fSize);

    char *buf = malloc(fSize*sizeof(char));

    for (int i = 0; i < fSize; i++) {
        buf[i] = getc(fp);
    }
    fclose(fp);

    FILE *fo;

    fo = fopen("out_file.txt", "w");
    for (int i = 0; i < fSize; i++) {
        fwrite(&buf[i], 1, 1, fo);
    }
    fclose(fo);

    return 0;
}

即使在像这样的小文件上我也能看到神器。西里尔符号“я”出现在文件末尾。 如果我尝试重写可执行文件,我会得到:

99% 的文件都转向了这些符号。我的代码有什么问题?

我在 GCC 编译器 10.1.0 版中使用 CodeBlocks。 我的操作系统是 Windows 10.

感谢您的帮助。

  1. 您没有以 二进制模式 打开文件:"rb""wb"。因此,fgetc 会将所有 \r\n 变为单个 \n.

  2. 每个行终止符少读一个字符。然而,您仍然尝试阅读,fgetc 将 return EOF(和 ). As EOF has value -1 on Windows, when written to file converted to unsigned char this results in Я in the encoding you're using in Notepad (most likely Windows-1251)。

此外,既然您使用的是 fwrite,那么您同样可以使用 fread。并且不需要读,一次写一个字符,只需使用

char *buf = malloc(fSize);
int bytesRead = fread(buf, 1, fSize, fp); 
fclose(fp);

int bytesWritten = fwrite(buf, 1, bytesRead, fo);