|
网站首页
|
业界新闻
|
小组
|
威客
|
人才
|
下载频道
|
博客
|
代码贴
|
在线编程
|
编程论坛
|
登录
注册
短消息
我发表的主题
我参与的主题
我收藏的贴子
我上传的附件
我下过的附件
编辑个人资料
我的博客
用户控制面板
搜索
道具
恢复默认风格
碧海青天
秋意盎然
棕红预览
粉色回忆
蓝雅绿
紫色淡雅
青青河草
e点小镇
橘子红了
红红夜思
水晶紫色
雪花飘飘
新年快乐
风格
短消息
论坛展区
帮助
编程论坛
→
开发语言
→
『 C语言论坛 』
→ 位置指示器
我的收件箱(0)
共有
1263
人关注过本帖
标题:
位置指示器
只看楼主
加入收藏
pish
等 级:
新手上路
帖 子:35
专家分:0
注 册:2007-10-6
楼主
收藏
问题点数:0 回复次数:5
位置指示器
有个问题想请问一下,c语言中的rewind()、fseek()等函数可以改变文件位置指示器的位置,可以用这些函数来改变向文件写入数据时的位置吗?我试了,好像不能,不知道对不对.
2007-12-15 21:59
举报帖子
使用道具
赠送鲜花
cosdos
来 自:ShangHai
等 级:
蜘蛛侠
威 望:
6
帖 子:2109
专家分:1385
注 册:2007-6-19
第
2
楼
收藏
得分:0
//----------------------------------------------------------------------------//
二进制I/O:fread() 和 fwrite() 函数
//----------------------------------------------------------------------------//
fwrite()函数的原型是:
size_t fwrite(const void * restrict ptr,
size_t size,
size_t nmemb,
FILE * restrict fp
);
fwrite() 函数将二进制数据写入文件。size_t类型是根据标准C类型定义的。
它是sizeof运算符返回的类型,通常是unsigned int类型,不过具体的实现中可以
选择其他类型。
指针 ptr 是要写入的数据块的地址。size 表示要写入的数据块的大小(以字
节为单位)。nmemb 表示数据块的数目。fp 指定要写入的文件。 例如,要保存一
个 256 字节大小的数据对象(例如一个数组),可以这样做:
char arr[256];
fwrite(arr, 256, 1, fp);
这个函数调用一次将 256 字节大小的arr数组写入到文件。
或者
double ent[10];
fwrite(ent, sizeof(double), 10, fp);
这个函数调用将 ent 数组中的数据写入文件,数据分成10块,
每块都是 double 大小。
fwrite() 中的 void * ptr。
fwrite() 的一个问题就是它的第一个参数不是一个固定类型。
在 ANSI C 函数原型下,这些实际参数都被转换成为指向 void 的指针,这种
指针可以作为一种普通的指针类型工作(ANSI C以前的C对这一参数使用char * 类
型,需要将实际参数的类型指派为这一类型)。
fwrite()函数返回成功写入的项目数。 正常情况下,它与nmemb相等,不过如
果有写入错误的话返回值就会小于 nmemb。
//----------------------------------------------------------------------------//
fread() 函数的原型是:
size_t fread(void * restrict ptr,
size_t size,
size_t nmemb,
FILE * restrict fp
);
ptr 为存储读入的文件数据的内存地址,fp 制定要读取的文件。
使用这个函数来读取通过 fwrite() 写入的文件数据。
例如,要恢复前一个例子中保存的包含10个double值的数组,可以使用以下函数
用调:
double ent[10];
fread(ent, sizeof(double), 10, fp);
该调用将10个double值复制到ent数组中。
fread() 函数返回成功读入的项目数。正常情况下,它与 nmemb 相等;不过
如果有读取错误的话,返回值就会小于 nmemb。
//----------------------------------------------------------------------------//
int feof(FILE * fp) 和 int ferror(FILE * fp) 函数
当标准输入函数返回 EOF 时,通常表示已经到达了文件结尾。 可是,这也有
可能表示发生了读取错误。使用 feof() 和 ferror() 函数可以区分这两种可能性。
如果最近一次输入调用监测到文件结尾, feof() 函数返回一个非零值,否则返回
零值。如果发生读取错误,ferror() 函数返回一个非零值,否则返回零值。
//----------------------------------------------------------------------------//
—>〉Sun〈<—
2007-12-15 23:28
举报帖子
使用道具
赠送鲜花
pish
等 级:
新手上路
帖 子:35
专家分:0
注 册:2007-10-6
第
3
楼
收藏
得分:0
rewind()和fseek()
可是我问的是rewind()和fseek()啊
2007-12-16 09:39
举报帖子
使用道具
赠送鲜花
岳C
等 级:
禁止发言
帖 子:354
专家分:0
注 册:2007-7-16
第
4
楼
收藏
得分:0
提示:
作者被禁止或删除 内容自动屏蔽
坚持到底
2007-12-16 12:51
举报帖子
使用道具
赠送鲜花
pish
等 级:
新手上路
帖 子:35
专家分:0
注 册:2007-10-6
第
5
楼
收藏
得分:0
2007-12-16 19:35
举报帖子
使用道具
赠送鲜花
cosdos
来 自:ShangHai
等 级:
蜘蛛侠
威 望:
6
帖 子:2109
专家分:1385
注 册:2007-6-19
第
6
楼
收藏
得分:0
不好意思,发错了
下面是你要的
//----------------------------------------------------------------------------
rewind()
接受一个 FILE 指针参数
作用是:回到文件开始处
//--------------------------------------------------------------------//
/-------------------------------------------------\
|
文件的起始点模式
|
|-------------------------------------------------|
|
模 式
偏移量的起始点
|
|
SEEK_SRT
文件开始
|
|
SEEK_CUR
当前位置
|
|
SEEK_END
文件结尾
|
\-------------------------------------------------/
fseek()
fseek() 接受3个参数,返回 int 值。
第一个参数是一个指向被搜索文件的 FILE 指针。因该已经使用 fopen()
打开了该文件。
第二个参数成为偏移量(offset),表示从起始点开始要移动的距离
这个参数必须是一个 long 类型的值,可以为正(前移)、负(后移),
也可以为零(保持不动)。
第三个参数是模式,用来标识起始点。在ANSI下,stdio.h 头文件制定了下
列模式敞亮:
模式
偏移量的起始点
SEEK_SET
文件开始
SEEK_CUR
当前位置
SEEK_END
文件结尾
以前实现中可能没有这些定义,而是用数字值0L、1L和2L分别代表
这些模式。(L 后缀标识 long 类型值)
函数允许您像对待数组那样对待一个文件,在 fopen() 打开的文件中直接移
动到任意字节处。
fseek(fp, 0L, SEEK_SET);
// 找到文件的开始处
fseek(fp, 10L, SEEK_SET);
// 找到文件的第11个字节
fseek(fp, 2L, SEEK_CUR);
// 从文件的当前位置向前移动2个字节
fseek(fp, 0L, SEEK_END);
// 到达文件结尾处
fseek(fp, -10L, SEEK_END);
// 从文件结尾处退回10个字节
如果一切正常,fseek()的返回值为0。如果有错误出现,例如试图移动超
出文件范围,则fseek()的返回值为-1。
ftell()
函数以一个 long 类型值返回一个文件的当前位置。在ANSIC下,ftell()函数
在stdio.h头文件中被声明。像最初在UNIX中实现的那样,ftell()函数通过返
回局文件开始处的字节数目来确定文件的位置。文件的第一个字节到文件开始
处的距离是字节0,依次类推。 在ANSI C下,这种定义适用于一二进制模式打
开的文件,但是对于以文本模式打开的文件来讲,不一定是这样。
ANSI C规定,对于文本模式,ftell()返回一个可以用作fseek()的第二个
参数的值。例如,MS-DOS,ftell()返回一个将\r\n看成一个字节的计数值。
//----------------------------------------------------------------------------//
fseek() 和 ftell() 函数的一个潜在问题是它们限制文件的大小只能在 long类型
的表示范围之内。随着日益增长的存储设备容量使得更大的文件也成为可能。
ANSI C引入了两个用来处理较大文件的新的定位函数。这两个函数不是采用long类
型,而是使用一种称为 fpos_t(代表 file position type,文件定位类型)的新类型
来代表位置。fpos_t不是一种基本类型,而是通过其他类型定义的。一个fpos_t类型的
变量或者数据对象可以用来制定文件中的一个位置,它不能是一种数组类型,但除此之
外不再有其他限制。因此C实现可以提供一种满足特殊平台需要的类型; 例如,这种类
型可以作为结构来实现。
ANSI C定义了使用fpos_t的方法。fgetpos() 函数具有下面的原型:
int fgetpos(FILE * restrict stream, fpos_t * restrict pos);
被调用时,该函数在pos所指的位置放置一个fpos_t值;这个值描述了文件中的一个
位置。如果成功,函数返回0,否则返回一个非零值。
fsetpos() 函数具有下面的原型:
int fsetpos(FILE * stream, const fpos_t * pos);
被调用时,该函数使用 pos指向的位置上的那个fpos_t值设定文件指针指向该值所指
示的位置。如果成功,函数返回0;否则返回一个非零值。这个fpos_t值应是通过调用
fgetpos() 函数获得的。
fgetpos()
fsetpos()
//----------------------------------------------------------------------------//
[[italic] 本帖最后由 cosdos 于 2007-12-16 21:00 编辑 [/italic]]
—>〉Sun〈<—
2007-12-16 20:58
举报帖子
使用道具
赠送鲜花
6
1/1页
1
快速回复:
位置指示器
数据加载中...
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019835 second(s), 9 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved