一、文件偏移量

1、每个打开的文件都有一个与其相关联的“当前文件偏移量”。它通常是一个非负整数,用以度量从文件开始处计算的字节数。

2、内核为所有打开的文件维持一张文件表。文件表项包含文件偏移量。

3、默认情况下,当打开一个文件时,除非指定O_APPEND选项,否则偏移量为0。

4、读、写操作都是从当前文件偏移量处开始,并使偏移量被设置为0.

5、两个进程打开同一个文件时,每个进程都会有自己的文件表项(只有一个V节点),都有自己对该文件的当前文件偏移量。

6、文件的定位可以大于文件的当前长度,此时,对文件的下一次写将加长该文件,并在文件中构成一个空洞。位于文件中但没有写过的字节都被读为0。文件中的空洞并不要求在磁盘上占用存储区。

7、文件的当前偏移量可能为负值。但是普通文件的当前偏移量必须为非负值。

8、管道型文件(比如fifo、socket、pipe)不可以设置文件位置偏移量。

二、定位标准I/O流

1、ftell

long ftell(

FILE* stream

);

测试文件的当前位置。成功时返回当前文件位置指示,若出错返回-1L.

2、fseek

定位文件位置。

(1)函数原型

int fseek(

FILE* stream,

long offset,

int origin

);

(2)参数

offset:离origin的偏移字节

origin:SEEK_CUR:文件当前位置;SEEK_END:文件尾;SEEK_SET:文件开头

(3)返回值

成功时返回0;失败时返回-1.

因为偏移量可能为负值,因此测试时不要测试是否小于0,而要测试是否等于-1。

(4)说明

1)对于文本文件,它们的当前位置可能不能以简单的字节偏移量来衡量。因为可能以不同格式存放文本文件。

为了定位文本文件,origin必须为SEEK_SET,offset只能为0,或是对该文件的ftell返回的值。

2)对于二进制文件,文件位置指示器是从文件起始位置开始度量,并以字节为度量单位。ftell用于二进制文件时,其返回值就是字节位置。

ISO C中并不要求对二进制文件支持SEEK_END,因为有些系统要求二进制文件的长度是某个幻数的整数倍,结尾非实际内容部分则填充为0.但是在UNIX中,对于二进制文件支持SEEK_END。

3)在文本文件中,输入时最后的CTRL+Z被解释为文件尾的字符。

使用fopen打开文件时,会检测最后的CTRL+Z,并把它移除。

(5)示例

/* FSEEK.C: This program opens the file FSEEK.OUT and

* moves the pointer to the file's beginning.

*/

#include void main( void )

{

FILE *stream;

char line[81];

int result;

stream = fopen( "fseek.out", "w+" );

if( stream == NULL )

printf( "The file fseek.out was not opened\n" );

else

{

fprintf( stream, "The fseek begins here: "

"This is the file 'fseek.out'.\n" );

result = fseek( stream, 23L, SEEK_SET);

if( result )

printf( "Fseek failed" );

else

{

printf( "File pointer is set to middle of first line.\n" );

fgets( line, 80, stream );

printf( "%s", line );

}

fclose( stream );

}

}

3、rewind

void rewind(

FILE *stream

);

将一个流设置到文件的起始位置。

4、fgetpos、fsetpos

int fgetpos(

FILE *stream,

fpos_t *pos

);

int fsetpos(

FILE *stream,

const fpos_t *pos

);

(1)说明

这两个函数是ISO C引入的,使用抽象数据类型fpos_t记录文件位置。这种数据类型可以根据需要定义为一个足够大的数,用以记录文件位置。

需要移植到非UNIX系统上运行的应用程序应当使用fgetpos和fsetpos

(2)示例

// crt_fgetpos.c

// This program uses fgetpos and fsetpos to

// return to a location in a file.

#include int main( void )

{

FILE *stream;

fpos_t pos;

char buffer[20];

if( fopen_s( &stream, "crt_fgetpos.txt", "rb" ) ) {

perror( "Trouble opening file" );

return -1;

}

// Read some data and then save the position.

fread( buffer, sizeof( char ), 8, stream );

if( fgetpos( stream, &pos ) != 0 ) {

perror( "fgetpos error" );

return -1;

}

fread( buffer, sizeof( char ), 13, stream );

printf( "after fgetpos: %.13s\n", buffer );

// Restore to old position and read data

if( fsetpos( stream, &pos ) != 0 ) {

perror( "fsetpos error" );

return -1;

}

fread( buffer, sizeof( char ), 13, stream );

printf( "after fsetpos: %.13s\n", buffer );

fclose( stream );

}

c语言偏移一个字节,文件偏移量与C语言中的流定位相关推荐

  1. 我的一个关于文件的程序 - [C语言]

    2005-09-05 我的一个关于文件的程序 - [C语言] #include<stdio.h> void main() { char ch; FILE* fp; if((fp=fopen ...

  2. c语言打开一个html文件路径,C语言文件处理 -C语言文件的打开和关闭

    C语言中,打开文件就是将其从外部存储器调入内存,并定义一个文件指针指向该文件,进而实现用指针对文件的读写操作(见图 1a) ). 图 1:文件的打开与关闭 使用 fopen( ) 函数打开文件的格式如 ...

  3. C语言 define 防止头文件重复包含 - C语言零基础入门教程

    目录 一.头文件重复包含编译器报错 1.简单的理解头文件重复包 2.老流氓的理解头文件重复包 二.通过宏定义解决头文件重复包含 1.通过 #ifndef / #define 解决头文件重复包含 2.通 ...

  4. c语言设置一个选择数字的程序,C语言编一个数字益智小游戏

    程序功能及运行情况 设计的程序是一个数字益智游戏,旨在培养小朋友玩家的数学思维,提高玩家的数学能力.游戏共设有四个不同的小游戏,分别是一位数四则运算.两位数四则运算.找最值游戏.排序游戏.程序能实现产 ...

  5. c语言10怎么打开文件,Lecture 10 C语言文件操作

    博主不定期更新[保研/推免.C/C++.5G移动通信.Linux.生活随笔]系列文章,喜欢的朋友[点赞+关注]支持一下吧! Lecture 10 文件 1. 文件 1.1 格式化输入输出 printf ...

  6. 用c语言设计一个年历系统流程图,用C语言编写一个年历.docx

    黑龙江八一农垦大学理学院 <C 程序设计>课程设计报告 2011-2012 学年第二学期 设计题目: 指导教师: 用 C 语言设计一个年历系统 魏老师 完成时间:2012 年 6 月 13 ...

  7. c语言程序的类型文件是什么,C语言中的文件结构类型FILE

    在c语言中的文件概述一文中我们说过在c语言中有两种类型的文件:ASCII文件和二进制文件.ASCII文件很简单就能搞定,新建一个txt文件,然后随便写点内容,保存就成了.但是二进制文件怎么写呢? 这个 ...

  8. c语言 判断一个图是否全连通_C语言:程序运行流程图与顺序结构语句

    程序运行流程图 流程图是描述问题处理步骤的一种常用图形工具,它是由一些图框和流程线组成的.流程图描述问题的处理步骤,形象直观,便于阅读.画流程图时必须按照功能选用相应的流程图符号,常用的流程图符号如下 ...

  9. C语言编写一个四位数的和,c语言编写一段程序,输入一个四位数,输出各位数字的和...

    用C语言编写程序,输入一个正整数n(1 #include"stdio.h"intmain(){\x09inti,j,n;\x09inta[12];\x09intmin,mx;\x0 ...

最新文章

  1. OpenCV(二)逐像素的图像复制、图像边缘检测(自实现和API实现)
  2. python在linux下安装方法(解决旧版本冲突)
  3. MySQL 为什么我的MySQL会“抖一下“?
  4. QT,C++最好的调试工具(抽象定义上的工具)
  5. 计算机类高职院校课题,高职院校公共计算机类课程体系构建的教改研究
  6. javascript中常用数组方法详细讲解
  7. Socket开发探秘--基于Json格式的数据协议收发
  8. ios隐藏导航栏底线条和导航、状态栏浙变色
  9. golang面向对象思想和实现
  10. live555学习笔记-RTSPClient分析
  11. 1. JavaScript 与 PHP 的语法区别
  12. java datagrid导出excel_Datagrid数据导出到Excel文件给客户端下载的几种方法
  13. RabbitVCS终极安装办法(ubuntu14.04)
  14. Arduino应用开发——手机APP控制LED
  15. 玩转数据可视化之R语言ggplot2:(一)ggplot2实现箱线图、小提琴图、直方图等图形(快速入门)
  16. 面试题集锦——不断更新
  17. PHP友情链接检测代码
  18. 聊聊被注销的TMQ公众号
  19. java中utf-8怎么设置_eclipse中UTF-8设置
  20. 基于imx6ull打造流媒体视频监控:ffmpeg + nginx + rtmp

热门文章

  1. mysql二进制日志内容说明_MySQL二进制日志相关问题详细说明
  2. python 素描化图像_python实现图片素描效果
  3. just函数python_提升 Python 性能 Numba 与 Cython
  4. linux 查看内核属性,怎么查看linux操作系统
  5. cpu风扇一会转一会停_空调维修|空调开机一会就停显示e1|空调维修方法
  6. javascript控制html高,Javascript可以控制css吗?
  7. redis 多线程_Java架构师Redis单线程?别逗了,Redis6.0多线程重磅来袭
  8. Pandas数据探索分析,分享两个神器!
  9. 永久白嫖!发现官方漏洞,希望不要被封杀!
  10. 代码也浪漫:用Python放一场烟花秀!