elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error con "fstream" ingresando strings de palabras con tildes
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error con "fstream" ingresando strings de palabras con tildes  (Leído 2,600 veces)
FrnkdOU

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Error con "fstream" ingresando strings de palabras con tildes
« en: 30 Mayo 2020, 20:52 pm »

Buenas! Tengo una duda que si me pueden ayudar estaría totalmente agradecido.

Este es el asunto, al ingresar un archivo con "fstream", ejemplo: en el archivo "palabras.txt" se encuentra la palabra "argón" la cual con el "fstream" es almacenada en una variable. Pero al mostrarla en pantalla algo así: "Argón".

Esto sucede a pesar de tener la librería "locale.h" y poner setlocale(LC_ALL, "Spanish"); en el main.



En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.397


Turn off the red ligth


Ver Perfil WWW
Re: Error con "fstream" ingresando strings de palabras con tildes
« Respuesta #1 en: 30 Mayo 2020, 22:02 pm »

Código
  1. unsigned uint8_t utf8BOM[] = {0xEF,0xBB,0xBF};
  2. fileStream.write(utf8BOM,sizeof(utf8BOM));

Añádele la codificación al archivo.


En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.067



Ver Perfil
Re: Error con "fstream" ingresando strings de palabras con tildes
« Respuesta #2 en: 31 Mayo 2020, 00:22 am »

Saludos,

- Tienes que buscar la compatibilidad de codificación entre el fichero de código fuente y la terminal de destino.

- Por ejemplo la codificación de caracteres de CMD es OEM (CP-850) para sistemas Windows Español. Esto significa que si guardas tu .cpp y/o ficheros con contenido bajo esa codificación no deberías de tener ningún problema ni tendrías que importar ninguna biblioteca externa (<locale.h>).

- En este ejemplo voy a utilizar Notepad3 el cual me permite elegir entre muchas codificaciones, dentro de las cuales está OEM CP-850 que es la que utiliza CMD por defecto en Español:

Citar
C:\Users\EdSon\Desktop>type lecto_escritura.cpp
#include <iostream>
#include <fstream>

using namespace std;

int main() {

  ofstream salida;
  ifstream entrada;

  salida.open("file.txt");
  salida << "ñandú";
  salida.close();

  string txt;
  entrada.open("file.txt");
  entrada >> txt;
  entrada.close();

  cout << txt;

  return 0;
}
C:\Users\EdSon\Desktop>g++ lecto_escritura.cpp -o lecto_escritura.exe && lecto_escritura.exe
ñandú
C:\Users\EdSon\Desktop>type file.txt
ñandú

-- Nótese que la consola me muestra correctamente la ñ y ú cuando leo los archivos con type, esto porque están guardados bajo la codificación OEM CP-850 y CMD no tiene problema en leerlos e interpretarlos.

- PERO esa codificación no es estándar, es más SublimeText no la trae, y Notepad++ no la detecta automáticamente XD. Entonces se puede hacer uso de <locale.h> para adaptarse a la codificación destino utilizando una codificación más estándar. Pero en caso de CMD no se puede usar UTF-8 que es el estándar actual, CMD no la soporta completa, CMD a lo sumo solo soporta ANSI.

-- La mejor alternativa parece ser ANSI (CP-1252), este es bastante estándar. Entonces sigo con el ejemplo, en este caso guardo mi archivo .cpp bajo la codificación ANSI o CP-1252 o Windows 1252 o como lo tenga definido el editor de texto:

Citar
C:\Users\EdSon\Desktop>type lecto_escritura.cpp
#include <iostream>
#include <fstream>
#include <locale>

using namespace std;

int main() {

  setlocale(LC_ALL, "Spanish");

  ofstream salida;
  ifstream entrada;

  salida.open("file.txt");
  salida << "±and·";
  salida.close();

  string txt;
  entrada.open("file.txt");
  entrada >> txt;
  entrada.close();

  cout << txt;

  return 0;
}
C:\Users\EdSon\Desktop>g++ lecto_escritura.cpp -o lecto_escritura.exe && lecto_escritura.exe
ñandú
C:\Users\EdSon\Desktop>type file.txt
±and·

-- Nótese que type me muestra caracteres extraños para ñandú pero al compilar y ejecutar el programa no hay problemas para mostrar correctamente ñandú
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines