#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 */
}