fseek函数位移量在文件中的使用问题

hawk008 2009-09-14 08:11:57
有如下一段程序

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct studentstruct
{
int No;
char Name[20];
int Age;
}student[3];
void main()
{
int i=0;
int studentNo=3;
printf("请输入学生数据:\n");
for(i=0;i<3;i++)
scanf("%d%s%d",&student[i].No, student[i].Name, &student[i].Age);
//SaveFile();
printf("No\t\tName\t\tAge\n");

printf("请输入要显示学生数据的学生学号:\n");
scanf("%d",&studentNo);
GetFileData(studentNo);
}
void GetFileData(int no)
{
struct studentstruct *p;
FILE *fp;
if((fp=fopen("student.txt","r"))==NULL)
{
printf("不能打开文件读请按下任意键结束!\n");
getch();
exit(1);
}
p=&student[0];
fseek(fp,(no-1)*sizeof(struct studentstruct),0);
fread(p,sizeof(struct studentstruct),1,fp);
printf("%d\t\t%s\t\t%d\n",p->No, p->Name, p->Age);
fclose(fp);
}


其中SaveFile()自定义函数的功能是把输入的学生数据写到文件中去。在这里可以先不管他!
现在我不明白的是,在按照学生NO.查找学生信息时,如果学生的NO值是一个较大的数,比如100,那么Fseek函数中,位移量就会很大,等于要向后移动sizeof(struct studentstruct)*100这么大的字节数,可是为什么还是能找到这个学生的信息呢?
是否是当位移量大于文件大小时,就回又向文件头开始查找??
请明白的高手详细解答一下吧!
...全文
257 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
hawk008 2009-09-14
  • 打赏
  • 举报
回复
靠,我明白了~~~~
我一直在试第一个,所以总能显示……太粗心了!!
我明白了,谢谢mstlq,送分结贴!
mstlq 2009-09-14
  • 打赏
  • 举报
回复

int flag=fseek(fp,(no-1)*sizeof(struct studentstruct),0);
if(flag!=0)
{
puts("fseek失败,文件指针实际上根本没有移动!\n");
}
hawk008 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mstlq 的回复:]
请看1楼……


当你把aveFile()源码看清楚之后,就明白了……
[/Quote]
我把saveFile()源码贴出来

void SaveFile(void)
{
FILE *fp;
int i=0;

if( (fp=fopen("student.txt","w"))==NULL )
{
printf("不能打开文件读请按下任意键结束!\n");
getch();
exit(1);
}

for( i=0; i<3; i++ )
if(fwrite(&student[i],sizeof(struct studentstruct),1,fp)!=1)
printf("不能写文件\n");
fclose(fp);
}

我的理解,程序向文件里写入的时候,是将结构体数组的元素依次写入的,既先写入student[0]……
数组中一个元素是28个字节,一个84个,我就是这不明白,如果我的学号是4,则要从文件起始位置往后找84个字节,但这时已经超出整个结构体数组的大小了啊,为什么还能找出来?
mstlq 2009-09-14
  • 打赏
  • 举报
回复
楼上的把谜底给揭开了……
kakashi0309 2009-09-14
  • 打赏
  • 举报
回复
fseek 如果偏移量超过文件大小 应该返回非零值 文件指针指向不变
mstlq 2009-09-14
  • 打赏
  • 举报
回复
请看1楼……


当你把aveFile()源码看清楚之后,就明白了……
hawk008 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mstlq 的回复:]
楼主问的是“为什么行?”
根据楼上的回答,实际上这个玩意是不行……

那么楼主的问题没有问下去的意义了^_^
[/Quote]
先不要去纠结程序的严谨性问题了吧~
我是只想知道,为什么向后移动很多字节找也可以找到!LS的XD知道就告诉我一下吧,谢谢了!
mstlq 2009-09-14
  • 打赏
  • 举报
回复
楼主问的是“为什么行?”
根据楼上的回答,实际上这个玩意是不行……

那么楼主的问题没有问下去的意义了^_^
hawk008 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mstlq 的回复:]
能输出
99999999  **** ****
??
[/Quote]
你说的是输入学号9999999啊,呵呵,我还以为移动了99999999个字节!
输入8个9,肯定不行啊,再乘结构体的大小,已经超出了取值范围了啊!
mstlq 2009-09-14
  • 打赏
  • 举报
回复
能输出
99999999 **** ****
??
hawk008 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hawk008 的回复:]
引用 5 楼 mstlq 的回复:
引用 4 楼 hawk008 的回复:
超出LONG的取值范围肯定不行啊~~~
我现在就是不明白为什么往后移动了,还能找到!


99999999 < 2的27次方 < int可以表示的范围……

哦,刚才没仔细数几个9,8个9没问题啊,可以找到啊
[/Quote]
不对,我的错,输入8个9始终找到的都是第一个学生的信息!
那这是因为什么呢 ?
mstlq 2009-09-14
  • 打赏
  • 举报
回复
printf("%d\t\t%s\t\t%d\n",p->No, p->Name, p->Age);

这一行输出正常?
hawk008 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mstlq 的回复:]
引用 4 楼 hawk008 的回复:
超出LONG的取值范围肯定不行啊~~~
我现在就是不明白为什么往后移动了,还能找到!


99999999 < 2的27次方 < int可以表示的范围……
[/Quote]
哦,刚才没仔细数几个9,8个9没问题啊,可以找到啊
mstlq 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hawk008 的回复:]
超出LONG的取值范围肯定不行啊~~~
我现在就是不明白为什么往后移动了,还能找到!
[/Quote]

99999999 < 2的27次方 < int可以表示的范围……
hawk008 2009-09-14
  • 打赏
  • 举报
回复
超出LONG的取值范围肯定不行啊~~~
我现在就是不明白为什么往后移动了,还能找到!
mstlq 2009-09-14
  • 打赏
  • 举报
回复
输入99999999也可以吗^_^?
hawk008 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mstlq 的回复:]
fseek() returns zero upon success, non-zero on failure. You can use fseek() to move beyond a file, but not before the beginning. Using fseek() clears the EOF flag associated with that stream.


写代码的人啊……
估计是将学生信息按学号顺序存放在文件里面的,而且学号紧紧相连一个不差……
这个设计,唉……
[/Quote]
楼上的XD速度真快!!
现在我在输入的时候,学号就是乱输的,但是也能够找到对应的学员信息!
我英文不好,您发的那个我大概理解就是fseek()可以越过EOF重新返回查找是吗?
mstlq 2009-09-14
  • 打赏
  • 举报
回复
fseek() returns zero upon success, non-zero on failure. You can use fseek() to move beyond a file, but not before the beginning. Using fseek() clears the EOF flag associated with that stream.


写代码的人啊……
估计是将学生信息按学号顺序存放在文件里面的,而且学号紧紧相连一个不差……
这个设计,唉……

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧