C语言 文件指针 fseek

学校的代码作业,我想要遍历文件里所有的struct,然后对每一个进行改写,简化版代码如下:```#include<stdio.h>#include<windows.h>#... 学校的代码作业,我想要遍历文件里所有的struct, 然后对每一个进行改写,简化版代码如下:

```
#include<stdio.h>
#include<windows.h>
#include <conio.h>
#include <time.h>
#include <string.h>
#define roominfo "room.dat"

struct room {
int num;
int classtype;
int price;
int occupied;
int period;
int discount;

};

void initialize_room() {
FILE *fptr;

struct room initial[5];

for (int i = 0; i < 5; i++) {
initial[i].num = ((i / 20) + 1)*100 + i;
initial[i].classtype = 2;
initial[i].discount = 100;
initial[i].occupied = 0;
initial[i].period = 0;
initial[i].price = 450;
}

fptr=fopen(roominfo, "wb+");
fwrite(initial, sizeof(struct room), 5, fptr);
fclose(fptr);
}
void change_for_all_room() {
FILE *fptr;
struct room current;

fptr = fopen(roominfo, "rb+");

while (fread(¤t, sizeof(struct room), 1, fptr) == 1 )
{
printf("%d ", current.num);
Sleep(100);

fseek(fptr, -sizeof(struct room), SEEK_CUR);
fwrite(¤t, sizeof(struct room), 1, fptr);
// printf("%d",ftell(fptr));
fseek(fptr, 0,SEEK_CUR);
// printf("%d",ftell(fptr));

}

fclose(fptr);
}

int main(){

initialize_room();
change_for_all_room();

}
```
这时是可以遍历现有的5个房间的,输出结果为100 101 102 103 104, 当我删掉

```
fseek(fptr,0,SEEK_CUR);
```
输出的结果就是100 101 101 101……一直在101 循环

```
#include<stdio.h> //header file include standard library and windows library
#include<windows.h>
#include <conio.h>
#include <time.h>
#include <string.h>
#define roominfo "room.dat"

struct room {
int num;
int classtype;
int price;
int occupied;
int period;
int discount;

};

void initialize_room() {
FILE *fptr;

struct room initial[5];

for (int i = 0; i < 5; i++) {
initial[i].num = ((i / 20) + 1)*100 + i;
initial[i].classtype = 2;
initial[i].discount = 100;
initial[i].occupied = 0;
initial[i].period = 0;
initial[i].price = 450;
}

fptr=fopen(roominfo, "wb+");
fwrite(initial, sizeof(struct room), 5, fptr);
fclose(fptr);
}
void change_for_all_room() {
FILE *fptr;
struct room current;

fptr = fopen(roominfo, "rb+");

while (fread(¤t, sizeof(struct room), 1, fptr) == 1 )
{
printf("%d ", current.num);
Sleep(100);

fseek(fptr, -sizeof(struct room), SEEK_CUR);
fwrite(¤t, sizeof(struct room), 1, fptr);
// printf("%d",ftell(fptr));
//fseek(fptr, 0,SEEK_CUR);
// printf("%d",ftell(fptr));

}

fclose(fptr);
}

int main(){

initialize_room();
change_for_all_room();

}
```

试了几个编译器都不行,我觉得feek应该是没起什么作用才对,希望大神解惑!
展开
 我来答
庄政警
2017-12-08 · TA获得超过9918个赞
知道大有可为答主
回答量:1113
采纳率:94%
帮助的人:912万
展开全部
fptr = fopen(roominfo, "rb+"); //你的文件是以读写方式打开的
当一个文件以读写方式打开,从读文件切换到写文件或者相反操作,必须刷新文件缓冲区(就是把文件的修改写入磁盘),而fseek操作会引发文件缓冲区的刷新。在你的代码里fwrite以后,下次判断是fread,所以如果不刷新文件缓冲区,fread不会读取到写入的数据,而fseek(fptr, 0,SEEK_CUR);就是在不移动文件指针的情况下,把缓冲区数据写入文件,保证fread会读取到新数据,这是常用手段
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式