在牛客网遇到的一个程序题中用到了函数fseek()故查阅了一下该函数的功能及用法,整理如下:

fseek函数功能是把文件指针指向文件的开头,需要包含头文件stdio.h

功 能: 重定位流上的文件指针

函数原型:int fseek( FILE *stream, long offset, int origin );
第一个参数stream为文件指针
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.
如:

 fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
 fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
   fseek(fp,100L,2);把fp指针退回到离文件结尾100字节处。

返回值: 成功,返回0,否则返回其他值。

用法: int fseek(FILE *stream, long offset, int fromwhere);fseek 用于二进制方式打开的文件,移动文件读写指针位置.
fseek(in,-1L,1);   -- 文件流in, 零点为当前指针位置,SEEK_CUR 就是 1,  -1L -- 文件指针回退1个字节

程序示例:

Question:程序通过定义学生结构体变量,存储学生学号、姓名和三门课的成绩。所有学生数据均以二进制方式输出到student.dat文件中。函数fun的功能是:从文件中找出指定学号的学生数据,读入此学生数据,对该学生的分数进行修改,使每门课的分数加三分,修改后重写文件中学生的数据,即用是该学生的新数据覆盖原数据,其他学生数据指定不变;若找不到,则不做任何操作。

(这里的运行结果是给LiSi同学的每科加了3分)

 #include<stdio.h>

 #define N 5

 typedef struct student {
long sno;
char name[];
float score[];
} STU; void fun(const char *filename, long sno)
{
FILE *fp;
STU n;
int i;
fp = fopen(filename, "rb+");
/**********found**********/
while (!feof(fp)) {
fread(&n, sizeof(STU), , fp);
/**********found**********/
if (n.sno == sno)
break;
}
if (!feof(fp)) {
for (i = ; i < ; i++) n.score[i] += ;
/**********found**********/
fseek( fp, -1L * sizeof(STU), SEEK_CUR);
fwrite(&n, sizeof(STU), , fp);
}
fclose(fp);
} int main( )
{
STU t[N] = {
{, "MaChao", , , },
{, "CaoKai", , , },
{, "LiSi", , , },
{, "FangFang", , , },
{, "ZhangSan", , , }
}, ss[N];
int i, j;
FILE *fp;
fp = fopen("student.dat", "wb");
fwrite(t, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe original data :\n");
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
for (j = ; j < N; j++) {
printf("\nNo: %ld Name: %-8s Scores: ", ss[j].sno, ss[j].name);
for (i = ; i < ; i++)
printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
fun("student.dat", );
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe data after modifing :\n");
for (j = ; j < N; j++) {
printf("\nNo: %ld Name: %-8s Scores: ", ss[j].sno, ss[j].name);
for (i = ; i < ; i++) printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
return ;
}

Output:

The original data :

No:  Name: MaChao   Scores:  91.00  92.00  77.00 

No:  Name: CaoKai   Scores:  75.00  60.00  88.00 

No:  Name: LiSi     Scores:  85.00  70.00  78.00 

No:  Name: FangFang Scores:  90.00  82.00  87.00 

No:  Name: ZhangSan Scores:  95.00  80.00  88.00 

The data after modifing :

No:  Name: MaChao   Scores:  91.00  92.00  77.00 

No:  Name: CaoKai   Scores:  75.00  60.00  88.00 

No:  Name: LiSi     Scores:  88.00  73.00  81.00 

No:  Name: FangFang Scores:  90.00  82.00  87.00 

No:  Name: ZhangSan Scores:  95.00  80.00  88.00 

补充:fopen与fclose

函数原型:

FILE *fopen(char *filename, *type);

fopen()函数中第一个形式参数表示文件名, 可以包含路径和文件名两部分。

返回值:文件顺利打开后,向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中,在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。
一般而言,打开文件后会做一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理。
type有以下三种形态字符串:
r 以只读方式打开文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

a (append 追加)  若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。

fopen函数用来打开一个文件,其调用的一般形式为:

文件指针名=fopen(文件名,使用文件方式)

其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。 “使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。eg: FILE *fp;fp=("file a","r");(意义是在当前目录下打开文件file a, 只允许进行“读”操作,并使fp指向该文件)。

eg:FILE *fphzkfphzk=fopen("d:\\a","rb")其意义是打开d驱动器磁盘的根目录下的文件a, 这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“\\ ”中的第一个表示转义字符,第二个表示根目录。

“rb”      只读打开一个二进制文件,只允许读数据。用了“b”参数就表示以二进制方式读写,故读写操作需要使用fread和fwrite函数


fclose()函数

fclose()函数用来关闭一个由fopen()函数打开的文件 , 其调用格式为:

int fclose(FILE *stream);

该函数返回一个整型数。当文件关闭成功时, 返回0, 否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。

例子:

FILE *fpOut=fopen(“c:\\a.txt”,”w+”);

int a=1;

fprintf(fpOut,”%d”,a);

fclose(fpOut);

可参考文章:http://dwz.cn/2Ko4zA

http://dwz.cn/2JZ0p2

Day Day Up—— ——fseek()函数的用法的更多相关文章

  1. PHP fseek() 函数

    定义和用法 fseek() 函数在打开的文件中定位. 该函数把文件指针从当前位置向前或向后移动到新的位置,新位置从文件头开始以字节数度量. 如果成功该函数返回 0,如果失败则返回 -1.请注意,移动到 ...

  2. 有关日期的函数操作用法总结,to_date(),trunc(),add_months();

    相关知识链接: Oracle trunc()函数的用法 oracle add_months函数 Oracle日期格式转换,tochar(),todate() №2:取得当前日期是一个星期中的第几天,注 ...

  3. Oracle to_date()函数的用法

    Oracle to_date()函数的用法 to_date()是Oracle数据库函数的代表函数之一,下文对Oracle to_date()函数的几种用法作了详细的介绍说明,供您参考学习. 在Orac ...

  4. js中bind、call、apply函数的用法

    最近一直在用 js 写游戏服务器,我也接触 js 时间不长,大学的时候用 js 做过一个 H3C 的 web的项目,然后在腾讯实习的时候用 js 写过一些奇怪的程序,自己也用 js 写过几个的网站.但 ...

  5. C中的fseek函数使用

    函数名:fseek函数 头文件:#include<stdio.h> 功能:把与fp有关的文件位置指针放到一个指定位置. 格式:  int fseek(FILE *stream, long ...

  6. Oracle trunc()函数的用法

    Oracle trunc()函数的用法 /**************日期********************/1.select trunc(sysdate) from dual --2013-0 ...

  7. freemarker内置函数和用法

    原文链接:http://www.iteye.com/topic/908500 在我们应用Freemarker 过程中,经常会操作例如字符串,数字,集合等,却不清楚Freemrker 有没有类似于Jav ...

  8. matlab中patch函数的用法

    http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...

  9. JavaScript中常见的数组操作函数及用法

    JavaScript中常见的数组操作函数及用法 昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下 ...

随机推荐

  1. [Wc2009]shortest

    传送门 终于把这题过了,了了我两年前写堵塞的交通一晚上无果的心结 因为是6要注意蛇皮走位啊!!这种-> S //Achen #include<bits/stdc++.h> #defi ...

  2. <Yii 学习>写入日志

    $postStr ='test:'.(empty( $GLOBALS["HTTP_RAW_POST_DATA"])?'':$GLOBALS["HTTP_RAW_POST_ ...

  3. ShadowGun 图形技术分析

    https://zhuanlan.zhihu.com/p/27966138 ShadowGun虽然是2011年的移动平台的游戏demo,但是里面的很多优化技巧到现在来看都是很值得学习的,毕竟是上过西瓜 ...

  4. 基于BP神经网络的字符识别研究

    基于BP神经网络的字符识别研究 原文作者:Andrew Kirillov. http://www.codeproject.com/KB/cs/neural_network_ocr.aspx 摘要:本文 ...

  5. BZOJ2342:[SHOI2011]双倍回文

    浅谈\(Manacher\):https://www.cnblogs.com/AKMer/p/10431603.html 题目传送门:https://www.lydsy.com/JudgeOnline ...

  6. BZOJ3489:A simple rmq problem

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

  7. 第一章计算机网络和因特网-day01

    什么是因特网: 其一:构成因特网的基本硬件与软件. 其二:为分布式应用提供服务的联网基础设施. 终端机器称为主机( host ) 或者端系统( end system ) 端系统通过通信链路(commu ...

  8. Haproxy状态监控配置教程

    https://www.cnblogs.com/tianciliangen/p/7985881.html 方法一:在defaults段增加如下配置: stats refresh 30s #统计页面自动 ...

  9. Makefile 自动产生依赖 ***

    代码如下: 其实这里主要是为每个C文件建立一个同名的后缀为.d.该文件的作用是使用gcc的-M属性来自动生成.o文件的头文件依赖关系. 第1,2,4都好理解. 第2行解释: 使用gcc -M 的属性将 ...

  10. 浅谈Java中的对象和对象引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...