C 以奇怪的方式使用fwrite

C 以奇怪的方式使用fwrite,c,io,fwrite,C,Io,Fwrite,如果我写 if((fp = fopen(some_path, "wb"))) { int a = 50000; fwrite("c",sizeof(char),a,fp); fclose(fp); fp = fopen(some_path, "rb"); char arr[50000]; fread(arr, sizeof(char), a, fp); printf("%s\n", arr); fclose(fp); } 它

如果我写

if((fp = fopen(some_path, "wb")))
{   
    int a = 50000;
    fwrite("c",sizeof(char),a,fp);
    fclose(fp);
    fp = fopen(some_path, "rb");
    char arr[50000];
    fread(arr, sizeof(char), a, fp);
    printf("%s\n", arr);
    fclose(fp);
}
它当然会打印“c”,但文件大小约为50kb

我的问题是:

  • 这到底是怎么回事
  • 如果我将var a修改为60000,可执行文件就会崩溃,所以我考虑使用fwrite的一些内部缓冲区。如何获得其最大容量
  • fwrite()向文件写入什么内容才能使文件大小达到~50kb,并且仍然只打印“c”(我在这里期待一些mambo巨型字符)
  • 函数的这种用法有多错误,我想非常快地编写一个特定大小的空白文件(使用虚拟数据),利用这种行为不产生大的缓冲区并使用内存来编写“真实”数据,但仍然减少fwrite调用(例如,我可能需要编写一个10 gb的文件),这是错误的吗
  • 这到底是怎么回事

    我认为它不起作用。你做了些胡说八道的事,结果没有结果。给你的印象是,它将在未来发挥作用。那是个失败

    如果我将var a修改为60000,可执行文件就会崩溃,所以我考虑使用fwrite的一些内部缓冲区。如何获得其最大容量

    没有缓冲区。您只是在
    c之后访问内存中的任何内容␀
    “c”
    创建。当它崩溃时,这是因为您到达了无法读取的内存页(例如,尚未分配)

    fwrite()向文件写入什么内容才能使文件大小达到~50kb

    “c”
    及其后返回的地址处内存中发生的任何事情

    仍然只打印“c”(我在这里期待一些曼波巨星字符)

    它不仅打印
    c
    。尝试类似于
    hextump-C文件
    od-C文件

    这个函数的用法有多错误

    难以置信。如果
    a
    的任何值大于2,它都可能崩溃

    我想非常快地编写一个特定大小的空白文件(使用虚拟数据)

    truncate
    的文档中说:“如果以前的文件较短,它将被扩展,扩展部分将读取为空字节('\0')”,因此您可以使用以下内容:

    if(截断(路径、长度)){
    perror(“截断”);
    出口(1);
    }
    
    提示:
    sizeof(char)
    保证
    1
    fread
    不保证缓冲区将被NUL终止,因此将缓冲区发送到
    printf“%s”
    fwrite将写入字符串
    “c”
    直到
    50000
    chars,虽然字符串只包含两个已知字符
    'c'
    '\0'
    ,但fwrite将从内存中写入字符(不可寻址访问),而您只获得输出
    c
    的原因是printf一直在读取,直到它到达空终止符,在本例中,空终止符就在
    'c'
    字符之后,试着打开文件看看你自己谢谢你的解释,我想这不应该起作用,但它还是起了作用。。让我很好奇的是,访问随机内存“仅仅”是一种未定义的行为。撞车是一种可能性,但不是唯一的一种。