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