Чтобы прочитать линии используйте fgets()
char buffer[100];
while (fgets, buffer, sizeof buffer, istream) != NULL) {
Затем отсканируйте линию против различных форматов, каждая из которых заканчивается с " %n"
. "%n"
записывает положение сканирования, если оно так далеко. Дополнительные тесты могут проверять наличие постороннего персонажа, начиная с n
.
int num1, num2, num3;
char last[sizeof buf];
char first[sizeof buf];
char code[sizeof buf];
double rate;
int n = 0;
// v..v..v..v...v..v..v spaces optional here
sscanf(buffer, "i %d %s %s %lf %d %s %d %n",
&num1, last, first, &rate, &num2, code, &num3, &n);
if (n) {
Handle_i();
continue;
}
sscanf(buffer, "q %d %n", &num1, &n);
if (n) {
Handle_q();
continue;
}
sscanf(buffer, "ra %d %n", &num1, &num2, &n);
if (n) {
Handle_ra();
continue;
}
sscanf(buffer, "e %n", &n);
if (n) {
Handle_e();
continue;
}
...
fail();
}
Поскольку каждый формат начинается с уникальным рисунком буквы, то sscanf()
будет быстро выйти на неправильном матче.
Альтернативный код может анализировать начальные буквы для немного более эффективного дерева решений. Подозреваемый профилирование покажет небольшую разницу в производительности.
Как и в любом сложном формате, рассмотрите, как один из будет поддерживать код, и он обязательно будет развиваться.
С 'strtok'. Прочитайте строки с помощью 'fgets' и проверьте каждый токен, чтобы решить, как действовать. –
Что бы вы ни делали, не используйте ничего, как fscanf. Абсолютно неправильный инструмент для работы. –
Обратите внимание, что некоторые из «кодов» являются кодами мультиплекса, поэтому это первое «слово», а не «первый символ», который представляет код функции. Так как семейство функций 'scanf()' не заботится о строках, вы не можете использовать их для ввода файла. Вам нужно прочитать строки (например, 'fgets()'), а затем проанализировать их ('sscanf()' может быть ОК - проверьте [Использование 'sscanf()' в цикле] (http://stackoverflow.com/ вопросы/3975236/how-to-use-sscanf-in-loop), например). –