- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试转换程序(它是 vscode 和调试之间的桥梁)该程序是用 C# 编写的。
它基于 o vscode-mono-debug
( https://github.com/Microsoft/vscode-mono-debug/blob/master/src/Protocol.cs )
嗯,在 C# 中,我可以将标准输入作为流读取:
byte[] buffer = new byte[BUFFER_SIZE];
Stream inputStream = Console.OpenStandardInput();
_rawData = new ByteBuffer();
while (!_stopRequested) {
var read = await inputStream.ReadAsync(buffer, 0, buffer.Length);
if (read == 0) {
// end of stream
break;
}
if (read > 0) {
_rawData.Append(buffer, read);
ProcessData();
}
}
我试试这个:
#define _WIN32_WINNT 0x05017
#define BUFFER_SIZE 4096
#include<iostream>
#include<thread>
#include <sstream>
using namespace std;
class ProtocolServer
{
private:
bool _stopRequested;
ostringstream _rawData;
public:
void Start()
{
char buffer[BUFFER_SIZE];
while (!cin.eof())
{
cin.getline(buffer,BUFFER_SIZE);
if (cin.fail())
{
//error
break;
}
else
{
_rawData << buffer;
}
}
}
};
int main()
{
ProtocolServer *server = new ProtocolServer();
server->Start();
return 0;
}
输入:
Content-Length: 261\r\n\r\n{\"command\":\"initialize\",\"arguments\":{\"clientID\":\"vscode\",\"adapterID\":\"advpl\",\"pathFormat\":\"path\",\"linesStartAt1\":true,\"columnsStartAt1\":true,\"supportsVariableType\":true,\"supportsVariablePaging\":true,\"supportsRunInTerminalRequest\":true},\"type\":\"request\",\"seq\":1}
这会正确读取前两行。由于协议(protocol)没有把\n放在最后,所以在3交互中卡在了cin.getline中。
切换到 read() 会导致它停留在 cin.read() 处,并且根本不读取任何内容。
我发现了一些类似的问题: StackOverFlow Question
和例子: Posix_chat_client
但我不需要它一定是异步的,但它适用于 windows 和 linux。
对不起我的英语
谢谢!
最佳答案
您想要的是无格式输入操作。
这是仅使用 std::iostream 的 1:1 转换。唯一的“技巧”是使用和尊重 gcount()
:
std::vector<char> buffer(BUFFER_SIZE);
auto& inputStream = std::cin;
_rawData = std::string {}; // or _rawData.clear(), e.g.
while (!_stopRequested) {
inputStream.read(buffer.data(), buffer.size());
auto read = inputStream.gcount();
if (read == 0) {
// end of stream
break;
}
if (read > 0) {
_rawData.append(buffer.begin(), buffer.begin() + read);
ProcessData();
}
}
我个人建议放弃 read == 0
检查以支持更准确的检查:
if (inputStream.eof()) { break; } // end of stream
if (!inputStream.good()) { break; } // failure
请注意 !good()
也会捕获 eof()
,因此您可以
if (!inputStream.good()) { break; } // failure or end of stream
#include <iostream>
#include <vector>
#include <atomic>
struct Foo {
void bar() {
std::vector<char> buffer(BUFFER_SIZE);
auto& inputStream = std::cin;
_rawData = std::string {};
while (!_stopRequested) {
inputStream.read(buffer.data(), buffer.size());
auto read = inputStream.gcount();
if (read > 0) {
_rawData.append(buffer.begin(), buffer.begin() + read);
ProcessData();
}
if (!inputStream.good()) { break; } // failure or end of stream
}
}
protected:
void ProcessData() {
//std::cout << "got " << _rawData.size() << " bytes: \n-----\n" << _rawData << "\n-----\n";
std::cout << "got " << _rawData.size() << " bytes\n";
_rawData.clear();
}
static constexpr size_t BUFFER_SIZE = 128;
std::atomic_bool _stopRequested { false };
std::string _rawData;
};
int main() {
Foo foo;
foo.bar();
}
打印(例如,当读取它自己的源文件时):
got 128 bytes
got 128 bytes
got 128 bytes
got 128 bytes
got 128 bytes
got 128 bytes
got 128 bytes
got 92 bytes
关于c++ - 在不使用 getline 的情况下在 C++ 中读取标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43418643/
main = do input [f a] -> f [a] sequenceA [] = pure [] sequenceA (x:xs) = (:) x sequenceA xs 很
while(getline()) 和 while(!getline().eof()) 有什么区别? 正在解析输入字符串。我尝试了两种条件检查,结果有所不同。 std::string testStr =
我知道我知道。以前有人问过这个问题,但我查看了所有答案,但似乎没有一个能解决我的问题。当我使用 getline 函数获取文件中一行的内容时,它不起作用。 getline(file, line); '文
使用 getline() 函数时出现以下错误: 没有重载函数“getline”的实例匹配参数列表 在一个名为“Time”的类中,我在读取以下输入时使用它: istream & operator >>
我正在阅读 C++ 入门书并尝试所有代码示例。我对这个很感兴趣: #include #include using std::string; using std::cin; using std::c
#include #include #include using namespace std; int main() { char d,a[9],e[9]; cin.getline(a,9); c
假设我想从控制台读取一个整数,并且我不希望程序在输入非整数字符时中断。这就是我的做法: #include #include #include using namespace std; int m
这可能不是一个错误,但我不知道出了什么问题。我的第一个条目在第二次迭代中对 str1 重复,并且从那时起也是如此。只有第一次迭代顺利。 #include #include using namesp
string text; getline(text.c_str(),256); 1) 我收到错误消息“错误:没有匹配函数来调用‘getline(const char*, int)”上面有什么问题,因为
哪个更好,更受欢迎?我真的发现阅读 API 令人困惑。 最佳答案 成员(member)版读入char*,免费版读入std::string。所以更喜欢免费版!像这样使用它: std::istream &
我正在尝试解决这个问题,但出于某种原因,我一直收到这个问题: no instance of "getline" matches the argument list. 我查过这个问题,很多次是因为人们使
长话短说 使用 libc++ 版本的 getline 函数的程序在从管道读取输入时会阻塞,直到管道的缓冲区已满。 NOT libstdc++ 版本的 getline 函数也是如此:这里函数立即读取并返
我的程序的一部分: #include #include #include #include #include using namespace std; /* Works for istrin
我是一名正在准备期末考试的 C++ 初学者。我用两种方式写了一个程序。第一个代码使用 cin.getline() 并且不能正常工作。第二个代码使用 cin.get() 和 cin >> 并正确执行所有
我正在尝试使用 getline 解析文档以获取整行并将其放入名为“line”的字符串变量中。问题是我收到一条错误消息:“没有重载函数 getline 的实例与参数列表匹配。”谁能帮我解决这个问题? #
我有一个带有 getline 函数的源代码文件,当我编译它时收到错误(下面的代码和错误)。我的问题是我从一个已经编译和工作的程序(也包括在下面)中复制并粘贴了整个函数。我在程序的其他 2 个源代码文件
我正在尝试从文件中读取,但 C++ 不想运行 getline()。 我收到这个错误: C:\main.cpp:18: error: no matching function for call to '
例子: std::ifstream in("some_file.txt"); std::string line; // must be outside ? while(getline(in,line)
注意:已解决,问题不是 getline() 而是 find 函数数组填充不当! 在发布我自己的问题之前,我已经查找了几个问题,但找不到我的问题的答案。这是我发布的第一个问题,但在发布我自己的问题之前,
我的代码块中有一个 getline 函数。但是在编译 make 文件时出现以下错误: cc -DMAIN -c -o terp.o terp.c terp.c:130:15: error: con
我是一名优秀的程序员,十分优秀!