为什么boost::asio::ip::tcp::iostream解析输入?
Why boost::asio::ip::tcp::iostream parses input?
我尝试使用iostream类从boost ASIO读取二进制数据从TCP套接字。我使用标准提取操作符(operator>>)从流中读取数据。我使用的环境是Visual Studio 2010。问题是,当我读取流时,似乎流试图将二进制数据解析为字符串。至少这是我在调试代码时所看到的。
是否有一种方法,我可以使用iostream读取它作为二进制流,而不是字符串流?
boost::asio::io_service dataServer;
boost::asio::ip::tcp::endpoint dataServerEndpoint(boost::asio::ip::tcp::v4(), dataServerPort);
boost::asio::ip::tcp::acceptor acceptor(dataServer, dataServerEndpoint);
boost::asio::ip::tcp::iostream dataServerStream;
acceptor.accept(*dataServerStream.rdbuf());
try
{
vector<char> lineBuffer;
while (!dataServerStream.eof())
{
bool eof = dataServerStream.eof();
bool bad = dataServerStream.bad();
bool fail = dataServerStream.fail();
bool good = dataServerStream.good();
uint64_t magic;
dataServerStream >> magic;
因此,它不是从流中获取8个字节并将其移动到"magic"变量中,而是尝试解析流以获得有效的字符串化数字。这当然会失败,并且会设置失败位。
输入运算符>>
期望输入为文本,然后将其转换为正确的数据类型。如您所料,这将不能很好地处理二进制数据。
您应该使用read
代替:
uint64_t magic;
dataServerStream.read(reinterpret_cast<char*>(&magic), sizeof(magic));
你也犯了一个非常常见的初学者错误,在你循环while (!eof)
。这将不起作用,因为直到之后的才设置eof
标志,您尝试输入操作。这意味着你将迭代一次到多个。
uint64_t magic;
while (dataServerStream.read(reinterpret_cast<char*>(&magic), sizeof(magic)))
{
// Read the rest
}
相关文章:
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 检查输入是否不是整数或数字
- 正在尝试了解输入验证循环
- 读取文件并输入到矢量中
- C++如何通过用户输入删除列表元素
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 用户定义函数中的指针和输入
- make_unique可以存储文字或 iostream 输入吗?
- iostream输入问题
- C++ 仅使用 #iostream 检查输入是否为浮点数
- 将iostream输入代码从c++移植到c#
- 为什么boost::asio::ip::tcp::iostream解析输入?
- 使用IOSTREAM在同一行进行输出和输入