Позбавлення рядків у файлі даних

Я написав код, який зчитує квадратну матрицю з файлу .dat і вектора з окремого .dat файлу і збільшує два і усуває гаусса Йорданія, щоб отримати збільшену матрицю в рядку зменшеної форми. Я намагаюся тепер зробити його зручним і елегантним, коли користувальницький вхід є безглуздим. Наприклад, у мене є перевірка, щоб переконатися, що матриця квадратна і що довжина вектора відповідає розмірності матриці. Тепер я намагаюся перевірити, чи є в файлах даних символи або символи, які не є номерами.

Моя спроба: щось подібне до scanf ("% lf",) працюватиме в тому випадку, якщо вона зупиниться, коли з'явиться один з цих символів. Проблема в тому, що мій вхід не з командного рядка. (Командний рядок тут не є опцією, тому що я хочу, щоб код міг прийняти величезну матрицю, яку користувач не хотів би сидіти там і входити в командний рядок). Виконання fscanf ("% f",) зникає, коли виникає рядок. Чи є щось схоже на scanf, яке просто зупиниться, але не зійде з розуму, коли зустрінеться з листом тощо? Якщо ні, чи є інші пропозиції?

1
Не змушуйте його краху взагалі! Будь-яка нормальна програма буде виконувати перевірку помилок і просто вийти з помилкою, якщо вона не може працювати належним чином. Що стосується вашого запитання, то, мабуть, це найпростіше розділити розбір, перевірку та обробку, і ви можете просто вийти, якщо є помилка розбору чи перевірки.
додано Автор Kerrek SB, джерело
+1 для " ... крах елегантно ... " :-) Так чи інакше, щоб бути серйозним, я повністю згоден з тим, що Керрек С.Б. писав вище! Додатково я хотів би згадати scanf() , що повертає EOF після " зникли ", так що ви можете легко зловити цю умову під час виконання.
додано Автор alk, джерело
читати все як рядок, перевірити правильність і конвертувати ...
додано Автор Mitch Wheat, джерело

1 Відповіді

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

Доки не буде досягнуто кінця рядка ( ** endptr = '\ t' 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.

1
додано