Articles of iostream

如何在cout上使用isatty(),或者我可以假设cout ==文件描述符1?

那么,这个问题基本上是这么说的。 我有一个命令行实用程序,可以使用pipe道或I / Oredirect交互或脚本使用。 我正在使用cin和cout进行I / O操作,并且如果输出是控制台,我想在末尾编写一个额外的EOL,以便用户提示符将从下一行开始。 在脚本中这将是有害的。 我可以假设cin == 0, cout == 1吗? 我知道没有干净的方式来获取stream的文件描述符。 还是呢?

我可以使用CreateFile,但强制句柄到一个std :: ofstream?

有没有办法利用Win32 API中的文件创build标志,如FILE_FLAG_DELETE_ON_CLOSE或FILE_FLAG_WRITE_THROUGH ,如http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx所述 ,但是然后强制该句柄成std :: ofstream? 与stream媒体的接口显然是平台独立的; 我想强制一些依赖于平台的设置在“引擎盖下”。

如何在C ++ / Windows中输出到控制台

在Linux上使用C ++编写iostream时,它会在terminal上显示程序输出,但是在Windows中,它只是将输出保存到stdout.txt文件中。 我怎么能在Windows中使输出显示在控制台中?

我怎样才能使Unicode iostream I / O在Windows和Unix的土地上工作?

注意:这是一个问题答案 ,以便logging其他人可能会觉得有用的技术,以便或许能够意识到别人的更好的解决scheme。 随意添加评论或问题作为评论。 也请随时添加额外的答案。 🙂 问题1: 通过stream控制台对Unicode的支持在Windows API级别受到严重限制。 可用于普通桌面应用程序的唯一相关代码页是65001,UTF-8。 然后交互式input在API级失败,甚至非ASCII字符输出失败 – 而C ++标准库实现不提供这个问题的解决方法。 #include <iostream> #include <string> using namespace std; auto main() -> int { wstring username; wcout << L"Hi, what's your name? "; getline( wcin, username ); wcout << "Pleased to meet you, " << username << "!\n"; } H:\ personal \ web \ […]

可以阻止cin等待input吗?

在graphics应用程序中,我使用控制台input执行debugging命令。 在创build控制台时,还会创build一个新线程来收集处理所有input的用户命令,graphics应用程序将继续并行运行。 我使用boost :: thread库。 它到目前为止工作良好,但我还没有find一个很好的解决scheme来停止执行此线程。 线程始终在等待用户input: while(appRunning) { std::cin>>theUserCommand; // …do stuff } 然后,当graphics应用程序结束时,它将停止所有的控制台function,其中包括线程: appRunning = false; // do some more related clean up myListeningThread->join(); 正如你所看到的,std :: cin将在等待用户input,在联接被调用之后。 我尝试过的一个解决scheme是创build事件“合成键击”,std :: cin将得到你用ENTER发送的任何值,线程将很好地结束,这个解决scheme是可怕的,我不想保留它。 此外,它在工具执行的环境之一中工作,但当我尝试使用它与UI API一起使用失败。 你们能指导我如何以正确的方式解决这个问题? 如果在C ++文档中有一个函数可以阻止std :: cin等待用户input,并且只是继续执行程序,那么还不能确定地说: 编辑:很好,我发现keybd_event是有点误导一些环境,显式指定与WriteConsoleInputinput处理程序工作良好。

seekg()神秘地失败

我有一个2884765579字节文件。 这是用这个函数重复检查,返回这个数字: size_t GetSize() { const size_t current_position = mFile.tellg(); mFile.seekg(0, std::ios::end); const size_t ret = mFile.tellg(); mFile.seekg(current_position); return ret; } 然后我做: mFile.seekg(pos, std::ios::beg); // pos = 2883426827, which is < than the file size, 2884765579 这设置了故障位。 errno没有改变。 我可以采取哪些措施来解决这个问题? 我绝对相信 : 文件大小真的是2884765579 pos是真的2884765579 失败位在.seekg()之前没有设置 失败位在.seekg()后面设置,并且两者之间没有其他调用 该文件用二进制标志打开 编辑 :万一有人跑到相同的问题..使用我写的代码(仅适用于Windows)和许多更less的麻烦给你: class BinaryIFile { public: BinaryIFile(const string& path) […]

有没有办法在Windows中的basic_iostream获取非lockingstream的插入/提取?

我是一个C ++开发人员,直到最近我还不得不创build一个针对Windows的应用程序时,他主要在Solaris和Linux上进行编程。 我一直在使用基于TCP套接字支持的C ++ I / Ostream的通信devise。 这个devise是基于从stream中连续读取单个线程(大部分时间阻塞在套接字读取中等待数据),而其他线程通过同一个stream发送(通过互斥体同步)。 当移动到Windows时,我select使用boost :: asio :: ip :: tcp :: iostream来实现套接字stream。 我惊讶地发现上面的multithreadingdevise导致了Windows上的死锁。 看起来, operator<<(std::basic_ostream<…>,std::basic_string<…>)声明了一个“Sentry”,它locking整个stream的input和输出操作。 由于我读取的线程总是在stream中等待,所以当创build这个Sentry时,从其他线程发送死锁。 这里是运算符<<和Sentry构造过程中调用堆栈的相关部分: … ntdll.dll!7c901046() CAF.exe!_Mtxlock(_RTL_CRITICAL_SECTION * _Mtx=0x00397ad0) Line 45 C CAF.exe!std::_Mutex::_Lock() Line 24 + 0xb bytes C++ CAF.exe!std::basic_streambuf<char,std::char_traits<char> >::_Lock() Line 174 C++ CAF.exe!std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::_Sentry_base(std::basic_ostream<char,std::char_traits<char> > & _Ostr={…}) Line 78 C++ CAF.exe!std::basic_ostream<char,std::char_traits<char> >::sentry::sentry(std::basic_ostream<char,std::char_traits<char> > & _Ostr={…}) […]

致命错误C1083:无法打开包含文件:'iostream':没有这样的文件或目录

我已经重新安装了Visual Studio 2010 Professional几次,试图让它工作。 我不得不卸载Visual Studio 2012 Professional,因为它没有编译我们在课堂上做的东西。 我完全卸载了包括SQL Server在内的所有东西。 我去了VC / include和iostream头文件不在那里。 #include <iostream> int main () { cout << "hello"; system ("PAUSE"); return 0; } 这就是我想要做的,因为没有别的工作。 这真的让我疯狂,因为我需要让它工作,以便我可以做我的项目! 每次我做 新项目=>空项目=>添加一个项目来源=> .CPP 我正在运行Windows 8。 它只是说错误不能打开源文件此外,错误cout标识符是未定义…. 我想知道如果我应该做一个系统还原? 或者,如果我应该从我的恢复媒体完全重新安装Windows 8?