【发布时间】:2021-01-16 03:35:57
【问题描述】:
我制作了一个简单的脚本来将一个文件内容重写到另一个文件中。 代码如下:
#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;
}
即使是这样的小文件,我也能看到工件。西里尔字母 sybmol 'я' 出现在文件末尾。 如果我尝试重写可执行文件,我会得到:
99% 的文件只是转向这些符号。我的代码有什么问题?
我正在使用带有 GCC 编译器版本 10.1.0 的 CodeBlocks。 我的操作系统是 Windows 10。
感谢您的帮助。
【问题讨论】:
-
fp = fopen(filename, "r");==>fp = fopen(filename, "rb");和"out_file.txt"类似 -
ftell的返回值必须是long,而不是int。迭代器i也是如此。 -
无论何时执行任何类型的 IO,您都需要注意观察通过 locale 设置的编码。有效的 locales on windows 有点时髦但仍然有效。