对于小文件,干净点的方法是
2. 文件全部读入内存缓冲区1,关闭文件,然后复制到缓冲区2,复制的时候跳过要删除的内容
3. 然后重新以w方式打开文件,把缓冲区2的内容写入文件
4. 释放两个内存缓冲区
C运行库相关的函数为fopen, fclose, fread, fwrite, 分配村内malloc,释放内存free, 复制memcpy或者循环。
Windows API为CreateFile, CloseHandle, ReadFile, WriteFile。分配内存HeapAlloc, 释放内存HeapFree。大内存可以直接用Windows API VirtualAlloc和VirtualFree,这两个函数按页64k分配内存,可以申请巨大内存。
#include <stdio.h>void main() {
FILE *fin,*fout
int c
fin=fopen("t.txt","r")
fout=fopen("t.tmp","w")
while (1) {
c=fgetc(fin)
if (EOF==c) break
if ('\n'==c) break
}
if (EOF!=c)
while (1) {
c=fgetc(fin)
if (EOF==c) break
fputc(c,fout)
}
fclose(fin)
fclose(fout)
remove("t.txt")
rename("t.tmp","t.txt")
}
一个文件内的内容加载到内存之后是连续存储的。(至少这种小文件,不超过4KB的)如果想达到删除一行的效果。至少有三种办法可以实现
一、最简单的办法,建议读到链表里,删除其中一个节点。然后再覆盖写回到文件。
二、找到要删除的位置,fseek到该位置,将之后需要保留的文件内容,从这里开始写。
三、利用内存映射,将文件映射到内存,直接对内存修改,但是对内存修改,也是需要类似于方法2,将需要保留的内容重新移动位置。
综上,方法一最简单。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)