如何在C 语言中以纯文本的形式将二维数组存储到.dat文件?
我正在尝试将一个二维数字数组存储到.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
避免 "%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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
