忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台论坛 博客 认证专区 大话IT 文库 沙龙 自测 下载 频道自动化运维 虚拟化 服务器 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 8371 | 回复: 25

请问、c 语言里怎么实现在文件的某个位置写入文件结束符号? [复制链接]

帖子
415
主题
125
精华
0
可用积分
73
专家积分
0
在线时间
19 小时
注册时间
2004-07-04
最后登录
2011-12-15
论坛徽章:
0
发表于 2009-06-02 06:48:39 |显示全部楼层
是用VC++写的控制台程序,是c 程序

我想打开一个已经存在的文件,把文件位置指针移动到文件的某个位置,在这里写入文件结束标记,只保留文件结束标记前面的那些内容,后面的都不要了,

这样该怎么实现呢,我的困惑是,写入文件结束符号的语句是什么呢?


或者,一个类似的情况,用读写的方式打开一个已经存在的文件,用rewind函数把位置指针移动到文件开始的位置,写入文件结束符号,这样,文件就变成空文件了,问题是,该怎么写入文件结束符号呢

高手表走,帮忙则个!我google 了,也百度了,没有结果啊,跪求!

Rank: 8Rank: 8

帖子
17009
主题
75
精华
0
可用积分
63521
专家积分
110
在线时间
2843 小时
注册时间
2006-09-07
最后登录
2014-05-22
论坛徽章:
1
2013新春纪念徽章
日期:2013-01-21 17:33:35
发表于 2009-06-02 07:41:39 |显示全部楼层
ftruncate()
truncate 是截断的意思。C 语言参考手册上应有对这个函数的介绍,详询 10086。
The PDP-7, introduced in 1965, featured the 18b product line's first mass storage operating system (DECsys, based on DECtapes). It was also the development system for the first versions of UNIX.

Rank: 3Rank: 3

帖子
4986
主题
170
精华
0
可用积分
2766
专家积分
0
在线时间
972 小时
注册时间
2007-02-25
最后登录
2014-03-12
论坛徽章:
0
发表于 2009-06-02 09:02:38 |显示全部楼层
原帖由 langue 于 2009-6-2 07:41 发表
详询 10086。


干嘛不是114

老菜鸟一点都不爱学习

Rank: 3Rank: 3

帖子
1170
主题
3
精华
0
可用积分
2557
专家积分
20
在线时间
239 小时
注册时间
2006-01-06
最后登录
2013-03-10
论坛徽章:
0
发表于 2009-06-02 18:05:10 |显示全部楼层
以二进制方式打开,定位到这个位置,写入EOF符。
不过,后面那部分,系统没回收。
2楼才是正解。
我的BLOG:http://blog.csdn.net/beepbug/

Rank: 7Rank: 7Rank: 7

帖子
7110
主题
190
精华
18
可用积分
16875
专家积分
66
在线时间
1453 小时
注册时间
2003-08-25
最后登录
2012-05-16
论坛徽章:
1
2013新春纪念徽章
日期:2013-01-21 17:33:35
发表于 2009-06-02 18:43:32 |显示全部楼层
原帖由 beepbug 于 2009-6-2 18:05 发表
以二进制方式打开,定位到这个位置,写入EOF符。
不过,后面那部分,系统没回收。
2楼才是正解。


“不过,后面那部分,系统没回收。”, 系统没有回收是什么意思?
Email: johnye@webizmail.com

Rank: 3Rank: 3

帖子
1170
主题
3
精华
0
可用积分
2557
专家积分
20
在线时间
239 小时
注册时间
2006-01-06
最后登录
2013-03-10
论坛徽章:
0
发表于 2009-06-02 20:26:28 |显示全部楼层
原帖由 思一克 于 2009-6-2 18:43 发表
“不过,后面那部分,系统没回收。”, 系统没有回收是什么意思?


以CP/M系(包括后来的DOS)为例。外存分配以簇为单元。所有的空闲簇组成一个空闲链。建立一个文件时,从空闲链里摘取足够的空闲簇,组成一个已用链,对应于这个文件。这个是存储的分配。当文件被删时,将其对应的已用链放回空闲链去,叫存储的回收。
正常的系统,是一条空闲链,加若干条已用链。
文件长度因追加写而增长时,也会引起存储的分配。同样,对文件做截割时,也会引起存储的回收。
譬如,文件系统的簇长是4KB,有一文件,现长4090B,你追加6B,没发生存储分配,再追加1B,就得先从空闲链里摘一个簇,串在原有的簇后,再做写操作。
其它系统,说法不一,但原理大同小异。
我的BLOG:http://blog.csdn.net/beepbug/

Rank: 7Rank: 7Rank: 7

帖子
7110
主题
190
精华
18
可用积分
16875
专家积分
66
在线时间
1453 小时
注册时间
2003-08-25
最后登录
2012-05-16
论坛徽章:
1
2013新春纪念徽章
日期:2013-01-21 17:33:35
发表于 2009-06-02 20:51:30 |显示全部楼层
“以二进制方式打开,定位到这个位置,写入EOF符。
不过,后面那部分,系统没回收。”

那在文件的一个中间位置写入一个EOF字符就能使EOF后面的部分变为系统没回收的吗

你举一个你熟悉的系统的例子,比如WINDOWS等,要写入什么字符才能将字符后面的部分变为系统没回收的?
Email: johnye@webizmail.com

Rank: 3Rank: 3

帖子
1922
主题
368
精华
1
可用积分
2634
专家积分
5
在线时间
1965 小时
注册时间
2005-08-30
最后登录
2014-07-01
论坛徽章:
1
天秤座
日期:2014-05-30 11:30:12
发表于 2009-06-02 21:09:18 |显示全部楼层
原帖由 思一克 于 2009-6-2 20:51 发表
“以二进制方式打开,定位到这个位置,写入EOF符。
不过,后面那部分,系统没回收。”

那在文件的一个中间位置写入一个EOF字符就能使EOF后面的部分变为系统没回收的吗

你举一个你熟悉的系统的例子,比 ...


这个跟文件系统有关,windows的文件系统不了解。

传统的UNIX的文件系统的文件模型就是一个大字节袋,lseek一个中间位置写EOF字符,只是修改文件内容,不会修改文件大小。
必须调用文件系统提供的truncate接口来截断文件。
慷慨陈词,岂能皆如人意,鞠躬尽瘁,但求无愧我心。
stay hungry, stay foolish
http://personal.riverusers.com/~thegrendel/
http://www.tldp.org/LDP/abs/  http://bash.webofcrafts.net/

Rank: 8Rank: 8

帖子
17009
主题
75
精华
0
可用积分
63521
专家积分
110
在线时间
2843 小时
注册时间
2006-09-07
最后登录
2014-05-22
论坛徽章:
1
2013新春纪念徽章
日期:2013-01-21 17:33:35
发表于 2009-06-02 21:16:31 |显示全部楼层

回复 #2 langue 的帖子

修正一下。truncate() 和 ftruncate() 是两个功能相同的系统调用,存在于 Linux、BSD 等操作系统当中,查看 truncate(2) 即可获取相关说明。
如果是 MSVC,则应该用 _chsize() 函数,可以查 MSDN,详询 10000。
The PDP-7, introduced in 1965, featured the 18b product line's first mass storage operating system (DECsys, based on DECtapes). It was also the development system for the first versions of UNIX.
我就是噩梦!

Rank: 3Rank: 3

帖子
5599
主题
442
精华
1
可用积分
2839
专家积分
85
在线时间
2236 小时
注册时间
2006-06-24
最后登录
2014-08-22
论坛徽章:
0
发表于 2009-06-02 22:28:17 |显示全部楼层
什么文件系统有EOF?

您需要登录后才可以回帖 登录 | 注册

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP