Вопрос по поводу while (! EOF) - PullRequest
1 голос
/ 08 июня 2011

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

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

Однако фрагмент кода некажется, что-то делает,

while(!EOF){


    scanf("%d %d %d %d", &imageWidth, &imageHeight, &safeRegionStart, &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---\n\n", totalP, totalSafeP);

    i=1;

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


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

РЕДАКТИРОВАТЬ: я исправил это

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

!feof(stdin), вероятно, не нужно.

Ответы [ 4 ]

8 голосов
/ 08 июня 2011

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

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

2 голосов
/ 08 июня 2011

Ну, это легко ответить:

EOF - это постоянная #define, например #define EOF -1.

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

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

while(scanf("%d %d %d %d", &imageWidth, &imageHeight, &safeRegionStart, &safeRegionWidth) != EOF){
1 голос
/ 08 июня 2011

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

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

while (1)
{
   /* Read file */
   if (feof (file_ptr))
     break;
   /* Do work */
}
1 голос
/ 08 июня 2011

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

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

Иначе! EOF всегда ложно.

...