fscanf возвращает каждую вторую строку

Я пытаюсь прочитать числа из файла с именем part_1.txt, который содержит следующие данные:

101
102
103
104
105
106
107
108
109

Это код, с которым я работаю:

#include <stdio.h>

int main()
{

FILE *handle_in1 = fopen("part_1.txt", "r");
FILE *handle_in2 = fopen("part_2.txt", "r");
FILE *handle_out = fopen("parts.txt", "w");

int scan;

if(handle_in1 == NULL || handle_in2 == NULL)
{
printf("File(s) could not be handled.");
}

else
{
while(fscanf(handle_in1, "%d", &scan) != EOF)
{
    fscanf(handle_in1, "%d", &scan);
    printf("Number is %d\n", scan);
}
}
return 0;

}

Код должен выводить на экран все значения, хранящиеся в файле, до конца файла. Вместо этого он распечатывает все остальные значения (и последнее значение), например:

Number is 102
Number is 104
Number is 106
Number is 108
Number is 109 

Что не так в этом коде?

Я отредактировал этот вопрос, так как не могу опубликовать ответ до 8 часов. Следующая версия - это новая версия:

#include <stdio.h>

int main()
{

FILE *handle_in1 = fopen("part_1.txt", "r");
FILE *handle_in2 = fopen("part_2.txt", "r");
FILE *handle_out = fopen("parts.txt", "w");

int scan;

if(handle_in1 == NULL || handle_in2 == NULL)
{
printf("File(s) could not be handled.");
}

else
{
fscanf(handle_in1, "%d", &scan);
    while(fscanf(handle_in1, "%d", &scan) != EOF)
    {
    printf("Number is %d\n", scan);
    }
}
return 0;

}

эта отредактированная версия программы дает мне значения: 102, 103, 104, 105, 106, 107, 108 и 109. Если я редактирую текстовый файл и помещаю один дополнительный 101 поверх текстового файла, то он дает значения полностью от 101 до 109, поэтому первое число должно пропустить. Почему это так, я понятия не имею ...


person user3629146    schedule 15.05.2014    source источник


Ответы (2)


Вы здесь что-то делаете не так:

while(fscanf(handle_in1, "%d", &scan) != EOF)
{
    fscanf(handle_in1, "%d", &scan);
    printf("Number is %d\n", scan);
}

Решение:

Используйте только один scanf в итерации цикла.

Так получится (это одно из решений):

while(fscanf(handle_in1, "%d", &scan) != EOF)
{
    printf("Number is %d\n", scan);
}
person tod    schedule 15.05.2014
comment
Это решение немного помогает, но оно все равно пропускает первое число в текстовом файле ... - person user3629146; 15.05.2014
comment
Это нельзя пропускать. Из предыдущего результата видно, что первое число было пропущено, потому что перед печатью было два оператора scanf. Теперь есть только один, который по логике должен нормально работать. - person tod; 15.05.2014
comment
Я использую кодовые блоки и перепроверил несколько раз. Я копирую и вставляю отредактированную версию кода, который находится в моем первом сообщении, в мою среду IDE, и он по-прежнему пропускает первое число: 101. - person user3629146; 15.05.2014

Решение вашей второй проблемы заключается в том, что вам нужно удалить первую строку fscanf после else и прямо перед while вот так

    FILE *handle_in1 = fopen("part_1.txt", "r");
    int scan;

    if(handle_in1 == NULL ){
            printf("File(s) could not be handled.");
    } else  {
    /*      fscanf(handle_in1, "%d", &scan);*/ // this line is unnecessary
            while(fscanf(handle_in1, "%d", &scan) != EOF) {
                printf("Number is %d\n", scan);
            }
    }
    return 0;

что fscanf удалял первую строку вашего файла.

person Mobius    schedule 15.05.2014
comment
Вам, вероятно, стоит передать его tod, так как он действительно ответил на ваш вопрос. Я только что заметил проблему в вашей реализации. - person Mobius; 15.05.2014