Fseek 回滚 8 字节,但我希望它是 4 字节

Fseek rolls back 8 byte,but I want it to be 4 bytes

for (int i = 0; i < num - 1 - ct; i++) {
    int tmp = k;
    fread(&k, sizeof(int), 1, fp);
    fflush(stdin);
    fseek(fp, -(sizeof(int)), SEEK_CUR);
    fwrite(&tmp, sizeof(int), 1, fp);
}

问题部分在上面。 我希望 fseek 每次回滚 4 个字节。但它会回滚 8 个字节,或者可能会回滚到文件的开头。我不能让它正常工作。大一新生。提前致谢。

尝试在读取前保存当前位置并使用该位置移动文件指针。一定要以“r+b”模式打开文件。

fp = fopen("Your file name", "r+b");
....
for (int i = 0; i < num - 1 - ct; i++){
    int tmp = k;
    long pos = ftell(fp);
    fread(&k, sizeof(int), 1, fp);
    fflush(stdin);   // What has stdin to do here while your read/seek/write fp
    fseek(fp, pos - sizeof(int), SEEK_SET);
    fwrite(&tmp, sizeof(int), 1, fp);
}

并且不要忘记添加检查所用函数的 any 的 return 值。

问题是在从同一流从写入切换到读取时,您没有使用 fseek() 来同步流的内部数据。

试试这个:

fseek(fp, 0, SEEK_CUR);
for (int i = 0; i < num - 1 - ct; i++) {
    int tmp = k;
    fread(&k, sizeof(int), 1, fp);
    //fflush(stdin);  // this has undefined behavior
    fseek(fp, -(sizeof(int)), SEEK_CUR);
    fwrite(&tmp, sizeof(int), 1, fp);
    fseek(fp, 0, SEEK_CUR);
}