
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应该是没起什么作用才对,希望大神解惑! 展开
```
#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应该是没起什么作用才对,希望大神解惑! 展开
1个回答
展开全部
fptr = fopen(roominfo, "rb+"); //你的文件是以读写方式打开的
当一个文件以读写方式打开,从读文件切换到写文件或者相反操作,必须刷新文件缓冲区(就是把文件的修改写入磁盘),而fseek操作会引发文件缓冲区的刷新。在你的代码里fwrite以后,下次判断是fread,所以如果不刷新文件缓冲区,fread不会读取到写入的数据,而fseek(fptr, 0,SEEK_CUR);就是在不移动文件指针的情况下,把缓冲区数据写入文件,保证fread会读取到新数据,这是常用手段
当一个文件以读写方式打开,从读文件切换到写文件或者相反操作,必须刷新文件缓冲区(就是把文件的修改写入磁盘),而fseek操作会引发文件缓冲区的刷新。在你的代码里fwrite以后,下次判断是fread,所以如果不刷新文件缓冲区,fread不会读取到写入的数据,而fseek(fptr, 0,SEEK_CUR);就是在不移动文件指针的情况下,把缓冲区数据写入文件,保证fread会读取到新数据,这是常用手段
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询