【发布时间】:2018-03-05 15:16:05
【问题描述】:
背景: 此处显示的问题/代码是我正在尝试创建的更大程序的一部分(我被告知要修剪它)。 (本节的)目的是能够接收 std::cin 输入并(当它工作时)将其输入函数: srcdsControl->WriteText(string(chr));这个函数是我自己没有创建的更大程序的一部分。
我正在尝试将输入和输出从 C++ 控制台应用程序重定向到 Python 脚本(我已经编写过,并且可以正常工作)。当我在控制台窗口中键入时,它会很好地接收输入。但是,当我将输入从 python 发送到程序的标准输入时(格式为 'command\r\n'),它会触发以下错误:
我已经尝试了以下两个程序,它们给出的错误完全相同。
我的 C++ 代码(测试 1):
#include "stdafx.h"
#include <iostream>
#include <string>
int main()
{
try
{
char chr[2];
chr[1] = 0;
while (1)
{
if (std::cin >> std::noskipws >> chr[0])
{
if (chr[0] == '\r')
std::cout << "\r";
//srcdsControl->WriteText(string(chr));
std::cout << std::string(chr) << "\r\n";
}
}
}
catch (...)
{
// Ignore exception and just stop the thread.
}
}
我的 C++ 代码(测试 2):
#include "stdafx.h"
#include <iostream>
#include <string>
int main()
{
try
{
char chr[2];
chr[1] = 0;
while (1)
{
std::string s = "";
if (std::getline(std::cin, s))
{
for (char& ch : s) {
chr[0] = ch;
if (chr[0] == '\r')
std::cout << "\r";
//srcdsControl->WriteText(std::string(chr));
std::cout << std::string(chr) << "\r\n";
}
}
}
}
catch (...)
{
// Ignore exception and just stop the thread.
}
}
注意:我不是 C++ 开发人员,我对 C++ 的了解非常有限。我需要一个具体/简单的答案。
我的问题:如何防止此错误并确保正确接收输入?如果需要,我很乐意使用完全不同的方法来接收输入,但需要对其进行具体演示。
【问题讨论】:
-
考虑使用
std::getline来读取数据,因为您似乎正在寻找完整的行。 '\r' 只是窗口中行尾标记的一半。请参阅对话框底部的小注释“按重试调试应用程序”并利用这个机会 -
如何防止此错误 -- 在将 C++ 代码放入更大的程序之前,您可以编写一个非常小的
main程序,只需要查看这些行它的行为方式。无需引入 Python、线程或调用WriteText即可进行此测试以了解 C++ 流将如何工作。那将被视为minimal reproducible example 而不是代码 sn-ps。 -
@PaulMcKenzie 我现在编辑了帖子,只显示一个小的
main程序。 -
@user4581301 我尝试调试它,但异常来自一个单独的代码文件,我在 Visual Studio/C++ 方面的经验太少,无法理解可能提供的任何有用信息。
-
你的程序有几个问题。 (1) 它没有尝试正确处理 EOF(不,try-catch 不会这样做)。 (2) 它确实尝试处理它很可能不应该处理的
\r(运行时库为您翻译\r\n序列)。 (3) 看起来程序试图在每个字符后插入一个换行符。如果这是它的生活目标,那么有更简单、更有效的方法来做到这一点,而无需编写任何代码。
标签: c++ console-application stdout stdin