2011-04-02 2 views
1

У меня есть текстовый файл, который мы должны обработать в форматеScanf при обработке цикла и EOF

дд - день мм - месяц гггг - год х, у, ш, г - температура

дд, мм, гггг, х, у, г, ш

1,1,2010,20.8,19.2,29.3,20.9 
2,1,2010,22.5,15.5,30.7,23.3 
3,1,2010,21.4,14.5,21.5,18.9 
4,1,2010,27.6,13.4,23.9,18.2 
5,1,2010,25,16,26.1,18.3 
6,1,2010,23.6,16.1,27.6,21.8 
... 
29,1,2010,23.5,17.5,30.2,19.6 
30,1,2010,36.2,13.4,27.3,20.5 
31,1,2010,37.2,17.1,26.6,21.5 
1,2,2010,24.9,16.9,27.7,22.6 
2,2,2010,35.2,16.7,27.7,22.7 
3,2,2010,34.8,21.6,27.3,21.4 
... 
1,12,2010,26.6,16.5,20.1,17.2 
2,12,2010,27.2,17.2,24.3,18.5 
3,12,2010,30,17.2,24.4,19.8 
... 
30,12,2010,23.7,14.2,26.5,20 
31,12,2010,41.1,14.9,27.2,21.4 

Мы не приучили использовать массивы для обработки этих данных, только функции, если/другое заявление, петель (в то время как для а /) и операций.

Мне нужно обрабатывать данные за каждый месяц отдельно. Мой основной код содержится в цикле while (scanf("%d,%d,%d,%f,%f,%f,%f", &dd, &mm, &yyyy, &x, &y, &z, &w) ==7) {}.

Ниже мой код:

while (scanf("%d,%d,%d,%f,%f,%f,%f", &dd, &mm, &yyyy, &melmax, &melmin, &sydmax, &sydmin) ==7) { 
     if (totallinesread==0) { 
      currentmonth = mm; 

      printf("Stage 4\n=======\n"); 

     } 

     if (mm == currentmonth) { 
      daysinmonthcounted+=1; 
      /*other totals*/ 


     }else if (mm !=currentmonth){ 


      /*can execute code here as needed such as generating graphs etc*/ 
      printf("0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C)\n"); 
      printf("%d\n", daysinmonthcounted); 


      /* make new currentmonth = mm, reset days counted = 1 */ 
      currentmonth = mm; 
      daysinmonthcounted = 1; 
     } 



     totallinesread+=1; 
} 

Выход:

0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C) 
31 
0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C) 
28 
0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C) 
31 
0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C) 
30 
0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C) 
31 
0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C) 
30 
0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C) 
31 
0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C) 
31 
0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C) 
30 
0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C) 
31 
0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C) 
30 
(Note missing december 31 days at the end) 

Я нахожу, что это работает и выходы, как я хотел (в настоящее время только печать общее количество дней в каждом месяце), но в последний месяц пропускает. Я полагаю, что это имеет какое-то отношение к концу файла (EOF), и потому, что для используемого оператора if нет следующего значения «mm» (currentmonth != mm), он останавливается и не разрешает обрабатывать какой-либо дополнительный код вычисления для Декабрь.

Есть ли способ для этого? Я читал, что scanf(EOF) = -1, который должен работать с currentmonth != mm?

В текстовом файле данных можно предположить, что у него нет ошибок или дубликатов записей и находится в порядке возрастания.

Любая помощь будет оценена по достоинству.

Спасибо!

ответ

1

[EDIT # 3 - просто показать весь код, а не только редактирует, чтобы сделать вещи более четкие]

int scanned;

в то время как ((сканируются = зсапЕ ("% d,% d,% d,% F% F% F% F", & дд, & мм, & гггг, & melmax, & melmin, & sydmax, & sydmin)) == 7) {

if (totallinesread==0) { 
     currentmonth = mm; 

     printf("Stage 4\n=======\n"); 

    } 

    if (mm == currentmonth) { 
     daysinmonthcounted+=1; 
     /*other totals*/ 


    }else if (mm !=currentmonth){ 


     /*can execute code here as needed such as generating graphs etc*/ 
     printf("0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C)\n"); 
     printf("%d\n", daysinmonthcounted); 


     /* make new currentmonth = mm, reset days counted = 1 */ 
     currentmonth = mm; 
     daysinmonthcounted = 1; 
    } 

    totallinesread+=1; 

} 

if ((scanned == EOF) && (daysinmonthcounted > 1)){ 

     /*can execute code here as needed such as generating graphs etc*/ 
     printf("0----+----1----+----2----+----3----+----4----+----5 (x 10, degrees C)\n"); 
     printf("%d\n", daysinmonthcounted); 

     /* make new currentmonth = mm, reset days counted = 1 */ 
     currentmonth = mm; 
     daysinmonthcounted = 1; 
} 
+0

@ typo.pl I ' ve внес изменения, и код вычисления, похоже, не работает, поэтому я играл с || и переключать круглые скобки вокруг, но безрезультатно? – Jian

+0

Где код расчета? Являются ли переменные для кода вычисления объявлены только внутри цикла while? –

+0

Переменные (другие и отсканированные) объявляются вне цикла while.Операторы if находятся внутри цикла while. Я планирую вычислять итоговые значения по мере их чтения ('mm = currentmonth') и выводить/отображать любые графики и т. Д., Когда' mm! = Currentmonth' и сброс итогов. Извините, если я не понял, я ценю вашу помощь! – Jian

1

Вы можете повторно написать свой цикл, чтобы вырваться из середины его:

while(1) { 
    failed = 0; 
    if (sscanf(....) != 7) { 
    mm = 99; /* invalid month */ 
    failed = 1; 
    }; 
    /* check for month end */ 
    if (failed) { 
     break; 
    }; 
    ... 
} 
+0

Нам не нужно, чтобы обнаружить наличие недействительных месяцев, данные считаются правильными. Просто не знаю, как изменить свой цикл, чтобы он считывал все данные и обрабатывал до самого конца месяца в txt-файле, например, в декабре (или в любом другом месяце, который последний) – Jian

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