Имея файл с потенциальными пустыми строками и потенциальными строками, которые содержат что-то отличное от пары double
значений, которые вы ищете, вы гораздо лучше читаете каждую строку в буфер и анализируете нужные значения из буфера с sscanf
вместо того, чтобы пытаться читать напрямую с fscanf
. Таким образом, строка ввода расходуется при каждом чтении, и вам не нужно беспокоиться о том, что остается в вашем входном потоке, в зависимости от используемых спецификаторов преобразования.
Далее, чтобы прочитать несколько значений в A
и B
, оба A
и B
должны быть массивами double
(или выделенным блоком памяти, который может содержать несколько значений double
)
Например, в main()
может объявите:
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
...
int main (int argc, char **argv) {
double a[MAXC] = {0}, b[MAXC] = {0}; /* arrays of MAXC doubles */
Теперь у вас есть хранилище для 1024
двойных значений. Ваша функция coefficient
, которая читает значения double
, должна возвращать количество прочитанных значений. Он также должен принимать открытый и проверенный поток FILE*
в качестве параметра. (если файл не может быть открыт в проверенном в вызывающей программе - нет причин вызывать функцию, чтобы попытаться начать чтение с начала)
Собрав все вместе, вы можете сделать:
size_t coefficients (FILE *fp, double *a, double *b)
{
char buf[MAXC]; /* buffer for reading each line */
size_t ncoeff = 0; /* number of coefficient pairs read */
while (ncoeff < MAXC && fgets (buf, MAXC, fp)) /* read each line */
/* if it contains 2 double values */
if (sscanf (buf, "%lf %lf", &a[ncoeff], &b[ncoeff]) == 2)
ncoeff++; /* increment counter */
return ncoeff; /* return total count of pairs read */
}
Короткий пример, в целом, вы могли бы получить:
#include <stdio.h>
#define MAXC 1024 /* if you need a constant, #define one (or more) */
size_t coefficients (FILE *fp, double *a, double *b)
{
char buf[MAXC]; /* buffer for reading each line */
size_t ncoeff = 0; /* number of coefficient pairs read */
while (ncoeff < MAXC && fgets (buf, MAXC, fp)) /* read each line */
/* if it contains 2 double values */
if (sscanf (buf, "%lf %lf", &a[ncoeff], &b[ncoeff]) == 2)
ncoeff++; /* increment counter */
return ncoeff; /* return total count of pairs read */
}
int main (int argc, char **argv) {
double a[MAXC] = {0}, b[MAXC] = {0}; /* arrays of MAXC doubles */
size_t n = 0; /* count of doubles returned */
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
if (!(n = coefficients (fp, a, b))) { /* validate coeff pairs read */
fputs ("error: no double values read from file.\n", stderr);
return 1;
}
if (fp != stdin) /* close file if not stdin */
fclose (fp);
for (size_t i = 0; i < n; i++) /* output coefficients */
printf ("a[%zu] : %.1f b[%zu] : %.1f\n", i, a[i], i, b[i]);
}
(при необходимости вы можете настроить размер массивов)
Пример входного файла
$ cat dat/coeffpairs.txt
A B
1.0 2.0
1.0 1.0
2.0 3.0
2.0 1.0
Пример использования / Вывод
$ ./bin/readcoeff dat/coeffpairs.txt
a[0] : 1.0 b[0] : 2.0
a[1] : 1.0 b[1] : 1.0
a[2] : 2.0 b[2] : 3.0
a[3] : 2.0 b[3] : 1.0
Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.