注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天道酬勤 玩物丧志

用勇气去改变可以改变的事情,用胸怀去包容无法改变的事情,用智慧去判断两者的区别

 
 
 

日志

 
 

C语言里怎么实现在文件的某个位置写入文件结束符号?  

2012-10-25 14:53:13|  分类: 嵌入式系统 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://bbs.chinaunix.net/thread-1469416-1-1.html

用VC++写的控制台程序,是c 程序
我想打开一个已经存在的文件,把文件位置指针移动到文件的某个位置,在这里写入文件结束标记,只保留文件结束标记前面的那些内容,后面的都不要了
这样该怎么实现呢,我的困惑是,写入文件结束符号的语句是什么呢?或者,一个类似的情况,用读写的方式打开一个已经存在的文件,用rewind函数把位置指针移动到文件开始的位置,写入文件结束符号,这样,文件就变成空文件了,问题是,该怎么写入文件结束符号呢

 

ftruncate()
truncate 是截断的意思。C 语言参考手册上应有对这个函数的介绍,详询 10086。

 

以二进制方式打开,定位到这个位置,写入EOF符。
不过,后面那部分,系统没回收。
2楼才是正解

 

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

 

修正一下。truncate() 和 ftruncate() 是两个功能相同的系统调用,存在于 Linux、BSD 等操作系统当中,查看 truncate(2) 即可获取相关说明。
如果是 MSVC,则应该用 _chsize() 函数,可以查 MSDN,详询 10000。

 

EOF 是一个状态,压根就不是一个字符。

在文件系统层次上看来,任何字符都是文件内容--没有EOF字符。
在应用程序层次上看,可以有EOF。比如DOS下的文本文件就利用一个0X1B(?)做为EOF.
但即使你写该字符进去,也不可能将EOF以后的文件内容和文件系统脱钩成为系统不回收的东西呀。

文件最后放个EOF(-1或则大于127~255的数都可以作为EOF)

 

是这东西吗  SetEndOfFile(hFile)

  评论这张
 
阅读(1523)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018