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);
}
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);
}