2016-10-02 1 views
0

Спасибо за ваше любезное внимание. У меня есть файл .dat как ниже формат:Сохраните целочисленное число и число с плавающей запятой из файла .dat на языке C

3 10.9 
1 2.1 
(empty line) 
10 10.05 
10 200 

Для каждой строки, я хочу, чтобы сохранить первое число (целое число) в переменной а, и сохранить второе число с плавающей запятой в переменной

int c; 
FILE *fp = fopen("supermarket.dat", "r"); 
while ((c = fgetc(fp)) != EOF) { 
    int var1; 
    float var2; 
    fscanf(fp, "%d%f", &var1, &var2); 
    printf("%d\n", var1); 
    printf("%f\n", var2); 
} 

Теперь моя программа не вызывает ошибки, но все данные неверны. В ЦМД:

10 
0.900000 
1 
2.10000 
10 
10.050000 
10 
200.0000000 
10 
200.000000 

Как вы можете видеть, некоторые данные не так, и это не печатали пустую строку как 0 0 правильный вывод должен быть:

3 
10.9 
1 
2.1 
0 
0 
10 
10.05 
10 
200 
+0

Ваш цикл while не имеет смысла. –

+0

Какова ошибка времени выполнения? – nicomp

+2

Смешивание «% lf» и 'float' - это не рецепт для счастливой жизни. – kdopen

ответ

0

Вы читаете свой ввод с помощью двух «параллельных» процедур: fgetc (читайте символ) и fscanf (читайте форматированный ввод). Часть fgetc неправильно использует символы.

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

ли, что вместо того, чтобы:

while (1) { 
    int var1; 
    float var2; 
    int nb_toks = fscanf(fp, "%d%f", &var1, &var2); 
    if (nb_toks<2) break; 
    printf("%d\n", var1); 
    printf("%f\n", var2); 
} 

fscanf возвращает количество элементов, успешно считаны, поэтому, когда вы дойдете до конца файла, она возвращает 1 или 0, что означает, что вы можете выйти из цикла.

+0

@alk: только что отредактировал его. Ослепила проблема петли. kdopen уже сигнализировал об этом. –

+0

Спасибо. Изменение $ lf до% f делает программу работоспособной. Но вывод в CMD неверен. – Hugo

+0

забыли другое '% lf'! что он должен выводить? –

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