[英]C programming: Read (double) numbers from text file, line by line to a 2D array
I have a text file created with excel that contains a table of dimensions 36x35. 我有一个用excel创建的文本文件,其中包含尺寸为36x35的表格。 The values are double numbers (eg 2.58) and the text file looks like this:
值是双数(例如2.58),文本文件如下所示:
1.25 2.31 ...
4.28 2.56 ...
3.27 ...
... ...
I know the dimensions of the table (arr_row, arr_column) so declare a dynamic 2D array: 我知道表的尺寸(arr_row,arr_column),因此声明一个动态2D数组:
double **MUDG_table;
//dynamic allocate array of MUDG_table (1st Dimension)
MUDG_table = calloc(arr_row,sizeof(int *));
//check if the memory has been allocated correctly
if (MUDG_table==NULL)
{
printf("Error allocating memory!\n"); //print an error message
return 1; //return with failure
}
for (cv02=0;cv02<arr_row;cv02++)
{
//dynamic allocate array of MUDG_table (2nd Dimension)
MUDG_table[cv02] = calloc(arr_column, sizeof(int));
//check if the memory has been allocated correctly
if (MUDG_table[cv02]==NULL)
{
printf("Error allocating memory!\n"); //print an error message
return 1; //return with failure
}
}
So far so good. 到现在为止还挺好。 Then I try to read the values from the text file and store them to the array for further processing:
然后,我尝试从文本文件中读取值,并将它们存储到数组中以进行进一步处理:
//************************************************************************************************************//
//read the text file with the values of the gain and save it to the MUDG_table
//************************************************************************************************************//
gain_ptr = fopen("MUDG_text.txt", "r");
if (gain_ptr == NULL)
{
printf("Error Reading File\n");
return 1; //return with failure
}
for (row=0;row<arr_row;row++)
{
for (column=0;column<arr_column;column++)
{
fscanf(gain_ptr, " %1f", &MUDG_table[row][column]);
}
}
fclose(gain_ptr);
and the problem is that the values I get are something like 5.26346e-315#DEN Any ideas what I am doing wrong. 问题是我得到的值类似于5.26346e-315#DEN任何想法我做错了。 Is it because I do not use the EOF?
是因为我不使用EOF吗?
OK, so after going through several posts and thanks to the responses I got here, I changed the code and it seams to work properly. 好的,因此,在浏览了几篇文章并感谢我在这里得到的答复之后,我更改了代码,使接缝正常工作。
First of all the array should be declared as double: 首先,数组应声明为double:
//dynamic allocate array of MUDG_table (1st Dimension)
MUDG_table = calloc(arr_row,sizeof(double *));
//check if the memory has been allocated correctly
if (MUDG_table==NULL)
{
printf("Error allocating memory!\n"); //print an error message
return 1; //return with failure
}
for (cv02=0;cv02<arr_row;cv02++)
{
MUDG_table[cv02] = calloc(arr_column, sizeof(double));
//check if the memory has been allocated correctly
if (MUDG_table[cv02]==NULL)
{
printf("Error allocating memory!\n"); //print an error message
return 1; //return with failure
}
}
The main problem was the fscanf which I have no idea why it is not working. 主要问题是fscanf,我不知道为什么它不起作用。 So I replaced it with the fgets.
所以我用fgets代替了它。 I found this code in another post and I modified it to work in this case.
我在另一篇文章中找到了此代码,并对其进行了修改以在这种情况下工作。
gain_ptr = fopen("MUDG_text.txt", "r");
if (gain_ptr == NULL)
{
printf("Error Reading File\n");
return 1; //return with failure
}
for (row=0;row<arr_row;row++)
{
fgets(buffer, 1024, gain_ptr); //buffer is declared as char buffer[1024];
tok = strtok(buffer, "\t"); // NULL means 'continue from last token'
//tok is declared as char *tok;
//the numbers in my text file are seperated by tabs
//so the tokens should be separated by \t
column = 0; //since fgets gets a whole line I had to separate the columns
while (tok != NULL)
{
test_var = atof(tok); //test variable is declared as double
//and it is used to hold temporarily the value of tok in double
tok = strtok(NULL, "\t"); // NULL means 'continue from last token'
MUDG_table[row][column] = test_var;
column++;
}
}
fclose(gain_ptr);
Maybe it is not the best solution, but at least it works. 也许这不是最好的解决方案,但至少它能起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.