2013-10-12 2 views
0

Я нахожусь на ранней стадии кодирования задания на домашнюю работу. Более крупная цель немного больше и выходит за рамки этого вопроса. Непосредственная цель состоит в том, чтобы взять одно или более двухзначных чисел из командной строки, которые соответствуют годам (например, 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 числа. Может ли кто-нибудь помочь мне найти более идеальное решение для чтения таких файлов? Спасибо, что посмотрели.

+1

Один из вариантов заключается в том, чтобы прочитать файл строки за строкой, используя fgets(), а затем просканировать эту строку с помощью strtok. Есть более умные способы, но это довольно прямолинейно. –

+2

Другой способ - просто прочитать первые две строки с помощью fgets() и игнорировать их, поскольку вы знаете год уже. Затем используйте while (scanf (fp, "% d", foo) == 1) для остальной части файла. «foo» - это для вас выяснить. –

+0

@CharlieBurns Итак, если оператор while считывает целое число, он вернет его. Затем он перейдет к следующему целому числу, пока не вернет EOF? –

ответ

0

Я очень благодарен за помощь, которую я получил от всех. Это определенно привело меня к правильному пути. Тем не менее, это ответ на проблему, которая в конечном итоге сработала для меня:

fscanf(fp,"%*[^\n]%*c");        //Skip first two 
fscanf(fp,"%*[^\n]%*c");        //lines of file 

while (!feof(fp)) {         //Read ints into array 
    fscanf(fp,"%d ",&cards[i++]); 
} 
2

Нечто подобное делает трюк:

Declare 3 новых переменных: в верхней части

char sData[10000]; 
char * pch; 
int j = 0; 

Затем вместо номера чтения кода ниже фрагмент кода:

fscanf (fp, "%d%*s%*s%*s", &year); 
/* ignore the line with all the dashes (crude, but works)*/ 
fgets(sData, 10000, fp); 
/* read all the number data in */ 
fgets(sData, 10000, fp); 

pch = strtok (sData," "); 
j = 0; 
while (pch != NULL) 
{ 
    cards[j++] = atoi(pch); 
    pch = strtok (NULL, " "); 
} 

На конец этого кода, карты [] должны иметь все ваши номера, а j должен содержать счетчик.

Смежные вопросы