Я нахожусь на ранней стадии кодирования задания на домашнюю работу. Более крупная цель немного больше и выходит за рамки этого вопроса. Непосредственная цель состоит в том, чтобы взять одно или более двухзначных чисел из командной строки, которые соответствуют годам (например, 52). Затем откройте файл, который идет с этим годом. Файлы отформатированы таким образом:Чтение неопределенного числа целых чисел из файла
1952 Topps baseball
-------------------
8 10 15 17 20 47 48 49 59 71 136
153 155 159 162 168 170 175 176 186 188 202
215 233 248 252 253 254 257 259 264 270 271 272 274
282 283 284 285 287 293 294 295 297 299 300 308 310 311
312
Каждый файл имеет случайное (между 1-50) числом из 1-3 цифр. Я храню год в int. Затем я храню каждую из более поздних цифр в массиве. Затем я буду использовать этот массив, чтобы делать другие интересные вещи. Моя проблема заключается в том, как я сканирую случайное число целых входов из файла. Это то, что я сделал до сих пор:
#include <stdio.h>
#include <string.h>
main(int argc, char** argv) {
char filename[30];
int cards[100];
FILE *fp;
int year,n,i;
for (i=1; i<argc; i++) {
n=atoi(argv[i]);
sprintf (filename,"topps.%d",n);
if (!(fp=fopen(filename,"r"))){
printf("cannot open %s for reading\n",filename);
exit(3);
}
fscanf (fp, "%d%*s%*s%*s%d%d%d%d%d%d%d%d%d%d%d%d",
&year,
&cards[i],
&cards[i+1],
&cards[i+2], //this is what needs to be improved upon
&cards[i+3],
&cards[i+4],
&cards[i+5],
&cards[i+6],
&cards[i+7],
&cards[i+8],
&cards[i+9],
&cards[i+10],
&cards[i+11],
&cards[i+12]);
printf ("%d\n",year);
printf ("%d\n",cards[i+11]);
}
}
В настоящее время fscanf только своего рода затычка, чтобы убедиться, что я могу прочитать и распечатать данные. Он хранит до 12-го целого и печатает его. По понятным причинам я не хотел идти на 50-е, потому что это бессмысленно. В некоторых файлах есть только 2 или 3 числа. Может ли кто-нибудь помочь мне найти более идеальное решение для чтения таких файлов? Спасибо, что посмотрели.
Один из вариантов заключается в том, чтобы прочитать файл строки за строкой, используя fgets(), а затем просканировать эту строку с помощью strtok. Есть более умные способы, но это довольно прямолинейно. –
Другой способ - просто прочитать первые две строки с помощью fgets() и игнорировать их, поскольку вы знаете год уже. Затем используйте while (scanf (fp, "% d", foo) == 1) для остальной части файла. «foo» - это для вас выяснить. –
@CharlieBurns Итак, если оператор while считывает целое число, он вернет его. Затем он перейдет к следующему целому числу, пока не вернет EOF? –