请教各位,文件读写的问题。

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 打赏 收藏 转发到动态 举报
写回复
用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,而不是缓冲区的大小.

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧