因为您没有始终如一地使用fgets(),所以您读取了 5 个标题行,然后是 50 个数字,但最后一个数字离开了第 55 行的换行符,准备被第一个 fgets() 或下一个标题块读取线。所以第二个标题读取块(仅)读取换行符,然后是 4 个标题行,然后数据扫描尝试将标题的最后一行作为数字读取并且(可能)失败。
始终检查每个输入函数的返回值(即使这似乎让生活变得痛苦)。
而且,我建议使用fgets() 阅读每一行。跳过标题行;使用sscanf() 转换数据线上的数据。但请检查 fgets() 和 sscanf() 以获取正确的返回值。
还有其他函数可以将字符串转换为数字;可以使用strtod()。
这里有一些工作代码,缩减为处理 5 个数据块,每组 10 行(仍然是 5 个标题行):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern float **fmatrix(int m, int n);
enum { HDRS = 5, ROWS = 10, COLS = 5 };
static int read_line(FILE *ifp, char *buffer, size_t buflen)
{
if (fgets(buffer, buflen, ifp) == 0)
{
fprintf(stderr, "EOF\n");
return 0;
}
size_t len = strlen(buffer);
buffer[len-1] = '\0';
printf("[[%s]]\n", buffer);
return 1;
}
int main(void)
{
FILE *ifp;
char mystring[500];
int i, j, n;
ifp = stdin;
if (ifp != NULL)
{
// Test with COLS result blocks each containing ROWS frequency values
float **A = fmatrix(ROWS, COLS);
for (j = 0; j < COLS; j++)
{
// using fgets w/ printf to see contents of "discarded" lines
for (i = 0; i < HDRS; i++)
{
if (read_line(ifp, mystring, sizeof(mystring)) == 0)
break;
}
for (i = 0; i < ROWS; i++)
{
// skip over first float, store the next float into A[i][j]
if (read_line(ifp, mystring, sizeof(mystring)) == 0)
break;
if ((n = sscanf(mystring, " %*e %E", &A[i][j])) != 1)
break;
printf("A[%i][%i]: %E, %i\n", i, j, A[i][j], n);
}
}
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
printf("%8.3f", A[i][j]);
putchar('\n');
}
}
return 0;
}
float **fmatrix(int m, int n)
{
// Return an m x n Matrix
int i;
float **A = (float **)malloc(m * sizeof(float *));
A[0] = (float *)malloc(m * n * sizeof(float));
for (i = 1; i < m; i++)
{
A[i] = A[i - 1] + n;
}
return A;
}
较小的数据文件:
Line 1 of heading 1
Line 2 of heading 1
Line 3 of heading 1
Line 4 of heading 1
Line 5 of heading 1
18.1815 56.4442
12.0478 15.5530
47.7793 44.5291
30.8319 78.9396
53.5651 28.1290
74.9131 90.5912
34.9319 10.5254
69.7780 56.8633
92.5056 11.8101
82.0158 31.7586
Line 1 of heading 2
Line 2 of heading 2
Line 3 of heading 2
Line 4 of heading 2
Line 5 of heading 2
118.15 564.442
104.78 155.530
477.93 445.291
383.19 789.396
556.51 281.290
791.31 905.912
393.19 105.254
677.80 568.633
950.56 118.101
801.58 317.586
Line 1 of heading 3
Line 2 of heading 3
Line 3 of heading 3
Line 4 of heading 3
Line 5 of heading 3
18.1815 36.4442
12.0478 35.5530
47.7793 34.5291
30.8319 38.9396
53.5651 38.1290
74.9131 30.5912
34.9319 30.5254
69.7780 36.8633
92.5056 31.8101
82.0158 31.7586
Line 1 of heading 4
Line 2 of heading 4
Line 3 of heading 4
Line 4 of heading 4
Line 5 of heading 4
118.15 464.442
104.78 455.530
477.93 445.291
383.19 489.396
556.51 481.290
791.31 405.912
393.19 405.254
677.80 468.633
950.56 418.101
801.58 417.586
Line 1 of heading 5
Line 2 of heading 5
Line 3 of heading 5
Line 4 of heading 5
Line 5 of heading 5
118.15 564.442
104.78 555.530
477.93 545.291
383.19 589.396
556.51 581.290
791.31 505.912
393.19 505.254
677.80 568.633
950.56 518.101
801.58 517.586
请注意,20 个随机数的块以不同的方式编辑,以在每个块中获得不同的数字。不过,块中的值之间存在很强的遗传相似性。
在数据文件上运行程序的结果。
[[Line 1 of heading 1]]
[[Line 2 of heading 1]]
[[Line 3 of heading 1]]
[[Line 4 of heading 1]]
[[Line 5 of heading 1]]
[[18.1815 56.4442]]
A[0][0]: 5.644420E+01, 1
[[12.0478 15.5530]]
A[1][0]: 1.555300E+01, 1
[[47.7793 44.5291]]
A[2][0]: 4.452910E+01, 1
[[30.8319 78.9396]]
A[3][0]: 7.893960E+01, 1
[[53.5651 28.1290]]
A[4][0]: 2.812900E+01, 1
[[74.9131 90.5912]]
A[5][0]: 9.059120E+01, 1
[[34.9319 10.5254]]
A[6][0]: 1.052540E+01, 1
[[69.7780 56.8633]]
A[7][0]: 5.686330E+01, 1
[[92.5056 11.8101]]
A[8][0]: 1.181010E+01, 1
[[82.0158 31.7586]]
A[9][0]: 3.175860E+01, 1
[[Line 1 of heading 2]]
[[Line 2 of heading 2]]
[[Line 3 of heading 2]]
[[Line 4 of heading 2]]
[[Line 5 of heading 2]]
[[118.15 564.442]]
A[0][1]: 5.644420E+02, 1
[[104.78 155.530]]
A[1][1]: 1.555300E+02, 1
[[477.93 445.291]]
A[2][1]: 4.452910E+02, 1
[[383.19 789.396]]
A[3][1]: 7.893960E+02, 1
[[556.51 281.290]]
A[4][1]: 2.812900E+02, 1
[[791.31 905.912]]
A[5][1]: 9.059120E+02, 1
[[393.19 105.254]]
A[6][1]: 1.052540E+02, 1
[[677.80 568.633]]
A[7][1]: 5.686330E+02, 1
[[950.56 118.101]]
A[8][1]: 1.181010E+02, 1
[[801.58 317.586]]
A[9][1]: 3.175860E+02, 1
[[Line 1 of heading 3]]
[[Line 2 of heading 3]]
[[Line 3 of heading 3]]
[[Line 4 of heading 3]]
[[Line 5 of heading 3]]
[[18.1815 36.4442]]
A[0][2]: 3.644420E+01, 1
[[12.0478 35.5530]]
A[1][2]: 3.555300E+01, 1
[[47.7793 34.5291]]
A[2][2]: 3.452910E+01, 1
[[30.8319 38.9396]]
A[3][2]: 3.893960E+01, 1
[[53.5651 38.1290]]
A[4][2]: 3.812900E+01, 1
[[74.9131 30.5912]]
A[5][2]: 3.059120E+01, 1
[[34.9319 30.5254]]
A[6][2]: 3.052540E+01, 1
[[69.7780 36.8633]]
A[7][2]: 3.686330E+01, 1
[[92.5056 31.8101]]
A[8][2]: 3.181010E+01, 1
[[82.0158 31.7586]]
A[9][2]: 3.175860E+01, 1
[[Line 1 of heading 4]]
[[Line 2 of heading 4]]
[[Line 3 of heading 4]]
[[Line 4 of heading 4]]
[[Line 5 of heading 4]]
[[118.15 464.442]]
A[0][3]: 4.644420E+02, 1
[[104.78 455.530]]
A[1][3]: 4.555300E+02, 1
[[477.93 445.291]]
A[2][3]: 4.452910E+02, 1
[[383.19 489.396]]
A[3][3]: 4.893960E+02, 1
[[556.51 481.290]]
A[4][3]: 4.812900E+02, 1
[[791.31 405.912]]
A[5][3]: 4.059120E+02, 1
[[393.19 405.254]]
A[6][3]: 4.052540E+02, 1
[[677.80 468.633]]
A[7][3]: 4.686330E+02, 1
[[950.56 418.101]]
A[8][3]: 4.181010E+02, 1
[[801.58 417.586]]
A[9][3]: 4.175860E+02, 1
[[Line 1 of heading 5]]
[[Line 2 of heading 5]]
[[Line 3 of heading 5]]
[[Line 4 of heading 5]]
[[Line 5 of heading 5]]
[[118.15 564.442]]
A[0][4]: 5.644420E+02, 1
[[104.78 555.530]]
A[1][4]: 5.555300E+02, 1
[[477.93 545.291]]
A[2][4]: 5.452910E+02, 1
[[383.19 589.396]]
A[3][4]: 5.893960E+02, 1
[[556.51 581.290]]
A[4][4]: 5.812900E+02, 1
[[791.31 505.912]]
A[5][4]: 5.059120E+02, 1
[[393.19 505.254]]
A[6][4]: 5.052540E+02, 1
[[677.80 568.633]]
A[7][4]: 5.686330E+02, 1
[[950.56 518.101]]
A[8][4]: 5.181010E+02, 1
[[801.58 517.586]]
A[9][4]: 5.175860E+02, 1
56.444 564.442 36.444 464.442 564.442
15.553 155.530 35.553 455.530 555.530
44.529 445.291 34.529 445.291 545.291
78.940 789.396 38.940 489.396 589.396
28.129 281.290 38.129 481.290 581.290
90.591 905.912 30.591 405.912 505.912
10.525 105.254 30.525 405.254 505.254
56.863 568.633 36.863 468.633 568.633
11.810 118.101 31.810 418.101 518.101
31.759 317.586 31.759 417.586 517.586