У меня есть файл «Instruction.txt», из которого я должен прочитать входные данные, содержимое файла:
1
2 Pasta 4
3 1 Falafel 3
3 5 Fish 3
3 5 Pasta 4
4 5 Fish 3
5 1
5 5
Первая строка всегда одна и та же и содержит только одно значение. Как я могу прочитать остальные значения строк, когда количество значений может различаться в каждой строке?
Я попытался сделать следующее:
fscanf(Instruction,"%d %d %s %d",&funcNum,&tableNum,name,&amount)
но это не сработало, так как я пытался распечатать его, используя:
printf("\n%d %d %s %d",funcNum,tableNum,name,amount);
он только напечатал: 2 0 0
без имени.
Итак, в чем вопрос, @Keanu?
Не могли бы вы уточнить «не сработало»? Лично я не фанат семейства scanf, поэтому я бы использовал fgets для ввода. Затем, возможно, strtok или просто вручную проанализируйте числа, передающие строку, на strtol, поскольку здесь это довольно прямолинейно.
Вы можете либо читать строки как строки (т.е. не ожидать каких-либо полей), либо зная, сколько полей ожидать. Можете ли вы объяснить, когда вы ожидаете больше числовых полей? Затем напишите свой код синтаксического анализа соответственно. Если вы не можете объяснить, то я не вижу, как вы могли осмысленно использовать входные данные. Или, другими словами: объясните, пожалуйста, значение единственной «2» перед «Паста» в отличие от «3 1» перед «Фалафелем». Если вы не знаете, что означает разное количество цифр, то будет сложно их разобрать. Синтаксический анализ завершится ошибкой самое позднее при поиске нужной переменной для сохранения.
Pasta не является целым числом, но %d ожидает int. Всегда проверяйте возвращаемое значение (f)scanf().





Вот пример кода, демонстрирующий возможное решение:
char token[1024] = "";
int i = 0;
char c = "1";
fscanf("%c", &c);
while (c != ' ' && c != '\n') {
token[i] = c;
token[i + 1] = '\0';
i++;
fscanf("%c", &c);
}
int number = 0;
if (sscanf(token, "%d", &number) == 1) { // Token is an int
printf("%d ", number);
} else { // Token is a string
printf("%s ", token);
}
Как видите, мы читаем символы до тех пор, пока не достигнем пробела или символа конца строки, сохраняя результат в строке (массиве символов). Затем мы используем sscanf для чтения int из этой строки. Если sscanf возвращает, это означает, что он успешно прочитан, и этот токен является числом, иначе это слово.
Ставьте 4 пробела в начале строк, содержащих код