2013-11-11 3 views
1
int k; 
float regionID; 
int t; 
char string[100]; 
float avgTemp,totalTemp; 
for(k = 0; k < MAX_STATIONS; k++){ 
    if (fgets(string, sizeof(string), fp) == 0){ 
     break; 
    } 
    fscanf(fp,"%d %f %d %d %d %d %d %f %f %f", &stationInfo[k].stationID, &stationInfo[k].temperature, &stationInfo[k].year, &stationInfo[k].month, &stationInfo[k].day, &stationInfo[k].hour, &stationInfo[k].minute, &stationInfo[k].location.latitude, &stationInfo[k].location.longitude, &regionID); 
    printf("%d %1.2f %d %d %d %d %d %f %f\n", stationInfo[k].stationID, stationInfo[k].temperature, stationInfo[k].year, stationInfo[k].month, stationInfo[k].day, stationInfo[k].hour, stationInfo[k].minute, stationInfo[k].location.latitude, stationInfo[k].location.longitude); 

} 

Итак, моя программа читает мой файл почти идеально, но он не будет читать первую строку моего файла. Кто-нибудь знает, что может вызвать эту проблему и как я могу ее исправить?fscanf читает все, кроме первой строки

+1

Мы можем сказать вам, что если вы покажете нам свой файл. – zubergu

+1

Потому что вы вызываете 'fgets()' перед вызовом 'fscanf()', и он читает первую строку. – Barmar

+0

На самом деле, поскольку вы делаете это каждый раз через цикл, ваша программа только вызывает 'fscanf()' на четных строках в файле. – Barmar

ответ

4

Вы вполне сознательно читать и отбрасывая линию здесь:

if (fgets(string, sizeof(string), fp) == 0) { 

Я думаю, что вы имели в виду использовать sscanf вместо fscanf, так что вы используете данные, возвращенные вам fgets.

sscanf(string,"%d %f %d %d %d %d %d %f %f %f", ...); 
+0

Ohh awesome :). Это именно то, что я искал, спасибо: D. У меня также был другой вопрос. Меня попросят найти среднюю температуру постоплатов stationInfo.temprature. Я изначально сделал это, если (stationInfo [k] .temperature! = 0) t ++; и totalTemp + = stationInfo [k] .температура. Затем разделите totalTemp на t. Это заставляет меня иметь огромное количество, и если я смотрю на t, это также огромное количество. Что бы вы сказали, лучший способ сделать это? –

+0

Я предполагаю, что вы не инициализировали 't' или' totalTemp' ноль перед циклом. Другая возможность заключается в том, что ваши значения не были правильно прочитаны - вы не проверяете результат 'sscanf'. Но если ваш результат в противном случае правильный, убедитесь, что вы инициализировали значения. Другая возможность заключается в том, что вы используете неправильный спецификатор формата в своем 'printf' при выводе значения. – paddy

+0

Я инициализировал его, и я считаю, что мои входы хорошие. Вот мой код: http://pastebin.com/MkgxgiF1. Если бы вы могли взглянуть, это было бы значительно appriciated :) EDIT: totalTemp работает так, как должно, это просто не работает. –

1

Причина, почему ваша программа «не читает первую строку файла», потому что это на самом деле уже прочитал первую строчку, когда вы назвали

if (fgets(string, sizeof(string), fp) == 0) 

Изменение, чтобы исправить это просто:

for(k = 0; k < MAX_STATIONS; k++) 
{ 
    if (fscanf(fp,"%d %f %d %d %d %d %d %f %f %f", &stationInfo[k].stationID, 
                &stationInfo[k].temperature, 
                &stationInfo[k].year, 
                &stationInfo[k].month, 
                &stationInfo[k].day, 
                &stationInfo[k].hour, 
                &stationInfo[k].minute, 
                &stationInfo[k].location.latitude, 
                &stationInfo[k].location.longitude, 
                &regionID) > 10) 
    { 
     break; 
    } 
    printf("%d %1.2f %d %d %d %d %d %f %f\n", stationInfo[k].stationID, 
               stationInfo[k].temperature, 
               stationInfo[k].year, 
               stationInfo[k].month, 
               stationInfo[k].day, 
               stationInfo[k].hour, 
               stationInfo[k].minute, 
               stationInfo[k].location.latitude, 
               stationInfo[k].location.longitude); 
} 

Примечание возвращаемое значение fscanf в:

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

Надеюсь, это то, что вы ищете!

+0

Отлично :). Это потрясающее решение. Спасибо –

+1

Это опасный способ чтения файлов данных. Лучше использовать линейный подход. Или, по крайней мере, добавить формат «игнорировать до конца строки» в вызов 'fscanf'. – paddy

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