Чтение из файлов в программировании на C

У меня есть файл «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

без имени.

Ставьте 4 пробела в начале строк, содержащих код

Support Ukraine 20.06.2023 14:50

Итак, в чем вопрос, @Keanu?

tremendows 20.06.2023 14:53

Не могли бы вы уточнить «не сработало»? Лично я не фанат семейства scanf, поэтому я бы использовал fgets для ввода. Затем, возможно, strtok или просто вручную проанализируйте числа, передающие строку, на strtol, поскольку здесь это довольно прямолинейно.

Jason 20.06.2023 14:57

Вы можете либо читать строки как строки (т.е. не ожидать каких-либо полей), либо зная, сколько полей ожидать. Можете ли вы объяснить, когда вы ожидаете больше числовых полей? Затем напишите свой код синтаксического анализа соответственно. Если вы не можете объяснить, то я не вижу, как вы могли осмысленно использовать входные данные. Или, другими словами: объясните, пожалуйста, значение единственной «2» перед «Паста» в отличие от «3 1» перед «Фалафелем». Если вы не знаете, что означает разное количество цифр, то будет сложно их разобрать. Синтаксический анализ завершится ошибкой самое позднее при поиске нужной переменной для сохранения.

Yunnosch 20.06.2023 15:04
Pasta не является целым числом, но %d ожидает int. Всегда проверяйте возвращаемое значение (f)scanf().
12431234123412341234123 20.06.2023 15:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот пример кода, демонстрирующий возможное решение:

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 возвращает, это означает, что он успешно прочитан, и этот токен является числом, иначе это слово.

Другие вопросы по теме