在牛客网遇到的一个程序题中用到了函数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. 树莓派(Linux)与镜像源

    树莓派学习笔记--修改树莓派软件源 1. linux 镜像源文件 >> vim /etc/apt/sources.list 可在树莓派官网 http://www.raspbian.org/ ...

  2. nginx location配置与rewrite配置

    注:原文出处 www.linuxidc.com/Linux/2015-06/119398.htm 1. location正则写法 一个示例: location =/{ # 精确匹配 / ,主机名后面不 ...

  3. vim-addon-manager install youcompleteme

    /****************************************************************************** * vim-addon-manager ...

  4. Reinforcement Learning Q-learning 算法学习-1

  5. centos安装教程

      centos7和6.x有很大的差别,在第一次安装的时候遇到了很多坑,一共安装了三次才成功 如果是用window自带的Hyper-v装centos时 安装包在\\10.10.10.1\ShareDo ...

  6. HDU4825(字典树+贪心)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total S ...

  7. [转载]关于linux下system()函数的总结

    1.曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.这里必须要搞懂system()函数,因为有时你不得不面对它. 2.先来看一下system()函数的简 ...

  8. Linux内核 - 定时器

    #include <linux/timer.h> //头文件 struct timer_list mytimer; //定义变量 static void my_timer(unsigned ...

  9. 机器学习:SVM(非线性数据分类:SVM中使用多项式特征和核函数SVC)

    一.基础理解 数据:线性数据.非线性数据: 线性数据:线性相关.非线性相关:(非线性相关的数据不一定是非线性数据) 1)SVM 解决非线性数据分类的方法 方法一: 多项式思维:扩充原本的数据,制造新的 ...

  10. 在IIS下配置自定义的报错页面

    这里介绍在IIS中配置自定义出错页面的方法,主要以404为例,其他状态可类推 1.远程桌面连接IIS所在的服务器,进入控制面板>系统和安全>管理工具,双击打开IIS管理器,选择需要配置的网 ...