6

我需要使用 C 代码从文件中删除最后 n 个字符。起初我试图使用'\ b',但它返回一个分段错误。我在这里这里看到了类似问题的有趣答案,但如果可能的话,我更愿意使用mmap函数来做到这一点。我知道通过创建一个临时文件并将字符写入 temp 直到原始文件的某个偏移量来截断文件可能会更简单。问题是我似乎不明白如何使用mmap函数来执行此操作,看不到我需要传递给该函数的参数,特别addresslengthoffset. 从我读过的内容来看,我应该使用MAP_SHAREDinflagsPROT_READ|PROT_WRITEin 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;
}
4

3 回答 3

7

为什么不使用:

   #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);
于 2013-06-09T19:10:43.233 回答
3

从文件中读取除n字节之外的所有字节并写入临时文件,关闭原始文件,将临时文件重命名为原始文件。

或者使用 egtruncate或类似的功能,如果你有的话。


另外,打开文件失败不一定是找不到,您应该检查errno失败以查看错误是什么。使用例如strerror从错误代码中获取可打印的字符串。

于 2013-06-09T19:03:10.047 回答
2

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

相反,我建议简单地截断您的文件,使用如下内容:

truncate(filename, new_length);
于 2013-06-09T19:06:53.420 回答