Избавление от строк в файле данных - PullRequest
1 голос
/ 12 ноября 2011

Я написал код, который считывает квадратную матрицу из файла .dat и вектор из отдельного файла .dat, дополняет их и выполняет метод исключения Гаусса, чтобы получить расширенную матрицу в виде сокращенного ряда. Сейчас я пытаюсь сделать его удобным для пользователя и элегантно аварийно завершать работу, если пользовательский ввод не имеет смысла. Например, у меня есть проверка, чтобы убедиться, что матрица квадратная и что длина вектора соответствует размеру матрицы. Сейчас я пытаюсь проверить, есть ли в файлах данных какие-либо символы или символы, которые не являются числами.

Моя попытка: что-то вроде scanf("%lf", ) сработало бы в том, что оно останавливается, когда сталкивается с одним из этих символов. Проблема в том, что мой ввод не из командной строки. (командная строка на самом деле не вариант здесь, потому что я хочу, чтобы код мог принимать огромную матрицу, которую пользователь не хотел бы сидеть там и вводить в командной строке). Выполнение fscanf("%f", ) сходит с ума, когда он встречает строку. Есть ли что-то вроде scanf, который просто остановится, но не сойдет с ума, когда встретит письмо и т. Д.? Если нет, есть ли другие предложения?

1 Ответ

1 голос
/ 12 ноября 2011

Используйте fgets, чтобы получить строку в предварительно выделенный буфер, затем strtoX, чтобы извлечь число с плавающей запятой.(X = f для float, X = d для double, X = ld для long double. Его подпись X_t strtoX(const char *nptr, char **endptr), где X_t - этосоответствующий тип (float, double или long double).

Пока не будет достигнут конец строки (**endptr = '\n'), увеличивайте указатель строки (который установлен, чтобы указывать на предварительно выделенный буфер, и если он не увеличивается после strtoX, то увеличивает его до тех пор, пока не будет. Используйте две переменные, например так:

char *lp = buf;
char *lp2 = buf;
do {
    X_t x = strtoX(lp, &lp2);
    if (lp == lp2 && *lp != '\n') {
        ++lp;
        continue;
     }
     if (*lp2 == '\n')
         goto read_line;
      // do something with x
 } while (1);

Мой код не велик, но он должен показать смысл.

Кроме того, strtoX для X = f и X = ld не поддерживаются до C99 / POSIX 2011.

...