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

使用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;
}

说明:

  1. 用height * width * sizeof(char)精准计算总字节数,确保写入完整的二维数组内容。
  2. 添加fopen返回值检查,通过perror输出错误信息,方便定位文件打开失败的原因。
  3. 可选的逐行写入逻辑可以让生成的文本文件格式更直观,每行对应数组的一行数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:53:14