Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!seismo!husc6!panda!genrad!decvax!decwrl!pyramid!voder!kontron!cramer From: cramer@kontron.UUCP (Clayton Cramer) Newsgroups: comp.sys.ibm.pc Subject: Re: Unbuffered I/O using MicroSoft C 3.0 Message-ID: <1299@kontron.UUCP> Date: Thu, 15-Jan-87 21:04:02 EST Article-I.D.: kontron.1299 Posted: Thu Jan 15 21:04:02 1987 Date-Received: Fri, 16-Jan-87 21:37:55 EST References: <1867@sunybcs.UUCP> <802@maynard.BSW.COM> Organization: Kontron Electronics, Mt. View, CA Lines: 35 > Summary: Can't read a character at a time using Microsoft C; program > sees no input until carriage return typed. > > A respondent erroneously blamed the printer on which the C program > was echoing its output; the respondent failed to note that the > original poster had thought of that and had tried sending output > to the console, with identical results. > > This problem has nothing to do with Microsoft C. It is a feature of DOS. > Standard input (the console) is normally opened by DOS in ASCII mode, in > which a program reading from stdin blocks until a carriage return is typed. > > To be woken up on every character, you need to put stdin into binary mode. > You do this with the IOCTL DOS call (INT 21, AH=44). Do subfunction AL=0 > first to get the mode bits (returned in DX), then set the "binary" bit > (bit 5), then do subfunction 1 to set the mode bits (from DX). For both > calls, the file handle goes in BX. > > Note that binary mode will also disable ^S and ^C processing. Don't forget > to put the console back in ASCII mode! > -- > Larry Campbell The Boston Software Works, Inc. Even easier: #include setmode (fileno (stdin), O_BINARY); /* You are now in binary mode on stdin. */ setmode (fileno (stdin), O_TEXT); /* You are back in text mode on stdin. */ Clayton E. Cramer