You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中整数数组写入文件问题求助

嘿,我来帮你搞定这个文件写入的问题——你遇到的坑其实是对fwrite的参数理解有点偏差,咱们一步步捋清楚:

先搞懂fwrite的参数逻辑

fwrite(ptr, size, count, stream)这四个参数的核心意思是:

  • ptr:要写入的数据起始地址
  • size:单个数据元素的字节数(比如你写int数组,这里就该是sizeof(int))
  • count:要写入的元素个数(比如你的数组有600个int,这里就写600)
  • stream:目标文件指针

你之前的代码犯了两个关键错误:

  1. 用sizeof(char)当size:每个int被拆成1字节写入,而int通常是4字节(依平台而定),所以文件里是int的原始字节(对应乱码ASCII),这不是语法错误,但完全不符合你要写入完整int数据的需求。
  2. 改size后没调整count:你把count写成了sizeof(etData),这是数组的总字节数(600sizeof(int)),当size设为sizeof(int)时,fwrite会尝试写这么多个int元素,总字节数就变成了600sizeof(int)*sizeof(int),远超过数组实际大小,所以直接写入失败,返回0。

正确的二进制写入代码

调整参数后,代码应该是这样的:

int etData[600];
int i;
// 单个int元素的字节数,用sizeof(int)适配不同平台
size_t elem_size = sizeof(int);
// 自动计算数组元素个数,适配不同长度的数组
size_t elem_count = sizeof(etData) / sizeof(etData[0]);

for (i = 0; i < elem_count; i++) {
    etData[i] = analog_et(5);
}

// 一定要检查文件是否打开成功!之前没做这个,可能打开失败都没察觉
// 加"b"表示二进制模式,避免跨平台时自动转换换行符破坏数据
FILE *f = fopen("/home/root/Documents/KISS/Default User/Launch Code/data/data", "wb");
if (f == NULL) {
    perror("Failed to open file");
    return 1; // 根据你的程序逻辑处理错误
}

// 调用fwrite,参数对应正确的元素大小和个数
size_t written = fwrite(etData, elem_size, elem_count, f);
// 检查是否全部写入成功
if (written != elem_count) {
    printf("Warning: Only wrote %zu elements out of %zu\n", written, elem_count);
}

fclose(f);

如果你想写入可读的文本格式

如果不想写二进制,而是要文件里是清晰的整数文本(比如每个数字一行),那应该用fprintf逐个写入:

FILE *f = fopen("/home/root/Documents/KISS/Default User/Launch Code/data/data", "w");
if (f == NULL) {
    perror("Failed to open file");
    return 1;
}

for (i = 0; i < elem_count; i++) {
    fprintf(f, "%d\n", etData[i]); // 每个int转成文本写入,换行分隔
}

fclose(f);

这样打开文件就能看到正常的数字,不会有乱码。

最后提醒

  • 任何文件操作都要加错误检查(打开、写入、关闭),不然出问题很难排查。
  • 二进制写入的文件用文本编辑器打开本来就是乱码,这是正常的,后续用fread按同样的参数读回int数组就能正常解析。

内容的提问来源于stack exchange,提问作者lwilliams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 01:02:32