2010-06-10 31 views
0

En utilisant gcc 4.4.3 sur Linux 2.6.32, j'obtiens des exceptions bad_cast lors de la connexion de std :: basic_ofstream à une FIFO.Connexion de std :: basic_ofstream <unsigned char> à une FIFO. Exceptions bad_cast

En passant par le débogueur, je peux voir que l'erreur est générée à divers endroits de la bibliothèque standard car le membre _M_codecvt de l'objet stream ou filebuf est NULL. Exactement où cela se passe dépend de l'ordre des opérations, mais il semble être la même cause dans chacun. Je fais donc quelque chose de fondamentalement stupide ici? ofstream et ifstream fonctionnent bien. Y a-t-il une raison pour laquelle vous ne devriez pas attacher un flux de quoi que ce soit en dehors de char à un FIFO?

Merci d'avance.

EDIT: Ajout du code source.

#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"); 
} 

Dans cette version, l'exception découle de stream_buffer->in_avail() Si vous échangez les #define déclarations, tout va bien.

+1

Comment attacher le flux? Avez-vous un exemple de code? – sth

+0

J'ai ajouté un code de test. Je suis en train d'ouvrir le FIFO avec basic_ (i/o) fstream. –

+1

Plus qu'une supposition qu'une vraie réponse: Le flux tente d'obtenir un std :: codecvt à partir des paramètres régionaux globaux, mais ne parvient pas à en obtenir un car les seuls codecvt standards sont pour char et wchar_t. Solutions de contournement: utilisez char au lieu de char non signé, ou imprimez le flux avec un environnement local contenant un codecvt du bon type. –

Répondre

0

J'ai eu un problème similaire. Ce que j'ai découvert est que le réglage d'un skipws -flag ne doit pas être défini. Pour assurer cette utilisation std::noskipws(your_stream_obj). Je l'ai débogué dans le code gcc et j'ai découvert pourquoi c'est arrivé, mais je l'ai déjà oublié.

Un espoir qui aide ...