2015-07-19 34 views
0

所以調試代碼時,下面我得到一個「調試斷言失敗」錯誤窗口消息:爲什麼設置setmode時使用getline會導致「調試斷言失敗」消息?

Expression: ((_Stream->_flag & _IOSTRG) || (fn = _fileno(_Stream), 
(_textmode_safe(fn) == __IOINFO_TM_ANSI) && !_tm_unicode_safe(fn)))) 

但是,如果我註釋掉setmode線,是沒有問題的。

調試總是在包含getline的行中斷開。我應該如何修改代碼才能使用getline掃描數據?

#include "stdafx.h" 
#include <iostream> 
#include <string> 
#include <io.h> 
#include <fcntl.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    _setmode(_fileno(stdin), _O_U16TEXT); 
    _setmode(_fileno(stderr), _O_U16TEXT); 
    _setmode(_fileno(stderr), _O_U16TEXT); 

    std::string myString; 
    getline(std::cin, myString); 
    std::cout << "You typed in " << myString << std::endl; 

    std::cin.get(); 
    return 0; 
} 
+1

斷言的哪個子表達式評估哪個值?如何使用'std :: wcin'?如何去除對'_setmode()'的調用?在任何情況下,您都深深陷入實現定義的行爲,因此請檢查您正在使用的特定編譯器的文檔。另外,將該編譯器及其版本添加到該問題中。 –

+0

什麼是這些'_setmode' whatsits?你可以指向文檔嗎?你爲什麼不使用標準功能? –

+0

@lazarea:將問題添加到問題中。不在評論部分。對_問題。 –

回答

0

既然你似乎是設置某種對STDIN UTC-16模式的,那豈不是更有意義的std::wcin(的std::cin寬字符版本)讀入一個std::wstring?可以想象,這個特定實現的非標準特性在這方面有要求。

我可以在網上找到的所有證據(這並不多)顯示this is the recommended approach for this mode