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

如何用C语言从文本文件读取复数数据并存入矩阵

解决C语言读取文本中复数数据到矩阵的问题

先明确你代码里的几个核心问题:

  1. 矩阵类型错误:你定义的double matrixA[2][2]是普通双精度数组,无法存储复数,必须改为_Complex double matrixA[2][2](C标准复数类型)。
  2. 格式字符串不匹配:文本中的复数格式是实部+虚部*I(比如0.2e-3+0.3*I),但你用的%lf+i%lf和实际格式不符,导致读取失败。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:25:27