Author: Bas Hamstra
Date: 13:14:15 08/27/04
Go up one level in this thread
On August 27, 2004 at 16:04:20, Gerd Isenberg wrote:
>On August 27, 2004 at 15:41:33, Bas Hamstra wrote:
>
>>On August 27, 2004 at 15:07:28, Gerd Isenberg wrote:
>>
>>>On August 27, 2004 at 14:58:56, Gerd Isenberg wrote:
>>>
>>>>On August 27, 2004 at 14:28:06, Bas Hamstra wrote:
>>>>
>>>>>The following program gives me other output in XP than under previous windows
>>>>>versions:
>>>>>
>>>>>#include <stdio.h>
>>>>>#include <conio.h>
>>>>>
>>>>>int main(int argc, char* argv[])
>>>>>{ char Buf[16] = {0};
>>>>>
>>>>> setbuf(stdin, NULL);
>>>>>
>>>>> while(1)
>>>>> { if(kbhit() )
>>>>> { gets(Buf);
>>>>> printf("Received: %s\n", Buf);
>>>>> }
>>>>> }
>>>>> return 0;
>>>>>}
>>>>>
>>>>>Output:
>>>>>
>>>>>aaa
>>>>>Received: Paa
>>>>>
>>>>>So, if after typing aaa the first character seems to go lost. I am pretty
>>>>>certain that under Win98 it worked like intended. Is this a bug?
>>>>>
>>>>>(I am using XP with Borland C++ Builder 4.0)
>>>>>
>>>>>Bas.
>>>>
>>>>
>>>>with msc6 under XP i get
>>>>aaa (or any other sequence)
>>>>Received: d
>>>>
>>>>Seems that stdin does not work unbuffered.
>>>>
>>>>Gerd
>>>
>>>
>>>from
>>>
>>>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/HTML/_crt_setbuf.asp
>>>
>>>...
>>>
>>>setbuf has been replaced by setvbuf, which is the preferred routine for new
>>>code. setbuf is retained for compatibility with existing code.
>>
>>Yes, that seems to solve the problem... Thanks Gerd.
>
>Seems setbuf is a bit depreciated.
>
>But setvbuf doesn't work unbuffered at all. If passing a NULL pointer,
>it allocates it's own buffer. Your routine works well without any
>setbuf with default buffer too, or with setbuf(stdin, buf).
>Is there any special reason to switch off buffering here?
There sure is: this is used in the winboard interface and you can't have any
buffering there, all input/output must be immediately transferred. The way I
check for user-input during the search is with a search-interrupt. This
interrupt checks twice a second if any key is pressed, if so, it sets a flag
that will terminate the search. After the search has ended there follows a
fgets() to collect and interpret the input.
Bas.
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.