Хотя у вас уже есть хороший ответ, в своем стремлении понять использование структур вы, возможно, упускаете большую часть их пользы и использования.Вы объявляете свою структуру, например,
struct arrival_struct {
int time; // time of arrival
int count; // number of passengers/seats arriving
};
Затем вы можете просто объявить массив структуры для хранения каждого компонента, прочитанного из каждой строки из файла, и обойтись без множества дополнительных переменных.Например, вы можете просто объявить:
#define MAXS 10 /* if you need a constant, #define one (or more) */
...
struct arrival_struct arrivals[MAXS] = {{ .time = 0 }};
, который объявит массив 10 struct arrival_struct
и инициализирует все значения на ноль.
Тогда, вместо того, чтобы рискнуть попасть во многие ловушкиscanf
, гораздо лучше читать по одной строке данных за раз с помощью строчно-ориентированного ввода , например fgets
(или POSIX getline
), а затем анализировать информацию из заполненного буферав необходимые значения.Таким образом, то, что остается в вашем входном потоке, не зависит от спецификатора преобразования пользователя или от сбоя совпадения .
Просто объявите буфер символов достаточного размераудерживать каждую строку ( Не экономьте на размере буфера! ) и считывайте каждую строку в буфер.Затем проанализируйте необходимые значения в строке с помощью sscanf
, например,
#define MAXC 1024
...
size_t n = 0;
char buf[MAXC];
/* while array space remains, read each line from file into struct */
while (n < MAXS && fgets (buf, sizeof buf, stdin))
if (sscanf (buf, "%d %d", &arrivals[n].time, &arrivals[n].count) == 2)
n++;
. Хотя вы можете просто получить количество пассажиров во время чтения из файла, вероятно, вы будете читать данные в одной точкеваша программа, а затем использовать информацию по мере необходимости.Таким образом, после чтения всех данных вашего файла в массиве struct, простая функция, возвращающая количество пассажиров, может быть такой простой:
size_t getpassengercount (struct arrival_struct *s, size_t n)
{
size_t count = 0, i;
for (i = 0; i < n; i++)
count += s[i].count;
return count;
}
Поместить их в краткий краткий пример чтения вашего файла данных вы можетеdo:
#include <stdio.h>
#define MAXS 10 /* if you need a constant, #define one (or more) */
#define MAXC 1024
struct arrival_struct {
int time; // time of arrival
int count; // number of passengers/seats arriving
};
size_t getpassengercount (struct arrival_struct *s, size_t n)
{
size_t count = 0, i;
for (i = 0; i < n; i++)
count += s[i].count;
return count;
}
int main(void) {
struct arrival_struct arrivals[MAXS] = {{ .time = 0 }};
size_t n = 0;
char buf[MAXC];
/* while array space remains, read each line from file into struct */
while (n < MAXS && fgets (buf, sizeof buf, stdin))
if (sscanf (buf, "%d %d", &arrivals[n].time, &arrivals[n].count) == 2)
n++;
printf ("total passengers: %zu\n", getpassengercount (arrivals, n));
}
Пример использования / вывода
$ ./bin/passengercnt <dat/passengers.txt
total passengers: 18
Дайте мне знать, если у вас есть дополнительные вопросы.