使用C语言将二维字符数组写入TXT文件失败,求排查错误
问题排查与修复
你的代码主要存在以下几个问题:
sizeof(image)计算错误:在函数参数中,二维数组image[height][width]会退化为指向一维数组的指针,此时sizeof(image)得到的是指针的大小(通常是4或8字节),而非整个二维数组的总字节数,导致写入的数据不完整。- 未检查文件打开状态:如果
fopen调用失败(比如无写入权限、路径无效),会返回NULL,直接调用fwrite和fclose会触发未定义行为。 - 文件打开模式适配问题:写入文本文件时,使用
"wb"二进制模式虽能写入内容,但文本文件更适合用"w"文本模式,这不是核心错误,但建议修正。
修复后的代码
#include <stdio.h> #include <stdlib.h> char A[10][10] = { {'~', 'S', 'S', 'S', 'S', 'S', '~', '~', '~', 'S'}, {'S', '~', '~', '~', '~', '~', '~', '~', '~', 'S'}, {'S', '~', '~', 'S', 'S', 'S', '~', 'S', '~', '~'}, {'S', '~', '~', '~', '~', '~', '~', 'S', '~', '~'}, {'S', '~', 'S', 'S', 'S', '~', '~', '~', '~', '~'}, {'~', 'S', '~', '~', '~', '~', '~', '~', '~', '~'}, {'~', 'S', '~', '~', '~', '~', 'S', '~', '~', '~'}, {'~', 'S', '~', '~', '~', '~', 'S', '~', '~', 'S'}, {'~', 'S', '~', 'S', 'S', '~', '~', '~', '~', 'S'}, {'~', '~', '~', '~', '~', '~', '~', '~', '~', 'S'} }; void saveImage(int height, int width, char image[height][width], const char* file_name) { FILE *file = fopen(file_name, "w"); if (!file) { perror("Failed to open file"); return; } // 计算总字节数:高度 × 宽度 × 单个字符大小 size_t total_bytes = (size_t)height * width * sizeof(char); fwrite(image, sizeof(char), total_bytes, file); // 可选:如果希望文本文件每行对应数组一行,可替换上面的fwrite为以下循环 // for (int i = 0; i < height; i++) { // fwrite(image[i], sizeof(char), width, file); // fputc('\n', file); // } fclose(file); } int main() { saveImage(10, 10, A, "some_file.txt"); return 0; }
说明:
- 用
height * width * sizeof(char)精准计算总字节数,确保写入完整的二维数组内容。 - 添加
fopen返回值检查,通过perror输出错误信息,方便定位文件打开失败的原因。 - 可选的逐行写入逻辑可以让生成的文本文件格式更直观,每行对应数组的一行数据。
内容的提问来源于stack exchange,提问作者3nondatur
相关产品推荐
相关产品推荐

