_read from Visual Studio 2015中的stdin

时间:2016-01-17 22:43:20

标签: c visual-studio-2013 visual-studio-2015

从控制台阅读

i = _read(_fileno(stdin), &c, 1);

在VS 2013和VS2015中表现不同,当读取输入字的最后一个字符时,'返回'关键是到期。在再次呼叫该线路时

VS2013中的

(及旧版本)c将变为10(行尾),_read将返回1(读取一个字节)

在VS2015中,c将再次为10,但_read会返回0

错误或功能?

以下小型控制台程序显示了一些细节:

// ConsoleApplication1.c

#include <stdio.h>
#include <io.h>
#include <errno.h>
#include <fcntl.h>

int main()
{
    char c;
    int i, j;
    char buf[128], buf2[128];

    /* in 2015 this will return 0 at reading '\n' */
    /* bug ? */
    _setmode(_fileno(stdin), _O_TEXT);
    /* this will return 1 at reading '\n' */
    //_setmode(_fileno(stdin), _O_BINARY);

    j = 0;
    printf("Input:\n");

    /* read characters from stdin until \n is hit */
    do {
        /* 3 lines excerpted from original program (ngspice simulator)*/
        do
            i = _read(_fileno(stdin), &c, 1);
        while (i == -1 && errno == EINTR);
        /**************************************************************/
        if (i==0)
            buf2[j] = '0';
        else if (i == 1)
            buf2[j] = '1';
        else
            buf2[j] = 'x';

        buf[j++] = c;

    } while (c != '\n');

    buf[j] = '\0';
    buf2[j] = '\0';
    /* repeat the input */
    printf("%s\n", buf);
    /* type return value of _read */
    /* last caracter is 0 in VC2015 and 1 in VC2013 */
    printf("%s\n", buf2);
    /* wait for user 'return' */
    getchar();
    return 0;
}

使用VC2010(和2008年,2013年),输出

Input:
asdfghj
asdfghj

11111111

使用VC2015我得到

Input:
asdfghj
asdfghj

11111110

1 个答案:

答案 0 :(得分:0)

Bug,由Microsoft修复,用于下一个Visual Studio 2015 CRT版本