如何在C 语言中以纯文本的形式将二维数组存储到.dat文件?

编程语言 2026-07-11

我正在尝试将一个二维数字数组存储到.dat文件中,但该文件不是可读格式。我的目标是导出到Excel。我正在尝试把数组写入 spectrum.dat 文件:

float lambda_arr[51];
    for (int j = 0; j<51; j++) {
        lambda_arr[j] = 300+(j*10);
    }

    float lambda_R[51][2];
    for (int k = 0; k<51; k++) {
        fcomplex r2[51];
        double k_0_2[51];
        lambda_R[k][0] = lambda_arr[k]; printf("%.8f ", lambda_R[k][0]);

        k_0_2[k] = (2*M_PI)/lambda_arr[k];
        fcomplex M_L_2[2][2] = {{Complex((float) cos(k_0[k]*h_L), (float) 0), Complex((float) 0, (float) sin(k_0[k]*h_L)/Y_L)}, {Complex((float) 0, (double) Y_L*sin(k_0[k]*h_L)), cos(k_0[k]*h_L)}};
        r2[k] = cdiv(csub(cadd(cmult(Y_0, M_L_2[0][0]), cmult(Y_0, cmult(Y_s, M_L_2[0][1]))), csub(M_L_2[1][0], cmult(Y_s, M_L_2[1][1]))), cadd(cmult(Y_0, M_L_2[0][0]), cadd(cmult(Y_0, cmult(Y_s,M_L_2[0][1])), cadd(M_L_2[1][0], cmult(Y_s, M_L_2[1][1])))));

        lambda_R[k][1] = pow(ccabs(r[k]), 2);
    }

    FILE* spectrum;
    spectrum = fopen("[filepath here]\\spectrum.dat", "w");

    fprintf(spectrum, "%-15s %-15s\n", "Wavelength / nm", "Reflectance");

    for (int l = 0; l<51; l++) {
        fprintf(spectrum, "%-15f %-15f\n", lambda_R[l][0], lambda_R[l][1]);
    }

    fclose(spectrum);

spectrum.dat 显示:

w�
��!�>���?�k�͔>`�{�?;�0�y�>3��?�BY[%�>�>��?��S�'і>��_�?aeG�|�> a5�?Ýv��(�>`��?%"�5�Ԙ>���?����Y��>�t/�?�*�#&,�>@@��?K����ך>��3�?�3����>�V#�?�߈�/�>�p��?q<��Wۜ>�T��?��w$��>@=]�?5E��2�>�F��?��%e�ޞ>`�L�?�M7܉��>�+��?-i�)+�>��?^+-eq�>�i�?���Ơ> 5�?��>���>`���?�q��r�> ��?"4PS�ȡ>��ْ?S�؎��>�ul�?��a�vt�>�B��?�z�]ʢ>3�?�<sAC �>�u��?��|)v�>�f�?H���̣>��?y�
��!�>�s��?�E�/�w�>`��?�k�ͤ>@nr�?ʧ��#�>֐�?=�0�y�>���?nN�uϥ>��۱?�BY[%�>��U�?��ʔA{�>���?�S�'Ѧ> Ց�?2W�'�>`�L�?ceG�|�>�?����ҧ>���?ŝv��(�>}d�?�_���~�>@���?'"�5�Ԩ>� K�?X�qs*�> ���?����Y��>@�6�?�h"�?֩>���?�*�#&,�>@� �?�3_��>l��?

解决方案

在将浮点数以文本形式输出时,有一个要点对于作为Excel使用的 .csv 文件尤为有效:应使用指数记数法。

.csv文件

1,2.2
3.30E-03,4.40E+04
-5.50E-55,-6.60E+66

Excel文件
Excel 文件

避免 "%f" 将浮点数打印到文本文件中。

大约一半的浮点数在输出时会显示为0.000000,因为这些数字都很小。

也许大约有40% 的浮点数较大,文本中会包含大量无信息的数字。

一般来说,应使用指数表示法并具有足够的精度,以避免信息丢失,

可选的替代方案:

printf("%.*g", DBL_DECIMAL_DIG,     some_double); // decimal exponential or decimal fixed notation
printf("%a",                        some_double); // Hex notation
printf("%.*e", DBL_DECIMAL_DIG - 1, some_double); // Always decimal exponential notation
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章