Tentativa de pegar uma linha de std::basic_ifstream <char32_t> resulta em std::bad_cast

1. Tentativa de pegar uma linha de std::basic_ifstream <char32_t> resulta em std::bad_cast

M.
XProtoman

(usa Fedora)

Enviado em 25/05/2017 - 15:54h

Boa tarde a todos,

Estou trabalhando numa classe genérica que pode utilizar std::string, std::wstring e std::u32string, tudo ia bem até realizar leitura e gravação de arquivos com std::u32string.

Inicialmente tive problemas em escrever, detectei que o problema estava em utilizar std::endl, então substituí todos por "\n".

Depois veio o problema maior e que não consegui resolver: não consigo ler linhas com std::getline, segue abaixo o exemplo.

#include <iostream>
#include <fstream>

int main()
{
try
{
setlocale(LC_ALL, "pt_BR.UTF-8");
// Saida
std::basic_ofstream <char32_t> ao;
ao.open("/tmp/arquivo_saida.txt");
ao << U"Teste 1\n";
ao << U"Teste 2\n";
ao.close();
// Entrada
std::basic_ifstream <char32_t> ai;
ai.open("/tmp/arquivo_saida.txt");
std::u32string s;
std::getline(ai, s);
ai.close();
}
catch ( std::exception &erro )
{
std::cout << erro.what() << std::endl;
}
return 0;
}


Resultado execução:
$ ./codigo.run 
std::bad_cast



  


2. Re: Tentativa de pegar uma linha de std::basic_ifstream <char32_t> resulta em std::bad_cast

Paulo
paulo1205

(usa Ubuntu)

Enviado em 25/05/2017 - 22:37h

Tem certeza de que você quer mesmo trabalhar com um arquivo com char32_t? Você pode acabar ficando com um formato que nenhum outro programa vai entender.

Você chegou a ler aquele manifesto, cujo link eu mandei no outro tópico?

Quanto ao código que você postou, não dá para saber em que ponto ocorreu a exceção. Tente diminuir um pouco o perímetro.


3. Re: Tentativa de pegar uma linha de std::basic_ifstream <char32_t> resulta em std::bad_cast

M.
XProtoman

(usa Fedora)

Enviado em 25/05/2017 - 23:53h

Boa noite Paulo,

Vi parte do que você me mandou, dar um olhada de novo.

Desculpe pelo código, antes de enviar havia testado e sabia qual a parta ele falharia, que era o getline, vou deixar mais evidente:
#include <iostream>
#include <fstream>

int main()
{
try
{
setlocale(LC_ALL, "pt_BR.UTF-8");
// Saida
std::basic_ofstream <char32_t> ao;
ao.open("/tmp/arquivo_saida.txt");
ao << U"Teste 1\n";
ao << U"Teste 2\n";
ao.close();
// Entrada
std::basic_ifstream <char32_t> ai;
ai.open("/tmp/arquivo_saida.txt");
std::u32string s;
try
{
std::getline(ai, s);
}
catch ( std::exception &erro )
{
std::cout << "Erro esperado: " << erro.what() << std::endl;
}
ai.close();
}
catch ( std::exception &erro )
{
std::cout << "Erro inesperado: " << erro.what() << std::endl;
}
return 0;
}


Esse código falharia na escrita se usasse std::endl em vez U"\n".

Sobre o trabalhar com arquivo com char32_t, o programador tem duas opções de trabalho
...escrever(nome_do_arquivo_em_string)
...escrever(stream)
...ler(nome_do_arquivo_em_string)
...ler(stream)

Gostaria de poder usar basic_ifstream <char32_t>. Como disse o programar terá a opção de realizar escrita e leitura de arquivos apenas fornecendo o nome do arquivo, para usar o stream ele teria que trabalhar com o basic_ofstream <char32_t>.

____________________
“Mas nós sabemos que a razão de a maioria estar aqui, é a nossa afinidade com a desobediência!” (Morpheus)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts