社区
C语言
帖子详情
请教各位,文件读写的问题。
liarking
2006-03-14 09:10:16
我从文件中读出数据,想将修改后内容重新写回文件去,但执行程序后文件没变化,以下是主要部分代码,请高手指教,谢谢。
read(fd,pbuf,filelen);
buf=AddFileHead(pbuf,filelen,FileStoreAddr,ValidData);
fd=lseek(fd,0L,SEEK_SET);//这个函数不知道对不对
write(fd,buf,sizeof(HEADLENTH+filelen+4));
close(fd);
...全文
285
16
打赏
收藏
请教各位,文件读写的问题。
我从文件中读出数据,想将修改后内容重新写回文件去,但执行程序后文件没变化,以下是主要部分代码,请高手指教,谢谢。 read(fd,pbuf,filelen); buf=AddFileHead(pbuf,filelen,FileStoreAddr,ValidData); fd=lseek(fd,0L,SEEK_SET);//这个函数不知道对不对 write(fd,buf,sizeof(HEADLENTH+filelen+4)); close(fd);
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
liarking
2006-03-14
打赏
举报
回复
to:duduhaha(三人行必有我师)
我buf里内容就这么长,现把代码贴完整一点,望高手指教!!
void ProcessFile(char *filename)
{
uint8_t *pbuf,*buf;
//uint16_t fd;
uint32_t filelen,fd;
//FILE *fp;
fd=open(filename,O_BINARY | O_RDWR);
filelen=filelength(fd);
//Be sure that the length of file could divide by 4 exactly
if(filelen & 0x03)
{
filelen=(filelen & ~0x03)+4;
}
pbuf=(uint8_t *)malloc(filelen);
memset(pbuf,0,filelen);
read(fd,pbuf,filelen);
buf=AddFileHead(pbuf,filelen);
//fd=lseek(fd,0L,SEEK_SET);
write(fd,buf,sizeof(HEADLENTH+filelen+4));
free(buf);
close(fd);
}
duduhaha
2006-03-14
打赏
举报
回复
write(fd,buf,sizeof(HEADLENTH+filelen+4));
不明白你为什么这么用sizeof(HEADLENTH+filelen+4)?
jinjiajie
2006-03-14
打赏
举报
回复
打开没错
liarking
2006-03-14
打赏
举报
回复
再次求教,在线苦等
jinjiajie
2006-03-14
打赏
举报
回复
问题是没有,但是你已经打开了何必再打开一次?
liarking
2006-03-14
打赏
举报
回复
我在内存里跟踪了,文件的打开和修改都没出错,现在buf里的内容也和我期望的是一致的,现在就是要把buf缓冲区的内容写回原文件,盖掉原来的内容,
fd=open(filename,O_BINARY|O_RDWR);
这样打开有没有问题????
megaboy
2006-03-14
打赏
举报
回复
留意一下当你open()那个文件的时候,是不是用可读可写的方式的!
bluedreammer
2006-03-14
打赏
举报
回复
有些问题是自己可以查的到的。
liarking
2006-03-14
打赏
举报
回复
谢谢楼上,
buf=AddFileHead(pbuf,filelen,FileStoreAddr,ValidData);
程序到这里没错,我现在就是要把buf的内容输出到原来的文件中,原来文件内容要被覆盖掉。
jinjiajie
2006-03-14
打赏
举报
回复
你这样把fd覆盖了....仔细看看lseek的返回值是什么,为0出错,否则返回非0值
恩,最好对每一个步骤作一下容错判断,这个是基本
jinjiajie
2006-03-14
打赏
举报
回复
fd=lseek(fd,0L,SEEK_SET);//
不用赋值
直接lseek(fd,0L,SEEK_SET);就行了
liarking
2006-03-14
打赏
举报
回复
呵呵,谢谢!结贴
jinjiajie
2006-03-14
打赏
举报
回复
fd=lseek(fd,0L,SEEK_SET);//
不用赋值
直接lseek(fd,0L,SEEK_SET);就行了
....我这个说了=没说,搂主都没仔细看
duduhaha
2006-03-14
打赏
举报
回复
fd=lseek(fd,0L,SEEK_SET);
lseek函数正确返回值就是0。你再写实际上就是往stdin写了,而你原来的fd值一般至少为3。
所以你该这么用
lseek(fd,0L,SEEK_SET)
看看《unix环境高级编程》,对文件操作会有较深的理解。
liarking
2006-03-14
打赏
举报
回复
to:duduhaha(三人行必有我师)
非常感谢,sizeof错误已经更正,但不知为什么执行后原文件没发生任何变化??
fd=lseek(fd,0L,SEEK_SET);
该句执行后fd为0,不知为什么
duduhaha
2006-03-14
打赏
举报
回复
首先,在你上面这个程序中不要注释掉lseek,因为存在读写交替.
当打开文件进行读写时,必须在读/写操作之间调用lseek.写的时候属于覆盖操作。写入的东西只不过是覆盖了原来的内容,如果写入的数据比原来的数据少,则原来的数据部分仍然会存在。
其次,sizeof(HEADLENTH+filelen+4)的用法错误.
你看看下面的例子.
#include <stdio.h>
int main(void)
{
char a[10];
int i = sizeof(10);
int j = sizeof(a + 4);
printf("%d %d\n",i,j);
return 0;
}
HEADLENTH+filelen+4是个32位的整数,对它sizeof结果是4,而不是缓冲区的大小.
Python读写文件
1、使用Python读写文件一项基本技能,该课程中详细讲解了三种常用的
文件读写
方式2、详细讲解了os模块中如何操作文件和路径,更好的辅助完成文件的读写操作,熟练对os模块的使用
关于RAID1的读写
问题
================= ============== 15 回复 最新回复: 2013-12-26 下午10:05 阿超_SteveZhou 转至原始发贴 15. Re:
请教
关于RAID1的读写
问题
阿超_SteveZhou 2013-12-26 下午10:05 (回复
多进程写入mysql_
请教
大家一个 SQLite 多进程读写相关的
问题
在项目中遇到需要多进程读写 SQLite 的情况,特来
请教
,望不吝赐教!进程 A 首先运行:打开 SQLite 数据库,并进行读写操作,操作时会生成 Hot Journal 文件进程 B 其次运行,打开 SQLite 数据库,只读想
请教
:当 B 进行打开数据库(或者是建立数据库 Connection )的时候,如果遇到 A 正在读写,此时 Hot Journal 存在,此处的 Rollback 操...
请教
如何读写shp字体文件
现在我想从shp字库中读出汉字,然后按照笔画的顺序显示该字,请问各位大侠如何实现?
请问如何提高文件的读写速度
摘抄某个位置的帖子.URL忘记了. 在提取游戏资源的时候,我编程用的是C++中的 ifstream , ofstream, 可是在读写文件的时候速度很慢,硬盘狂转,请问一下有人知道如何提高速度么?多谢!悠久扬笛2007-05-15 11:22用内存映射方式可能会好点 Asakur
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章