问题标签 [iostream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
2026 浏览

c++ - 有没有办法在 Windows 中的 basic_iostream 上获得非锁定流插入/提取?

我是一名 C++ 开发人员,主要在 Solaris 和 Linux 上进行编程,直到最近我被迫创建一个针对 Windows 的应用程序。

我一直在使用基于 TCP 套接字支持的 C++ I/O 流的通信设计。该设计基于单个线程从流中连续读取(大部分时间阻塞在套接字读取等待数据),而其他线程通过同一流发送(由互斥锁同步)。

迁移到 Windows 时,我选择使用 boost::asio::ip::tcp::iostream 来实现套接字流。我很沮丧地发现上面的多线程设计导致了 Windows 上的死锁。似乎operator<<(std::basic_ostream<...>,std::basic_string<...>)声明了一个“哨兵”,它为输入和输出操作锁定了整个流。由于我的读取线程始终在流上等待,因此在创建此 Sentry 时,来自其他线程的发送操作会死锁。

以下是 operator<< 和 Sentry 构造期间调用堆栈的相关部分:

如果 istream 和 ostream 组件被分别锁定,我会很好,但事实并非如此。

我可以使用流运算符的替代实现吗?我可以指示它不锁定吗?我应该实现自己的(不知道该怎么做)?

任何建议,将不胜感激。

(平台是 Windows 32 位和 64 位。使用 Visual Studio 2003 Pro 和 2008 Express 观察到的行为)

0 投票
5 回答
4958 浏览

c++ - iostream 的二进制版本

我一直在编写 iostreams 的二进制版本。它本质上允许您编写二进制文件,但让您可以控制文件的格式。示例用法:

将 my_int 写为无符号 32 位整数,并将 my_string 写为长度前缀字符串(其中前缀为 u16le)。要读回文件,您可以翻转箭头。效果很好。但是,我在设计中遇到了一个问题,我仍然对此持观望态度。所以,是时候问了。(我们做了几个假设,例如 8 位字节、2s 补码整数和 IEEE 浮点数。)

iostreams,在引擎盖下,使用streambufs。这真的是一个很棒的设计——iostreams 将 ' int' 的序列化编码为文本,并让底层的 streambuf 处理其余的。因此,您会得到 cout、fstreams、stringstreams 等。所有这些,无论是 iostreams 还是 streambufs,都是模板化的,通常在 char 上,但有时也作为 wchar。但是,我的数据是字节流,最好用' unsigned char'表示。

我的第一次尝试是基于unsigned char. std::basic_string模板足够好,但streambuf没有。我在一个名为 的类中遇到了几个问题codecvt,我永远无法遵循这个unsigned char主题。这提出了两个问题:

1)为什么一个streambuf要对这些事情负责?似乎代码转换超出了streambuf的职责——streambufs应该接受一个流,并缓冲数据到/从它。而已。像代码转换这样高级别的东西感觉应该属于 iostreams。

由于我无法让模板化的流缓冲区与 unsigned char 一起工作,所以我回到 char,并且只是在 char/unsigned char 之间转换数据。出于显而易见的原因,我试图尽量减少演员表的数量。大多数数据基本上都在 read() 或 write() 函数中结束,然后调用底层的 streambuf。(并在过程中使用强制转换。)读取功能基本上是:

好的解决方案,坏的解决方案?


前两个问题表明需要更多信息。首先,研究了诸如 boost::serialization 之类的项目,但它们存在于更高级别,因为它们定义了自己的二进制格式。这更适用于较低级别的读取/写入,其中希望定义格式,或者格式已经定义,或者不需要或不需要批量元数据。

其次,有些人询问了binary::u32le修饰符。它是一个类的实例化,目前持有所需的字节序和宽度,将来可能是有符号的。该流包含该类的最后传递实例的副本,并在序列化中使用它。这是一种解决方法,我最初尝试过重载 << 运算符:

然而在当时,这似乎并没有奏效。我在模棱两可的函数调用方面遇到了几个问题。对于常量来说尤其如此,尽管您可以,正如一位海报所建议的那样,将其强制转换或仅将其声明为const <type>. 我似乎记得还有其他一些更大的问题。

0 投票
1 回答
1427 浏览

c++ - C++ Boost io 流,错误处理

是否可以使自定义流像标准流一样工作以解决错误?那就是默认使用好/失败/坏/eof位而不是异常?

boost 文档仅提到为流错误抛出 std::failure 并让其他错误传播(例如,尝试分配缓冲区的 badalloc),但是 boost 代码似乎没有捕获这些,而是​​依靠用户代码来处理它们,但是我所有现有的代码都依赖于 good()、bad() 等方法和 clear() 方法,以防出错后需要重试。

0 投票
3 回答
1106 浏览

java - 从 C++ 中 java 的 writeInt 方法写入的文件中读取 int?

怎么做呢?另外,有没有简单的方法可以做到这一点?使用像 Boost 之类的库?

0 投票
3 回答
39839 浏览

.net - 是否可以从 url 读取到 System.IO.Stream 对象?

我正在尝试从 url 读取到 System.IO.Stream 对象。我试着用

但我收到一个错误,即 FileStream 对象不支持 URI 格式。有没有我可以使用从 System.IO.Stream 继承的可以从 URL 读取的方法?

0 投票
2 回答
7214 浏览

c++ - Inheriting std::istream or equivalent

I need to bridge two libraries over a stream.

and some function from another libraries that looks like this

I have no control over how the QDataStream is created and I'm not allowed to change the interface of read_somthing function.

The first thing I can think of is write a class that inherits istream and wraps QDataStream. Have anybody done that before?

If what I thought wasn't the proper way, I wonder what is the best way to achieve that.

0 投票
1 回答
534 浏览

c++ - 有没有一种优雅的方式来桥接 Asio 中的两个设备/流?

给定Asio中的两个面向流的 I/O 对象,将数据从一个设备双向转发到另一个设备的最简单方法是什么?这可以用boost::iostreams::combinationboost::iostreams:copy来完成吗?还是手动方法更好——在每一端等待数据,然后将其写入另一个流?换句话说,如何利用BoostAsio来生成最少的代码?

示例应用程序将按照此问题的要求在串行端口和 TCP 套接字之间进行流式传输。

0 投票
1 回答
1521 浏览

c++ - 在windows中锁定文件

我正在处理一些遗留代码,它打开一个文件并将二进制数据添加到文件中:

出于某种原因,代码会打开文件两次。这是因为 _sopen 用于在 Windows 中锁定文件吗?

如果是这样,为什么 std::ifstream::open 不锁定文件?

有没有办法检查 Windows 文件句柄是否已经关闭?

0 投票
3 回答
4203 浏览

c++ - 具有二进制数据的 C++ fstream << 和 >> 运算符

我一直阅读并被告知,在处理二进制文件时,应该使用 read() 和 write() 而不是 << 和 >> 运算符,因为它们用于格式化数据。我还读到可以使用它们,但这是一个高级主题,我找不到任何人深入探讨和讨论的地方。

我最近看到了一些执行以下操作的代码:

当我指出在二进制文件中使用 << 运算符时,有人告诉我 rdbuf() 调用返回一个 streambuf * 并且 << 重载了 streambuf* 并进行了不带格式的直接复制,因此是安全的。

这是真的而且安全吗?效率如何?有什么陷阱吗?细节将不胜感激。

谢谢!

0 投票
1 回答
295 浏览

c++ - 如何实现作用域 iostream 格式化?

我想在 C++ 中限制 I/O 流格式化的效果,这样我就可以做这样的事情:

以便在离开块时将基数、精度、填充等恢复到以前的值。

这是我想出的最好的:

...但是 c++ iostreams 是一个相当棘手的领域,我不确定上述内容的安全性/适当性。危险吗?您(或有第三方)已经做得更好了吗?