免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5298 | 回复: 15
打印 上一主题 下一主题

[函数] 数据增加/修改/删除过后保存文件函数怎么写 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-21 15:53 |只看该作者 |正序浏览
数据都放在数组保存到文件里。

我对其中的数组增加/删除/修改过后,保存的时候怎么写呢?

我在想着直接跑到以前保存的位置写入,再把后面的移动一下位置.
但是苦于不知道怎么写这个函数,有没有把文件按块移动的函数呢?

或者大家有没有别的更好的方法请指教一下

论坛徽章:
0
16 [报告]
发表于 2005-07-22 12:11 |只看该作者

数据增加/修改/删除过后保存文件函数怎么写

还有个问题就是他的操作系统就一定支持mmap?
不支持该怎么办?

论坛徽章:
0
15 [报告]
发表于 2005-07-22 12:10 |只看该作者

数据增加/修改/删除过后保存文件函数怎么写

确实好办法,省了好多事情哦。会者不难,那确实,要是我第一次作,我可能就会傻啦吧唧的设计一个文件格式用指针这里转到那里那里转到这里的,哈哈

论坛徽章:
0
14 [报告]
发表于 2005-07-22 11:41 |只看该作者

数据增加/修改/删除过后保存文件函数怎么写

我是看到这个:
http://fanqiang.chinaunix.net/program/code/2001-08-19/2187.shtml
里面有读一行的,改一行的,添一行的,就是没有删一行的。。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
13 [报告]
发表于 2005-07-22 11:32 |只看该作者

数据增加/修改/删除过后保存文件函数怎么写

呵呵.前面的人已经说的很清楚啦.mmap 不错啊.~ 判断有几个\n 就行了.
然后就w方式打开文件写回去.~~
把第n行的略过去就行了.

论坛徽章:
0
12 [报告]
发表于 2005-07-22 11:26 |只看该作者

数据增加/修改/删除过后保存文件函数怎么写

怎么删除文件中的一行?
    取得行号n,读n行之前,再读n行之后,保存到新文件,删除原文件,改新文件名为原文件名?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
11 [报告]
发表于 2005-07-22 08:59 |只看该作者

数据增加/修改/删除过后保存文件函数怎么写

楼主.都一天了.你还没写代码呢?~

论坛徽章:
0
10 [报告]
发表于 2005-07-22 08:54 |只看该作者

数据增加/修改/删除过后保存文件函数怎么写

mmap我没有用过?用起来方便不?
chsize()这个函数我不知道gcc里面有没有这个东东
有哪位大虾能说说看用哪一种方法最好呢,

论坛徽章:
0
9 [报告]
发表于 2005-07-22 08:51 |只看该作者

数据增加/修改/删除过后保存文件函数怎么写

下面是我回答别人提出的类似问题的贴子,里面使用的操作适合你的需求,梢未修改一下就得:

楼主的需求是可以做到的,只不过有一点点麻烦而已。假设5515在文件偏移量100处,如果新改写的字符串加上'\0'的字符数量少于5515的字符数量,直接改写就行。如果比5515多,那就要用系统输入输出函数先把文件的长度增加两者的差值,再把后面的数据往后移,空出足够的地方,再写入,简化代码如下:(因为不知道楼主的5515是以int形式写入文件的,还是以四个字符分别写入的,我假设是以5515四个字符写入的)

#include<io.h>;
#include<string.h>;

int i,iFile;
long lSub,lNewLength,lFileSub,lFileLength;
char string[]="abcdef";   //假设这是改写字符串,并且长度大于5515
char temp;
iFile=open("test.dat",O_RDWR);  //以可读可写方式打开文件
lSub=strlen(string)-4+1;   //4是5515字符数量,差值包括'\0';
lseek(iFile,0l,SEEK_END);
lFileSub=tell(iFile)-100-4+1;  //算出5515后面的字节数量;
lFileLength=filelength(iFile);
lNewlength=lFileLength+lSub;
chsize(iFile,lNewlength);   //增加文件test.dat的长度,原文件末尾多出来的lSub个字节会自动
                              以'\0'填充
for(i=0;i<lFileSub;i++)
{
    lseek(iFile,-i-lSub,SEEK_END);
    read(&temp,sizeof(char),1,iFile);
    lseek(iFile,-i,SEEK_END);
    write(&temp,sizeof(char),1,iFile);
}                           //移动末尾的字节块。本来想一次过用malloc移动整块字节块的,但
                               想到楼主文件可能很大,不一定能分配到足够的内存,所以还是一
                              个一个字节地移动。
lseek(iFile,100l,SEEK_SET);
write(string,sizeof(char),strlen(string)+1,iFile);
close(iFile);

论坛徽章:
0
8 [报告]
发表于 2005-07-22 06:29 |只看该作者

数据增加/修改/删除过后保存文件函数怎么写

mmap是好办法.
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP