IT序号网

c之fwrite 写入大数据失败

lyhabc 2025年05月04日 编程语言 95 0

我发现当我尝试写入一些大数据时 fwrite 失败,如下面的代码所示。

#include <stdio.h> 
#include <unistd.h> 
 
int main(int argc, char* argv[]) 
{ 
    int size = atoi(argv[1]); 
    printf("%d\n", size); 
    FILE* fp = fopen("test", "wb"); 
    char* c = ""; 
    int i = fwrite(c, size, 1, fp); 
    fclose(fp); 
    printf("%d\n", i); 
    return 0; 
} 

代码编译成二进制tw 当我尝试 ./tw 10000 时,效果很好。但是当我尝试像 ./tw 12000 这样的东西时,它失败了。(fwrite() 返回 0 而不是 1) 这是什么原因?我可以通过什么方式避免这种情况?

编辑:当我执行 fwrite(c, 1, size, fp) 时,它返回 8192 而不是我给出的更大尺寸。

第二次编辑:当我编写一个循环运行 size 次,并且每次都是 fwrite(c, 1, 1, fp) 时,它工作得很好。 似乎当 size 太大时(如在第一个编辑中),它只写入大约 8192 字节。 我猜某些东西限制了 fwrite 一次最多写入固定大小的字节。

第三次编辑:以上内容不清楚。 space - w_result != 0 当空间很大时,以下失败,其中空间由我确定,w_result 是总共写入的对象。

w_result = 0; 
char* empty = malloc(BLOCKSIZE * size(char)); 
w_result = fwrite(empty, BLOCKSIZE, space, fp); 
printf("%d lost\n", space - w_result);  

虽然这可以正常工作。

w_result = 0; 
char* empty = malloc(BLOCKSIZE * sizeof(char));  
for(i = 0; i < space; i ++) 
    w_result += fwrite(empty, BLOCKSIZE, 1, fp); 
printf("%d lost\n", space - w_result); 

(每个变量都已声明。)

我更正了提到的答案中的一些错误。但第一个应该根据您的要求工作。

请您参考如下方法:

使用 fwrite(c, size, 1, fp); 你声明 fwrite 应该写入 1 个 size big 的项目,big out of buffer c.

c 只是一个指向空字符串的指针。它的大小为 1。当您告诉 fwrite 在 c 中查找超过 1 个字节的数据时,您会得到未定义的行为。您不能从 c 中写入超过 1 个字节。

(未定义的行为意味着任何事情都可能发生,当您尝试使用 10000 的大小而不是 12000 的大小时它可能看起来工作正常。实现相关的原因可能是有一些可用的内存,也许是堆栈,从 c 开始,向前 10000 个字节,但是在例如 11000 处没有内存,你会得到一个段错误)


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!