【发布时间】:2026-01-16 16:20:07
【问题描述】:
我有一个用 C 编写的小示例程序。我有一个调用函数 writeFile 的主程序,该函数将一些数字写入二进制文件。然后我调用overwrite 将 0 替换为 1,最后打印结果。
这是代码:
#include <stdio.h>
/* Print the content of the file */
void printFile(){
printf("Read test.dat:\n");
int r;
FILE* fp = fopen("test.dat", "rb+");
if(fp) {
while(fread(&r,sizeof(int),1,fp)){
printf("%d\n", r);
}
}
fclose(fp);
}
/* Replace 0 with 1 */
void overwrite(){
int r;
FILE *fp = fopen("test.dat", "rb+");
if (fp) {
int i=0;
while (i < 4 && fread(&r, sizeof(int), 1, fp)) {
i++;
if (r == 0) {
r = 1;
fseek(fp,-sizeof(int),SEEK_CUR);
fwrite(&r,sizeof(int),1,fp);
}
}
}
fclose(fp);
}
/* Create original file */
void writeFile() {
int b, b1, b2, b3, b4;
b = 3;
b1 = 2;
b2 = 0;
b3 = 4;
FILE *fp = fopen("test.dat", "wb");
if (fp) {
fwrite(&b, sizeof(int), 1, fp);
fwrite(&b1, sizeof(int), 1, fp);
fwrite(&b2, sizeof(int), 1, fp);
fwrite(&b3, sizeof(int), 1, fp);
}
fclose(fp);
}
int main() {
writeFile();
printf("---------BEFORE--------\n");
printFile();
printf("-----------------------\n");
printf("Overwriting...\n");
overwrite();
printf("---------AFTER---------\n");
printFile();
return 0;
}
这段代码适用于 Linux,但是当我在 Windows 上运行相同的代码时,输出是这样的:
---------BEFORE--------
Read test.dat:
3
2
0
4
-----------------------
Overwriting...
---------AFTER---------
Read test.dat:
3
2
1
2
不仅0被1替换,而且最后一个数字也被改变了。有人可以帮助我理解为什么会发生这种情况?
另一个问题是在overwrite 中我必须使用i 来停止while,因为没有i<4 我会得到一个无限循环(仅限Windows)。
我在使用 gcc 4.8.1(来自 MinGW)编译的 Windows 8.1 上测试了此代码。 在我的 Linux 机器上,我使用 gcc 5.1.1 测试了代码。
谢谢大家,
【问题讨论】:
-
如果您将
0之前的2更改为5,它会用5替换最后一个数字吗? -
我无法复制它。我有预期的输出序列 3、2、1、4。
-
我很想知道我在 VBox 机器上安装 windows 是否可重现,现在我正在安装 DevCPP 进行测试。
-
我刚刚做到了,它确实发生在 Windows 上。它确实用第二个数字替换了最后一个数字。