Вопрос о том, в то время как(!EOF)

#c #stdin #eof

Вопрос:

Я читаю значения из stdin , и я хочу продолжать читать файл, пока не закончу его полностью, поэтому я использую

 while(!EOF){ scanf(...) }
 

Однако фрагмент кода, похоже, ничего не делает,

 while(!EOF){


    scanf("%d %d %d %d", amp;imageWidth, amp;imageHeight, amp;safeRegionStart, amp;safeRegionWidth);

    printf("---imageWidth=%d imageHeight=%d safeRegionStart=%d safeRegionWidth=%d---n", imageWidth, imageHeight, safeRegionStart, safeRegionWidth);
    totalP = imageWidth * imageHeight ;
    totalSafeP = imageHeight * safeRegionWidth;


    printf("---total # of pixels: %d Total # of safe Pixels: %d---nn", totalP, totalSafeP);

    i=1;

    while(i!=totalP)
    {
        i  ;
        scanf("%d", amp;pixel);
        printf("nValue of pixel %d", pixel);


    }//End for scanning all pixels*/
}//while loop
 

ПРАВКА: я исправил это

 while(scanf("%d %d %d %d", amp;imageWidth, amp;imageHeight, amp;safeRegionStart, amp;safeRegionWidth)==4amp;amp;!feof(stdin)) { }
 

!feof(stdin) вероятно, в этом нет необходимости.

Комментарии:

1. Тогда что же он делает? Вы отладили его?

2. Он ничего не сделал, потому что while(!EOF) был оценен как ложный, поэтому while никогда не выполнялся.

Ответ №1:

EOF является только целочисленной константой. В большинстве систем это так -1 . !-1 есть false и while(false) ничего не будет делать.

То, что вы хотите, — это проверить возвращаемые значения scanf . scanf возвращает количество успешно прочитанных элементов и в конечном итоге EOF .

Ответ №2:

Что ж, на этот вопрос легко ответить:

EOF является константой #define , например #define EOF -1 .

Таким образом, ваше while(!EOF) условие всегда будет ложным, и цикл не будет выполняться. Вам нужно проверить возвращаемое значение scanf на соответствие EOF.

Вам нужно что-то вроде:

 while(scanf("%d %d %d %d", amp;imageWidth, amp;imageHeight, amp;safeRegionStart, amp;safeRegionWidth) != EOF){
 

Комментарии:

1. На самом деле так и должно быть scanf("%d %d %d %d",...) == 4

Ответ №3:

Вы должны использовать переменную для хранения значения символа, которое может быть потенциально EOF . Что-то вроде ..

 while(4==scanf("%d %d %d %d", amp;imageWidth, amp;imageHeight, amp;safeRegionStart, amp;safeRegionWidth)) {
//do stuff
}
 

В противном случае !EOF всегда является ложным.

Комментарии:

1. Поскольку это может привести к бесконечному циклу, он должен быть scanf("%d %d %d %d",...) == 4

2. Неправильный. феоф() делает не то, что вы, кажется, думаете.

3. Я вижу, его нужно использовать с fscanf. Сегодня я ничего не понимаю правильно. Я прав ? Спасибо, что указали.

Ответ №4:

Цикл никогда не будет введен. EOF является постоянным значением, которое является -1 (проверьте stdio.h это определение). Так !EOF же 0 и то, что ложно, поэтому оно никогда не будет введено.

Чтобы проверить, закончился файл или нет, вы можете использовать: if (feof (file_ptr)) break;

 while (1)
{
   /* Read file */
   if (feof (file_ptr))
     break;
   /* Do work */
}