如何在 C 语言中删除文本文件的最后一个字符?

4

我希望删除文本文件的最后一个字符。我有一个保存字符串的代码,我只需要删除最后一个'\n'。

我已经尝试过以下方法:

fseek(fp, -1, SEEK_END);
fputs("", fp);

以下是完整的代码:
void saveGIF(FrameNode** head)
{
    FILE* fp = 0;
    FrameNode* curr = *head;
    int i = 1;
    int howManyFrames = framesInList(head);
    char c = 0;
    char filePath[SIZE] = { 0 };

    if (curr == NULL)
    {
        printf("Nothing to save, add more frames and than save\n");
    }
    else
    {
        printf("Where to save the project? enter a full path and file name\n");
        getchar();
        myFgets(filePath, SIZE);
        fp = fopen(filePath, "w+");
        if (fp != NULL)
        {
            while (curr)
            {
                fprintf(fp, "%s %d %s\n", curr->frame->name, curr->frame->duration, curr->frame->path);
                curr = curr->next;
                i++;
            }
            fseek(fp, -1, SEEK_END);
            fputs("", fp);
            fclose(fp);
        }
        else
        {
            printf("Error! canot create file\n");
        }
    }
}

你可能需要编写一个全新的文件,尽管似乎应该有一个合理的解决方案。但我怀疑如果存在的话,它不会涉及到 fputs - Mad Physicist
1
平台?在POSIX上,答案是ftruncate()truncate()。在Windows上,答案可能会有所不同。 - Jonathan Leffler
重复问题中得分第二高的答案涉及Windows,并有一些与Win64等相关的评论。我的答案也有链接-到MSDN和其他答案。 - Jonathan Leffler
你可以使用 fputs(" ", fp) 将最后的换行符覆盖为一个空格,但写入空字符串不会改变文件内容。你也可以使用 fwrite() 写入一个空字节来覆盖换行符。然而,这两种方法都不会缩短文件长度,不像 truncate() 及其相关函数。 - Jonathan Leffler
你为什么想要这样做?文本文件应该以换行符结束。 - rici
1
@user3121023 谢谢你的回答,非常完美。 - Daniel Shinar
1个回答

2
在ISO C中,唯一的方法是将整个文件复制一份到一个临时文件下,并使用rename将其更改为旧名称。没有办法就地缩短文件。(如果您在Windows上,可能需要在rename之前删除旧名称。)
POSIX添加了ftruncate操作,可以用来就地缩短(或延长)文件。大多数常见的操作系统支持POSIX功能,但Windows不支持。根据您在Windows上使用的编译器,您仍然可能拥有名为ftruncate的函数,因为在Windows上的C运行时经常尝试伪造POSIX功能的子集--许多这些伪造品是不可靠的,但我不知道如何搞砸ftruncate,因为Windows本身确实有一个等效的原始操作,只是名称不同(SetEndOfFile)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接