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



我需要从使用C代码的文件中删除最后n个字符。起初我试图使用'b',但它返回分割错误。我在这里和这里看到了类似问题的有趣答案,但如果可能的话,我更喜欢用mmap函数来做这个。我知道通过创建一个临时文件来截断文件可能会更简单,并向临时文件写入字符,直到原始文件的一些偏移。问题是我似乎不明白如何使用mmap函数来做到这一点,看不到我需要传递什么参数给那个函数,特别是address, lengthoffset。从我所读到的,我应该在flagsprotect中使用MAP_SHAREDPROT_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);

相关内容

  • 没有找到相关文章

最新更新