0
在Linux 2.6.32上使用gcc 4.4.3時,在將std :: basic_ofstream連接到FIFO時,出現bad_cast異常。將std :: basic_ofstream <unsigned char>連接到FIFO。 bad_cast例外
單步執行調試器,可以看到錯誤是在標準庫中的各個位置生成的,因爲流或filebuf對象的_M_codecvt成員爲NULL。究竟發生在何處取決於操作的順序,但它似乎是每個操作的原因。
那麼我在做一些根本上愚蠢的事嗎? ofstream和ifstream正常工作。有什麼理由不應該將除字符之外的任何東西附加到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
陳述,一切都很好。
你究竟如何附加流?你有一些示例代碼? – sth 2010-06-10 16:51:10
我已經添加了測試代碼。我只是用basic_(I/O)fstream打開FIFO。 – 2010-06-10 19:02:17
猜測比實際答案更多:流試圖從全局語言環境中獲取std :: codecvt,但未能獲得一個,因爲唯一的標準codecvt用於char和wchar_t。解決方法:使用char而不是unsigned char,或者使用包含正確類型的codecvt的語言環境來灌注流。 –
2010-06-10 19:22:12