我需要使用C代码删除文件中的最后n个字符。首先我试图使用'\ b',但它返回一个分段错误。我已经看到类似问题here和here的有趣答案,但如果有可能,我宁愿使用mmap
函数来执行此操作。我知道通过创建临时文件来截断文件,并将chars写入temp直到原始文件的某个偏移量可能更简单。问题是我似乎不明白如何使用mmap
函数来执行此操作,无法查看我需要传递给该函数的参数,特别是address
,length
和offset
。根据我的阅读,我应该使用MAP_SHARED
中的flags
和PROT_READ|PROT_WRITE
中的protect
。
函数定义说:
void * mmap (void *address, size_t length, int protect, int flags, int filedes, off_t offset)
这是我的主要内容:
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: %s\n",argv[1]);
}
else
{
charsToDelete = 5;
fseeko(InputFile,-charsToDelete,SEEK_END);
position = ftello(InputFile);
printf("Pos: %d\n",(int)position);
int i;
//for(i = 0;i < charsToDelete;i++)
//{
// putc(InputFile,'\b');
//}
}
fclose(InputFile);
return 0;
}
答案 0 :(得分:6)
为什么不使用:
#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);
答案 1 :(得分:3)
从文件中读取除n
以外的所有字节并写入临时文件,关闭原始文件,将临时文件重命名为原始文件。
或使用例如如果你有truncate
或类似的功能。
此外,无法打开文件并不一定要找不到它。如果找不到错误,应检查errno
。使用例如strerror
从错误代码中获取可打印的字符串。
答案 2 :(得分:2)
不幸的是,mmap
不允许您更改基础文件对象的大小。
相反,我建议简单地截断你的文件,使用类似的东西:
truncate(filename, new_length);