C从文件中删除最后n个字符

我需要使用C代码从文件中删除最后n个字符。 首先我试图使用’\ b’,但它返回一个分段错误。 我在这里和这里看到了类似问题的有趣答案,但我更愿意使用mmap函数来做到这一点,如果可能的话。 我知道通过创建临时文件来截断文件,并将chars写入temp直到原始文件的某个偏移量可能更简单。 问题是我似乎不明白如何使用mmap函数来做到这一点,看不出我需要传递给那个函数的参数,特别是addresslengthoffset 。 从我读过的内容来看,我应该在flags使用MAP_SHAREDPROT_READ|PROT_WRITE使用PROT_READ|PROT_WRITE

函数定义说:

 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; } 

为什么不使用:

  #include  #include  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时检查errno ,看看错误是什么。 使用例如strerror从错误代码中获取可打印的字符串。

不幸的是, mmap不允许您更改底层文件对象的大小。

相反,我建议简单地截断你的文件,使用这样的东西:

 truncate(filename, new_length);