如何从文件中读取大量的float?
How read a large number of float from file?
我有一个包含大量数字的文件,我需要读取每一行,然后将该行中的每个数字放入一个数组中。
这是我文件的两行:
7.7560198e+002 8.2334910e+002 9.7819197e+002 1.4330775e+003 3.0535763e+003 3.3218925e+003 1.7164341e+003 3.1848433e+003 4.9317846e+002 3.4466984e+002 4.7654154e+002 4.9282917e+002 9.5322001e+001 1.2369945e+002 5.3310001e+001 1.0394150e+002 3.1919280e+003 2.1591746e+003 2.1608040e+003 3.6585112e+003
7.1244665e+002 1.4142187e+003 1.7148456e+003 1.3126353e+003 3.4328919e+003 2.8380069e+003 2.8432808e+003 3.6142229e+003 3.3866501e+002 3.9236491e+002 5.0149915e+002 5.9447907e+002 1.3568213e+002 5.9164038e+001 7.1649000e+001 1.3451865e+002 2.2922576e+003 1.8212714e+003 2.9237970e+003 5.1605066e+003
我试过这个代码:
FILE *f = fopen(pathInput,"r");
if(f==NULL) {
printf("Error\n");
return -1;
}
int i, j, columnsNumber=0, rowsNumber=0;
char c;
c = fgetc(f);
// count number of column with the first line
for(i=0;c != '\n'; i++) {
if (c==' ') {
while(c==' ')
c = fgetc(f);
numCol++;
}
c = fgetc(f);
}
// count the rows
while(!feof(f)){
c = fgetc(f);
if(c == '\n'){
rowsNumber++;
}
}
float input[(rowsNumber)* columnsNumber];
for(j=0; j< rowsNumber;j++){
for (i = 0; i < columnsNumber; i++){
fscanf(f, "%f ", input[i] );
}
}
for(i=0;i<10; i++){
printf("%f\n", input[i]);
}
fclose(f);
但它不起作用,我收到此警告:
warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float *’ [-Wformat=]
printf("%f\n", input[i]);
在您的代码中,您创建了一个指向浮点数的指针数组。您实际上是想创建一个浮点数数组。该声明如下所示。注意缺少 float *
.
float input[rowsNumber * columnsNumber];
届时,您会收到来自 fscanf()
的警告。您应该传递一个指向已分配内存的指针。所以:
fscanf(f, "%f ", &input[j*columnsNumber + i]);
而且,您还会遇到问题,因为您正试图读取该文件两次。您需要关闭并重新打开文件,或者将文件重置为使用 fseek()
.
查看文件的开头
最后,我不是 100% 确定这一点,但我认为在计算一列中的浮点数和一行中的浮点数之间,你可能会漏掉一个'\n'
个字符。
我有一个包含大量数字的文件,我需要读取每一行,然后将该行中的每个数字放入一个数组中。
这是我文件的两行:
7.7560198e+002 8.2334910e+002 9.7819197e+002 1.4330775e+003 3.0535763e+003 3.3218925e+003 1.7164341e+003 3.1848433e+003 4.9317846e+002 3.4466984e+002 4.7654154e+002 4.9282917e+002 9.5322001e+001 1.2369945e+002 5.3310001e+001 1.0394150e+002 3.1919280e+003 2.1591746e+003 2.1608040e+003 3.6585112e+003
7.1244665e+002 1.4142187e+003 1.7148456e+003 1.3126353e+003 3.4328919e+003 2.8380069e+003 2.8432808e+003 3.6142229e+003 3.3866501e+002 3.9236491e+002 5.0149915e+002 5.9447907e+002 1.3568213e+002 5.9164038e+001 7.1649000e+001 1.3451865e+002 2.2922576e+003 1.8212714e+003 2.9237970e+003 5.1605066e+003
我试过这个代码:
FILE *f = fopen(pathInput,"r");
if(f==NULL) {
printf("Error\n");
return -1;
}
int i, j, columnsNumber=0, rowsNumber=0;
char c;
c = fgetc(f);
// count number of column with the first line
for(i=0;c != '\n'; i++) {
if (c==' ') {
while(c==' ')
c = fgetc(f);
numCol++;
}
c = fgetc(f);
}
// count the rows
while(!feof(f)){
c = fgetc(f);
if(c == '\n'){
rowsNumber++;
}
}
float input[(rowsNumber)* columnsNumber];
for(j=0; j< rowsNumber;j++){
for (i = 0; i < columnsNumber; i++){
fscanf(f, "%f ", input[i] );
}
}
for(i=0;i<10; i++){
printf("%f\n", input[i]);
}
fclose(f);
但它不起作用,我收到此警告:
warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float *’ [-Wformat=]
printf("%f\n", input[i]);
在您的代码中,您创建了一个指向浮点数的指针数组。您实际上是想创建一个浮点数数组。该声明如下所示。注意缺少 float *
.
float input[rowsNumber * columnsNumber];
届时,您会收到来自 fscanf()
的警告。您应该传递一个指向已分配内存的指针。所以:
fscanf(f, "%f ", &input[j*columnsNumber + i]);
而且,您还会遇到问题,因为您正试图读取该文件两次。您需要关闭并重新打开文件,或者将文件重置为使用 fseek()
.
最后,我不是 100% 确定这一点,但我认为在计算一列中的浮点数和一行中的浮点数之间,你可能会漏掉一个'\n'
个字符。