C语言中整数数组写入文件问题求助
嘿,我来帮你搞定这个文件写入的问题——你遇到的坑其实是对fwrite的参数理解有点偏差,咱们一步步捋清楚:
先搞懂fwrite的参数逻辑
fwrite(ptr, size, count, stream)这四个参数的核心意思是:
ptr:要写入的数据起始地址size:单个数据元素的字节数(比如你写int数组,这里就该是sizeof(int))count:要写入的元素个数(比如你的数组有600个int,这里就写600)stream:目标文件指针
你之前的代码犯了两个关键错误:
- 用
sizeof(char)当size:每个int被拆成1字节写入,而int通常是4字节(依平台而定),所以文件里是int的原始字节(对应乱码ASCII),这不是语法错误,但完全不符合你要写入完整int数据的需求。 - 改
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
相关产品推荐
相关产品推荐

