在 Matlab 中是一個命令,但我需要用 C(實際上是 C ,但沒關系)撰寫一些簡單的函式。我現在的目標是創建三個“雙”陣列,它們取自一個表格檔案。該檔案如下所示(QEOS.txt):
T rho P
11.605 2.51188643150958e-13 4.28547303990553e-16
11.605 3.16227766016838e-13 4.28547303990553e-16
11.605 3.98107170553497e-13 4.28547303990553e-16
11.605 5.01187233627271e-13 4.28547303990553e-16
11.605 6.30957344480194e-13 4.28547303990553e-16
11.605 7.94328234724282e-13 4.28547303990553e-16
11.605 1e-12 4.28547303990553e-16
11.605 1.25892541179417e-12 4.28547303990553e-16
14.6098294038713 2.51188643150958e-13 5.45304484892599e-16
14.6098294038713 3.16227766016838e-13 5.45304484892599e-16
14.6098294038713 3.98107170553497e-13 5.45304484892599e-16
14.6098294038713 5.01187233627271e-13 5.45304484892599e-16
14.6098294038713 6.30957344480194e-13 5.45304484892599e-16
...........
我希望第一列成為變數“T”,第二列成為“rho”,第三列成為“P”。應該不難吧?所以我有:
#include <stdio.h>
#include <stdlib.h>
struct threeNum{
double n1, n2, n3;
};
int main(){
int n;
struct threeNum num;
double P,T,rho;
FILE *fptr;
fptr = fopen("QEOS.txt","r");
for(n = 1; n < 25; n){
fread(&num, sizeof(struct threeNum), 1, fptr);
printf("n1: %f \tn2: %f \tn3: %f \n", num.n1, num.n2, num.n3);
}
fclose(fptr);
T=num.n1;
rho=num.n2;
P=num.n3;
return 0;
}
“25”只是一個例子。在任何情況下,代碼都會列印 0.000 和隨機垃圾。怎么了?PS:我得到“ **檢測到堆疊粉碎** :終止中止(核心轉儲)”
uj5u.com熱心網友回復:
正如評論中指出的那樣,在閱讀格式化文本時,您必須使用基于文本的函式fscanf,而不是二進制函式,例如。fread
您應該始終測驗庫函式的回傳值,因為它們中的大多數都可能失敗并導致嚴重的結果(程式崩潰或誤導性輸出)。
注意
T=num.n1;
rho=num.n2;
P=num.n3;
在這個程式中沒有效果。
建議:使用fgetsandsscanf進行更多控制,逐行閱讀。
一個簡單的例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
double P, T, rho;
FILE *fp = fopen("QEOS.txt", "r");
if (!fp) {
perror("fopen");
return EXIT_FAILURE;
}
char line[512];
if (!fgets(line, sizeof line, fp) || !strstr(line, "T rho P")) {
fprintf(stderr, "Invalid or missing header.\n");
return EXIT_FAILURE;
}
while (fgets(line, sizeof line, fp)) {
if (3 == sscanf(line, "%lf%lf%lf", &T, &rho, &P)) {
printf("n1: %f\tn2: %e\tn3: %e\n", T, rho, P);
}
}
fclose(fp);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/523644.html
標籤:C
