我需要从使用C代码的文件中删除最后n个字符。起初我试图使用'b',但它返回分割错误。我在这里和这里看到了类似问题的有趣答案,但如果可能的话,我更喜欢用mmap
函数来做这个。我知道通过创建一个临时文件来截断文件可能会更简单,并向临时文件写入字符,直到原始文件的一些偏移。问题是我似乎不明白如何使用mmap
函数来做到这一点,看不到我需要传递什么参数给那个函数,特别是address
, length
和offset
。从我所读到的,我应该在flags
和protect
中使用MAP_SHARED
和PROT_READ|PROT_WRITE
。
函数定义说:
void * mmap (void *address, size_t length, int protect, int flags, int filedes, off_t offset)
下面是我的main:
int main(int argc, char * argv[])
{
FILE * InputFile;
off_t position;
int charsToDelete;
if ((InputFile = fopen(argv[1],"r+")) == NULL)
{
printf("tdes: file not found: %sn",argv[1]);
}
else
{
charsToDelete = 5;
fseeko(InputFile,-charsToDelete,SEEK_END);
position = ftello(InputFile);
printf("Pos: %dn",(int)position);
int i;
//for(i = 0;i < charsToDelete;i++)
//{
// putc(InputFile,'b');
//}
}
fclose(InputFile);
return 0;
}
为什么不使用:
#include <unistd.h>
#include <sys/types.h>
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
,例如:
charsToDelete = 5;
fseeko(InputFile,-charsToDelete,SEEK_END);
position = ftello(InputFile);
ftruncate(fileno(InputFile), position);
从文件中读取除n
字节外的所有字节并写入临时文件,关闭原文件,将临时文件重命名为原文件
或使用例如truncate
或类似的功能,如果你有它。
同样,打开文件失败并不一定是找不到它,您应该检查errno
失败,看看错误是什么。例如,使用strerror
从错误码中获取一个可打印的字符串。
遗憾的是,mmap
不允许您更改底层文件对象的大小。
相反,我建议简单地截断您的文件,使用如下内容:
truncate(filename, new_length);