【发布时间】:2010-06-10 16:48:21
【问题描述】:
在 Linux 2.6.32 上使用 gcc 4.4.3,将 std::basic_ofstream 连接到 FIFO 时出现 bad_cast 异常。
通过调试器,我可以看到错误是在标准库的不同位置生成的,因为流或 filebuf 对象的 _M_codecvt 成员为 NULL。它发生的确切位置取决于操作的顺序,但似乎每个原因都是相同的。
所以我在这里做了一些根本上愚蠢的事情吗? ofstream 和 ifstream 工作正常。有什么理由不应该将除 char 之外的任何内容附加到 FIFO 吗?
提前致谢。
编辑:添加源代码。
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <sys/stat.h>
#include <pthread.h>
using namespace std;
//#define CHAR char
#define CHAR unsigned char
bool still_writing = true;
void* reader (void*)
{
basic_ifstream<CHAR> in ("FIFO", fstream::in);
basic_streambuf<CHAR> *stream_buffer = in.rdbuf();
bool no_reads = true;
CHAR buffer[10];
while (stream_buffer->in_avail() ||
still_writing ||
no_reads)
{
in.readsome(buffer, 10);
const int got = (int)in.gcount();
if (got > 0) {
std::cerr << "Got something!\n";
no_reads = false;
}
}
}
int main ()
{
mkfifo ("FIFO", S_IRUSR | S_IWUSR);
pthread_t reader_thread_id;
pthread_create (&reader_thread_id, NULL, reader, NULL);
basic_ofstream<CHAR> out ("FIFO");
out << (CHAR) 70;
still_writing = false;
out.flush();
pthread_join (reader_thread_id, NULL);
remove ("FIFO");
}
在这个版本中,异常来自stream_buffer->in_avail() 如果你交换#define 语句,一切都很好。
【问题讨论】:
-
您究竟是如何附加流的?你有一些示例代码吗?
-
我已经添加了测试代码。我只是用 basic_(i/o)fstream 打开 FIFO。
-
更多的是猜测而不是真正的答案:流尝试从全局语言环境中获取 std::codecvt
,但由于唯一的标准编解码器是对于 char 和 wchar_t。解决方法:使用 char 而不是 unsigned char,或者使用包含正确类型的 codecvt 的语言环境来灌输流。 -
谢谢埃里克。根据我能够弄清楚的情况,这似乎很可能。写一个新方面听起来很有趣,但改用 char 似乎更谨慎。
标签: c++ iostream fifo unsigned-char