Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Leer archivo con caracteres especiales

Estas en el tema de Leer archivo con caracteres especiales en el foro de C/C++ en Foros del Web. Muy buenas amigos. Recurro a ustedes por que me he cabeceado bastante con un problema y como mi fuerte no es C no he logrado ...
  #1 (permalink)  
Antiguo 06/08/2018, 09:06
 
Fecha de Ingreso: enero-2012
Mensajes: 21
Antigüedad: 12 años, 10 meses
Puntos: 0
Leer archivo con caracteres especiales

Muy buenas amigos.

Recurro a ustedes por que me he cabeceado bastante con un problema y como mi fuerte no es C no he logrado solucionarlo.

Les comento:

Estoy haciendo un programa con varias funciones, una de ellas requiere leer un archivo de texto y guardar cada linea en un arreglo. esto lo hago con el siguiente código y funciona sin problemas:

Código C:
Ver original
  1. char message_data[256];
  2. char* languageMessages[256];
  3. fp_messages = fopen(messageDir, "r")
  4. int count = 0;
  5. while ((fgets(&message_data[0], 255, fp_messages) != NULL)){
  6.     memcpy(languageMessages[count], &message_data[0], strlen(&message_data[0]) + 1);
  7.     count++;
  8. }

Hasta aquí todo bien, el problema se presenta cuando el archivo contiene caracteres especiales (mayormente tildes) las cuales son representadas con símbolos extraños.

He probado algunas recomendaciones que hay por Internet, como por ejemplo utilizar "setlocale" de la siguiente forma:

Código C:
Ver original
  1. setlocale(LC_ALL, "en_US.UTF-8");

Y tambien utilizar variables "wchar_t" en lugar de "char" pero aun no logro resolverlo.

Desde ya agradezco cualquier ayuda. muchas gracias.
  #2 (permalink)  
Antiguo 08/08/2018, 01:00
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 5 meses
Puntos: 73
Respuesta: Leer archivo con caracteres especiales

En principio, has declarado una variable

char* languageMessages[256];

Con esto, lo que has declarado es un array de 256 punteros a char. Pero los valores de estos punteros son, en principio, aleatorios (depende de lo que hubiera en memoria).

Posteriormente, estás copìando la línea que lees de tu fichero en el lugar al que apunta el elemento de languageMessages correspondiente, por lo que, al tener ese elemento un valor aleatorio, estás copiando tu línea del fichero en quién sabe donde.

Teniendo esto en cuenta, lo raro es que, al ejecutar el programa (suponiendo que se haya compilado sin errores) es que no te haya dado un error 'General Protection' ó 'Segmentation Fault'.

Tendrías que reservar memoria para cada uno de esos punteros del array que has declarado. Ya que comentas que el C no es tu fuerte, quizás sea mejor dejar de lado la asignación dinámica de memoria por el momento, y sustituir la declaración de languageMessages por (por ejemplo):

char languageMessages[256][256];

Con esto, estás creando un array de 256 cadenas de 256 caracteres (De todos modos, en C la variable de tipo cadena de caracteres como tal no existe, sino que son arrays de caracteres).

Otra cosa que veo es que estás utilizando &message_data[0]. En C, el nombre de un array representa la dirección del primer elemento, por lo que, donde escribes &message_data[0], puedes escribir simplemente message_data.

También veo que estás utilizando memcpy para copiar la línea que lees en tu array. Tratándose de cadenas de caracteres, y dado que lees de un fichero de texto, lo que leas serán cadenas de caracteres, es mejor (y más descriptivo de cara al mantenimiento del programa) utilizar la función strcpy():

strcpy(languageMessages[count], message_data);

que copiará message_data en languageMessages[count], incluyendo el carácter NULL (cero) que indica el final de cadena en C.

Prueba en primer lugar con esto, antes de meterte en más berenjenales con 'setlocale' y tipos 'wchar_t'

Saludos,

Etiquetas: caracteres, especiales
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:23.