c语言偏移一个字节,文件偏移量与C语言中的流定位
一、文件偏移量
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语言中的流定位相关推荐
- 我的一个关于文件的程序 - [C语言]
2005-09-05 我的一个关于文件的程序 - [C语言] #include<stdio.h> void main() { char ch; FILE* fp; if((fp=fopen ...
- c语言打开一个html文件路径,C语言文件处理
-C语言文件的打开和关闭
C语言中,打开文件就是将其从外部存储器调入内存,并定义一个文件指针指向该文件,进而实现用指针对文件的读写操作(见图 1a) ). 图 1:文件的打开与关闭 使用 fopen( ) 函数打开文件的格式如 ...
- C语言 define 防止头文件重复包含 - C语言零基础入门教程
目录 一.头文件重复包含编译器报错 1.简单的理解头文件重复包 2.老流氓的理解头文件重复包 二.通过宏定义解决头文件重复包含 1.通过 #ifndef / #define 解决头文件重复包含 2.通 ...
- c语言设置一个选择数字的程序,C语言编一个数字益智小游戏
程序功能及运行情况 设计的程序是一个数字益智游戏,旨在培养小朋友玩家的数学思维,提高玩家的数学能力.游戏共设有四个不同的小游戏,分别是一位数四则运算.两位数四则运算.找最值游戏.排序游戏.程序能实现产 ...
- c语言10怎么打开文件,Lecture 10 C语言文件操作
博主不定期更新[保研/推免.C/C++.5G移动通信.Linux.生活随笔]系列文章,喜欢的朋友[点赞+关注]支持一下吧! Lecture 10 文件 1. 文件 1.1 格式化输入输出 printf ...
- 用c语言设计一个年历系统流程图,用C语言编写一个年历.docx
黑龙江八一农垦大学理学院 <C 程序设计>课程设计报告 2011-2012 学年第二学期 设计题目: 指导教师: 用 C 语言设计一个年历系统 魏老师 完成时间:2012 年 6 月 13 ...
- c语言程序的类型文件是什么,C语言中的文件结构类型FILE
在c语言中的文件概述一文中我们说过在c语言中有两种类型的文件:ASCII文件和二进制文件.ASCII文件很简单就能搞定,新建一个txt文件,然后随便写点内容,保存就成了.但是二进制文件怎么写呢? 这个 ...
- c语言 判断一个图是否全连通_C语言:程序运行流程图与顺序结构语句
程序运行流程图 流程图是描述问题处理步骤的一种常用图形工具,它是由一些图框和流程线组成的.流程图描述问题的处理步骤,形象直观,便于阅读.画流程图时必须按照功能选用相应的流程图符号,常用的流程图符号如下 ...
- C语言编写一个四位数的和,c语言编写一段程序,输入一个四位数,输出各位数字的和...
用C语言编写程序,输入一个正整数n(1 #include"stdio.h"intmain(){\x09inti,j,n;\x09inta[12];\x09intmin,mx;\x0 ...
最新文章
- OpenCV(二)逐像素的图像复制、图像边缘检测(自实现和API实现)
- python在linux下安装方法(解决旧版本冲突)
- MySQL 为什么我的MySQL会“抖一下“?
- QT,C++最好的调试工具(抽象定义上的工具)
- 计算机类高职院校课题,高职院校公共计算机类课程体系构建的教改研究
- javascript中常用数组方法详细讲解
- Socket开发探秘--基于Json格式的数据协议收发
- ios隐藏导航栏底线条和导航、状态栏浙变色
- golang面向对象思想和实现
- live555学习笔记-RTSPClient分析
- 1. JavaScript 与 PHP 的语法区别
- java datagrid导出excel_Datagrid数据导出到Excel文件给客户端下载的几种方法
- RabbitVCS终极安装办法(ubuntu14.04)
- Arduino应用开发——手机APP控制LED
- 玩转数据可视化之R语言ggplot2:(一)ggplot2实现箱线图、小提琴图、直方图等图形(快速入门)
- 面试题集锦——不断更新
- PHP友情链接检测代码
- 聊聊被注销的TMQ公众号
- java中utf-8怎么设置_eclipse中UTF-8设置
- 基于imx6ull打造流媒体视频监控:ffmpeg + nginx + rtmp
热门文章
- mysql二进制日志内容说明_MySQL二进制日志相关问题详细说明
- python 素描化图像_python实现图片素描效果
- just函数python_提升 Python 性能 Numba 与 Cython
- linux 查看内核属性,怎么查看linux操作系统
- cpu风扇一会转一会停_空调维修|空调开机一会就停显示e1|空调维修方法
- javascript控制html高,Javascript可以控制css吗?
- redis 多线程_Java架构师Redis单线程?别逗了,Redis6.0多线程重磅来袭
- Pandas数据探索分析,分享两个神器!
- 永久白嫖!发现官方漏洞,希望不要被封杀!
- 代码也浪漫:用Python放一场烟花秀!