C fwrite()是否允许您写入超过文件大小末尾的内容?

C fwrite()是否允许您写入超过文件大小末尾的内容?,c,gcc,C,Gcc,如果我有这样的东西,那会允许我写出来吗?如果没有,我怎样才能做到这一点呢?可以在文件的末尾进行写入 但是在a模式(追加模式)fseek对fwrite没有影响 这记录在C标准7.19.5.3 fopen中: 使用append mode(模式参数中的第一个字符为“a”)打开文件会导致对文件的所有后续写入都被强制到文件的当前结尾,而不考虑对fseek函数的中间调用 来源:可以在文件末尾进行写入 但是在a模式(追加模式)fseek对fwrite没有影响 这记录在C标准7.19.5.3 fopen中: 使

如果我有这样的东西,那会允许我写出来吗?如果没有,我怎样才能做到这一点呢?

可以在文件的末尾进行写入

但是在
a
模式(追加模式)
fseek
fwrite
没有影响

这记录在C标准7.19.5.3 fopen中:

使用append mode(模式参数中的第一个字符为“a”)打开文件会导致对文件的所有后续写入都被强制到文件的当前结尾,而不考虑对fseek函数的中间调用


来源:

可以在文件末尾进行写入

但是在
a
模式(追加模式)
fseek
fwrite
没有影响

这记录在C标准7.19.5.3 fopen中:

使用append mode(模式参数中的第一个字符为“a”)打开文件会导致对文件的所有后续写入都被强制到文件的当前结尾,而不考虑对fseek函数的中间调用


来源:

是的,您可以
fwrite
超过文件末尾(在大多数情况下)。如果你做不到这一点,那么测试就失败了(并给出了一个负面的结果)

当然,这需要先前的调用成功并更改写入的文件偏移量。你需要检查一下。正如,
fseek
只能更改偏移量,而
fwrite
不会对附加文件使用偏移量

您可能需要使用其他模式。不要使用
a
append模式

例如,下面可能有文件
tryappend.c
(大约有509个字节):

//文件tryappend.c,运行前将其复制到tryappend.c2
#包括
#包括
内部主(空){
const char*filnam=“tryappend.c2”;
FILE*f=fopen(filnam,“a+”);
如果(!f)
{perror(filnam);exit(exit_FAILURE);};

如果(fseek(f,1024,SEEK_SET)Yes,您可以
fwrite
超过文件末尾(在大多数情况下)。如果您不能,则失败(并给出负面结果)

当然,这需要上一次调用成功并更改写入的文件偏移量。您需要进行检查。因为,
fseek
只能更改偏移量,而该偏移量不会被
fwrite
用于附加文件

您可能希望使用其他模式。不要使用
a
append模式

例如,下面可能有文件
tryappend.c
(大约有509个字节):

//文件tryappend.c,运行前将其复制到tryappend.c2
#包括
#包括
内部主(空){
const char*filnam=“tryappend.c2”;
FILE*f=fopen(filnam,“a+”);
如果(!f)
{perror(filnam);exit(exit_FAILURE);};


如果(fseek(f,1024,SEEK_SET)检查
fseek
的返回值-成功吗?@coderredoc是的,成功了。为什么要这样做?为什么不使用更高级别的抽象(例如…)@学习的基本方法检查
fseek
的返回值-成功吗?@coderredoc是的,成功了。为什么要这样做?为什么不使用更高级别的抽象(例如…)@BasileStarynkevitch要学习你确定吗?在Linux上可能不是这样。那么,我如何打开文件来读写二进制文件,而不删除其内容呢?@BasileStarynkevitch是的,请参阅参考@MauricoMartinez Use
r+b
@d3L:该参考应该包含在你的答案中,你确定吗?在Linux上,它可能不是case.那么,我如何才能在不删除其内容的情况下打开文件进行二进制读写呢?@BasileStarynkevitch是的,请参阅参考@mauricomartinez Use
r+b
@d3L:你的答案中应该包含这一参考。这个答案几乎肯定会在一个问题上抛出许多不好的想法和模糊的特征,而这个问题并没有给出它的任何迹象它还断言了一个可疑的独立读写偏移量模型,这不是append模式的工作原理。这个答案几乎肯定会在一个问题上抛出许多坏主意和模糊的特性,而这个问题没有给出它调用它们的任何指示,实际上也没有什么意义address指出问题出在append模式。它还断言了一个可疑的独立读写偏移量模型,这不是append模式的工作方式。
FILE *f = fopen("file.txt", "ab+");
fseek(f, NUMBER_BIGGER_THAN_FILE_SIZE, SEEK_SET);
fwrite(&someStruct, sizeof someStruct, 1l, f);
// file tryappend.c, copy it to tryappend.c2 before running
#include <stdio.h>
#include <stdlib.h>
int main(void) {
    const char* filnam = "tryappend.c2";
    FILE *f = fopen(filnam, "a+");
    if (!f) 
       { perror(filnam); exit(EXIT_FAILURE); };
    if (fseek(f, 1024, SEEK_SET)<0) 
       { perror("fseek"); exit(EXIT_FAILURE); };
    const char str[] = "//// ADDED STUFF\n";
    if (fwrite(str, sizeof(str), 1L, f)<0) 
       { perror ("fwrite"); exit(EXIT_FAILURE); }
    fclose(f);
    printf("changed %s\n", filnam);
    return 0;
}