以奇怪的方式使用 fwrite

Using fwrite in strange way

如果我写

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

我的问题是:

  1. 这实际上是如何工作的?
  2. 如果我将 var a 修改为 60000,可执行文件就会崩溃,所以我在考虑 fwrite 的一些内部缓冲区。我如何获得它的最大容量?
  3. 为了使文件大小达到 ~50kb 并且仍然只打印,fwrite() 向文件写入了什么 "c"(我期待这里有一些曼波巨型字符)?
  4. 函数的这种用法有多么不对,我想非常快地写一个特定大小的空白文件(使用虚拟数据),为了不做大缓冲区和使用,我利用这种行为是不是错了增加内存以写入 "real" 数据但仍减少 fwrite 调用(我可能需要为 ex. 编写一个 10 GB 的文件)?

How is this actually working?

我认为它不起作用。你做了一些无稽之谈,但没有被发现。这给你的印象是它在未来会起作用。那是一个失败。

If I modify var a to 60000 the executable crashes, so i`m thinking about some internal buffer of fwrite. How do i get its max capacity?

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

What does fwrite() write to the file in order to get the file to ~50kb of size

内存中由 "c" 及以后返回的地址中的任何内容。

and still print only "c"(I was expecting some mambo-jumbo characters here)?

它不只打印 c。尝试 hexdump -C fileod -c file

How wrong is this usage of the function

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

I want to write a blank file of a certain size really fast(with dummy data)

truncate 的文档说:“如果文件以前较短,则对其进行扩展,扩展部分读取为空字节 ('\0')。" 所以你可以使用以下内容:

if (truncate(path, length)) {
   perror("truncate");
   exit(1);
}