Microsoft KB Archive/58427

= PRB: Changing STDIN Translation Mode from Text to Binary =

Article ID: 58427

Article Last Modified on 12/11/2003

-

APPLIES TO

 The C Run-Time (CRT), when used with:  Microsoft C Professional Development System 5.1

 Microsoft C Professional Development System 6.0

 Microsoft C Professional Development System 6.0a

 Microsoft C Professional Development System 6.0a</li></ul>

 Microsoft C/C++ Professional Development System 7.0</li></ul>

 Microsoft Visual C++ 1.0 Professional Edition</li></ul>

 Microsoft Visual C++ 2.0 Professional Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q58427

<div class="symptoms_section">

SYMPTOMS
In Microsoft C, when a ^Z (CTRL+Z) is entered as part of a string input in response to gets or scanf, the next line does not prompt for an input.

<div class="cause_section">

CAUSE
Because STDIN is a predefined file pointer opened in text mode, and a ^Z character is an end-of-file marker in MS-DOS, the ^Z character automatically closes the file pointer. The gets or scanf function does not stop to accept input from STDIN following the previous input containing a ^Z character.

<div class="resolution_section">

RESOLUTION
To work around this problem, change the translation mode of STDIN from text mode to binary mode. Because the ^Z character is not translated as an end-of-file character in binary mode, the gets from the following example accepts input only following a ^Z from STDIN after the translation.

<div class="moreinformation_section">

MORE INFORMATION
To change STDIN from text mode to binary mode, use the setmode run-time function to change the translation mode. The following code demonstrates this behavior, and includes the setmode function to show how to change STDIN from text mode to binary mode. Remove the comment delimiters to observe the difference in the program's behavior after adding the setmode function.

Sample Code
/* Compile options needed: none


 * 1) include <stdio.h>
 * 2) include <string.h>
 * 3) include <fcntl.h>

void main (void) {  char str1[20];

/* if( setmode ( fileno ( stdin ), O_BINARY ) == -1 ) perror ( &quot;Cannot set stdin to binary mode&quot; ); else printf ( &quot;stdin mode successfully set to binary\n&quot; ); do { printf ( &quot;Enter a string : &quot; ); gets ( str1 ); } while ( strcmp( str1,&quot;n&quot; && strcmp( str1, &quot;\n\r&quot;) );

} Compile the above code and run the program. If you enter a string and then press the ENTER key, the program will loop and prompt for another string. However, if you enter a ^Z character, you will see that the program doesn't perform as you would expect.

Now, uncomment the if-else clause. Recompile the program and run it. Input that includes a ^Z character is now accepted without infinite looping.

Additional query words: 1.00 1.50 2.00 5.10 6.00 6.00a 6.00ax 7.00

Keywords: kbcrt kbprb KB58427

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.