文件程序 - fseek不起作用。

3
我在编程中遇到了困难,无法让fseek()函数在我的代码中正常工作。我写的文本不从我指定的位置开始,我不知道为什么。它应该从\n处开始写入,但它只是覆盖整个文本文件。即使我用a打开它,它也不会按照我通过参数命令的位置进行写入。
   fclose(file);
    FILE *file_a = fopen("ex6.txt", "w");

    fseek(file_a, -1, SEEK_END);

    puts("Write text to add:");
    while((letter = getchar()) != '\n')
    {
        fputc(letter, file_a);
    };

发生了什么?为什么这个不起作用?

如果你想要文件的末尾,我预计你会将0传递给fseek。-1则表示在末尾之前的1个字节。 - undefined
抱歉,信息丢失了。我尝试在末尾前面添加文本,比如说2个字符,假设这是我的文件内容:"hello\0" 我想要插入信息 "hell | o\0",覆盖掉 "o\0" 并将自己的文本 " yeah" 放在那里,最终结果应该是:"hell yeah"。但就好像 fseek 不符合我的要求,即使我使用正数作为参考值也不行... - undefined
你的平台是什么?也许这可能有关联吗?"库实现允许不具有有意义地支持SEEK_END(因此,使用它的代码没有真正的标准可移植性)。" http://www.cplusplus.com/reference/cstdio/fseek/ - undefined
2
事实上,我以"w+"模式打开了它,现在一切都很好。看起来它不支持简单的"w"或"a"。谢谢你们的回答,太有帮助了。 - undefined
扩展一下:w截断文件(如果存在),fseek()可以让你在开始往里面放东西后进行跳转。aa+总是写入文件末尾。正如你所发现的,w+保留任何现有内容,允许你进行扩展/覆盖。 - undefined
显示剩余2条评论
1个回答

2
导航到绝对位置只有在以二进制模式打开文件时才有效。当以文本模式打开文件时,fseek() 无法导航到文件中除 0(文件开始)之外的绝对位置,尝试这样做会导致未定义的行为。但是,您可以导航到 ftell() 返回的文件中的引用。造成这种情况的原因是某些操作系统处理某些字符的方式;一些实现允许此操作,但 POSIX 并不强制执行此操作。

我知道您已在评论中解决了此问题,这只是为了结束讨论。


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