在牛客网遇到的一个程序题中用到了函数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. THUPC2017 小 L 的计算题

    求 $k=1,2,\cdots,n \space \space \sum\limits_{i=1}^n a_i^k$ $n \leq 2 \times 10^5$ sol: 时隔多年终于卡过去了 之前 ...

  2. 畅通工程(自己写的BFS,但后面想了下并查集更好更快)

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

  3. npm install -d

    nodejs Error: Cannot find module 'xxx'错误 解决方案: 确定package.json里有添加相应的依赖配置 使用npm install -d 可以自动配置pack ...

  4. ipad与iphone的屏幕分辨率

    1.ipad分辨率,iphone 6 iPhone设备      尺寸 分辨率                   点iPhone 3和3s  3.5英寸    (320×480)         3 ...

  5. FPGA中竞争冒险问题的研究

    什么是竞争冒险? 1 引言     现场可编程门阵列(FPGA)在结构上由逻辑功能块排列为阵列,并由可编程的内部连线连接这些功能块,来实现一定的逻辑功能. FPGA可以替代其他PLD或者各种中小规模数 ...

  6. LdapContext获取对象的属性

    //            dn = "cn=1,cn=Users,DC=域名,DC=COM";//            Attributes answer = ctx.getA ...

  7. Spring Boot Starter 速查

    Spring Boot应用启动器基本的一共有40多种,常用的如下 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2)spring ...

  8. Day2-VIM(五):复制

    粘帖 p 粘帖 复制的形式可以很多,但是粘帖的形式却没多少 无非就是加数字达到多次粘帖什么的 其实准确的说,p应该是放置的意思 不过我也搞不清是paste还是put的缩写 单词和字符复制 ynl 向右 ...

  9. 怎样增加phpmyadmin导入文件上限

    1 2 3 分步阅读 百度经验:jingyan.baidu.com phpMyAdmin 是一个用PHP编写的,可以通过 web 方式控制和操作 MySQL 数据库.因为操作简单被广大的使用mysql ...

  10. eclipse中server location为灰色,不能修改

    Eclipse中tomcat service设置发布时间︰选择window ----show view---services可以看到服务的面板双击tomcat进入配置界面Service Locatio ...