如何用C语言从文本文件读取复数数据并存入矩阵
解决C语言读取文本中复数数据到矩阵的问题
先明确你代码里的几个核心问题:
- 矩阵类型错误:你定义的
double matrixA[2][2]是普通双精度数组,无法存储复数,必须改为_Complex double matrixA[2][2](C标准复数类型)。 - 格式字符串不匹配:文本中的复数格式是
实部+虚部*I(比如0.2e-3+0.3*I),但你用的%lf+i%lf和实际格式不符,导致读取失败。 - creal/cimag用法错误:这两个函数的参数是复数变量本身,不需要取地址,原代码中
creal(&matrixA[i][j])写法错误。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <complex.h> int main(void) { FILE* ptr = fopen("abc.txt", "r"); if (ptr == NULL) { printf("无法打开文件。\n"); return EXIT_FAILURE; } // 定义复数类型的矩阵 _Complex double matrixA[2][2]; double real_part, imag_part; // 匹配文本中的复数格式读取数据 for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { // 先读取实部和虚部到临时变量,再组装成复数 if (fscanf(ptr, "%lf+%lf*I", &real_part, &imag_part) != 2) { printf("读取数据出错!\n"); fclose(ptr); return EXIT_FAILURE; } matrixA[i][j] = real_part + imag_part * I; } } // 打印读取到的复数矩阵 printf("读取到的复数矩阵:\n"); for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { printf("%.4e+%.4e*I\t", creal(matrixA[i][j]), cimag(matrixA[i][j])); } printf("\n"); } fclose(ptr); return EXIT_SUCCESS; }
关键细节说明
- 复数类型:
_Complex double是C标准定义的双精度复数类型,配合<complex.h>头文件使用,I是预定义的虚数单位。 - 格式字符串:
%lf+%lf*I严格匹配你文本中的复数格式,%lf读取实部,+匹配实部虚部间的加号,%lf*I读取虚部并匹配*I后缀;如果文本存在负虚部(比如0.1-0.2*I),可改为%lf%lf*I,负号会被%lf自动识别为数值符号。 - 错误处理:添加
fscanf返回值检查,确保每次成功读取2个数值(实部+虚部),避免文件格式异常导致程序崩溃。 - 打印格式:用
%.4e以科学计数法输出,和原文本格式统一,也可根据需求改为%f等其他格式。
运行输出示例
读取到的复数矩阵: 2.0000e-04+3.0000e-01*I 1.0000e-01+1.0000e-01*I 3.0000e-01+1.0000e-01*I 1.0000e-01+4.0000e-01*I
内容的提问来源于stack exchange,提问作者user19013072
相关产品推荐
相关产品推荐

