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

¿Buffer de entrada en modo binario?

Estas en el tema de ¿Buffer de entrada en modo binario? en el foro de C/C++ en Foros del Web. Pues estoy liado con caracteres que si los leo o escribo en un archivo tanto en C como en C++ al hacerlo en modo binario ...
  #1 (permalink)  
Antiguo 26/10/2015, 16:08
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
¿Buffer de entrada en modo binario?

Pues estoy liado con caracteres que si los leo o escribo en un archivo tanto en C como en C++ al hacerlo en modo binario no tengo problemas pero al hacerlo en modo texto plano no va bien y guarda y lee cosas raras. El caso es que con los archivos se solucionó abriéndoles en binario pero ahora quiero hacer lo mismo con el buffer de entrada y me gustaría poder hacerlo tanto en C como en C++.
He estado buscando información y he visto que con stringstream y read podría leer en binario del buffer en C++ pero claro, estoy obligado a capturar un número de bytes que se le indica a read y mi intención es hacer como con cin o scanf que al pulsar intro termina la captura. ¿alguien sabría como lograr lo que deseo?
  #2 (permalink)  
Antiguo 27/10/2015, 03:39
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: ¿Buffer de entrada en modo binario?

prueba con wstring, wcout y wcin en vez de con string, cout y cin.

El problema es el comentado en otras ocasiones... la tabla ASCII incorpora únicamente el juego de caracteres inglés. Para gestionar alfabetos diferentes sueles necesitar más de un byte por caracter... para eso existe wstring. Un pequeño inconveniente tanto de string como de wstring es que no hay conversiones directas a unicode, pero eso puede no ser un problema para tí.

Un saludo.
  #3 (permalink)  
Antiguo 27/10/2015, 06:15
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: ¿Buffer de entrada en modo binario?

No veo la manera de hacerlo. He estado intentando usar unsigned char*, wstring, freopen para abrir el buffer de entrada en modo binario y luego leer con read en binario,... y nada.
El codigo lo tengo ahora mismo asi:
Parte 1:
Código C++:
Ver original
  1. //---------------------------------------------------------------------------
  2.  
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <fstream>
  6.  
  7. string CesarEncriptText(string entrada, int desplazamiento);
  8. string CesarDecriptText(string entrada, int desplazamiento);
  9. int CesarEncriptFile(char *nameFileIn, int desplazamiento, char *nameFileOut);
  10. int CesarDecriptFile(char *nameFileIn, int desplazamiento, char *nameFileOut);
  11. void OpcionEncriptFile();
  12. void OpcionDecriptFile();
  13.  
  14. string Letras="ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz1234567890ÁÉÍÓÚáéíóúÜü \".,:;-+*/=\\_<>¡!¿?|@#$%&()[]{}\'^ºª";
  15. //---------------------------------------------------------------------------
  16.  
  17. int main(int argc, char* argv[])
  18. {
  19.    char aux[1024];
  20.    string desencriptado;
  21.    string encriptado;
  22.    int op,salir=0,volver=0,rotacion;
  23.  
  24.    do{
  25.       cout << "Cifrado/Descifrado Cesar" << endl;
  26.       cout << "------------------------" << endl;
  27.       cout << "1.Texto" << endl;
  28.       cout << "2.Archivo" << endl;
  29.       cout << "3.Salir" << endl;
  30.       cout << "Elige una opcion: ";
  31.       cin >> op;
  32.       cin.clear();
  33.  
  34.       // Ignore to the end of file
  35.       //cin.ignore(std::numeric_limits<std::streamsize>::max());
  36.  
  37.       // Ignore to the end of line
  38.       cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  39.  
  40.       switch(op){
  41.          case 1:
  42.             do{
  43.                system("CLS");
  44.                cout << "Cifrado/Descifrado de texto con cifrado Cesar" << endl;
  45.                cout << "---------------------------------------------" << endl;
  46.                cout << "1.Encriptar texto" << endl;
  47.                cout << "2.Desencriptar texto" << endl;
  48.                cout << "3.Volver" << endl;
  49.                cout << "Elige una opcion: ";
  50.                cin >> op;
  51.                cin.clear();
  52.  
  53.                // Ignore to the end of line
  54.                cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  55.  
  56.                switch(op){
  57.                   case 1:
  58.                      cout << "Introduce el texto a encriptar: ";
  59.                      cin.getline(aux,1023,'\n');
  60.                      desencriptado=aux;
  61.                      cout << "Introduce el desplazamiento: ";
  62.                      cin >> rotacion;
  63.  
  64.                      // Ignore to the end of line
  65.                      cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  66.  
  67.                      if((encriptado=CesarEncriptText(desencriptado,rotacion)) != ""){
  68.                         cout << "Encriptado finalizado satisfactoriamente" << endl;
  69.                         cout << "Encriptado queda: " << encriptado << endl;
  70.                      }else{
  71.                         cout << "Caracteres no validos en el texto a encriptar" << endl;
  72.                      }
  73.                      cin.get();
  74.                      break;
  75.                   case 2:
  76.                      cout << "Introduce el texto a desencriptar: ";
  77.                      cin.getline(aux,1023,'\n');
  78.                      encriptado=aux;
  79.                      cout << "Introduce el desplazamiento: ";
  80.                      cin >> rotacion;
  81.  
  82.                      // Ignore to the end of line
  83.                      cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  84.  
  85.                      if((desencriptado=CesarDecriptText(encriptado,rotacion)) != ""){
  86.                         cout << "Encriptado finalizado satisfactoriamente" << endl;
  87.                         cout << "Desencriptado queda: " << desencriptado << endl;
  88.                      }else{
  89.                         cout << "Caracteres no validos en el texto a desencriptar" << endl;
  90.                      }
  91.                      cin.get();
  92.                      break;
  93.                   case 3:
  94.                      volver=1;
  95.                      break;
  96.                   default:
  97.                      cout << "Opcion no valida. Pulsa intro y vuelve a intentarlo" << endl;
  98.                      cin.get();
  99.                }
  100.             }while(volver==0);
  101.             cin.get();
  102.             system("CLS");
  103.             break;
  104.  
  105.          case 2:
  106.             do{
  107.                system("CLS");
  108.                cout << "Cifrado/Descifrado de archivo con cifrado Cesar" << endl;
  109.                cout << "-----------------------------------------------" << endl;
  110.                cout << "1.Encriptar archivo" << endl;
  111.                cout << "2.Desencriptar archivo" << endl;
  112.                cout << "3.Volver" << endl;
  113.                cout << "Elige una opcion: ";
  114.                cin >> op;
  115.                cin.clear();
  116.  
  117.                // Ignore to the end of line
  118.                cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  119.  
  120.                switch(op){
  121.                   case 1:
  122.                      OpcionEncriptFile();
  123.                      cin.get();
  124.                      break;
  125.                   case 2:
  126.                      OpcionDecriptFile();
  127.                      cin.get();
  128.                      break;
  129.                   case 3:
  130.                      volver=1;
  131.                      break;
  132.                   default:
  133.                      cout << "Opcion no valida. Pulsa intro y vuelve a intentarlo" << endl;
  134.                      cin.get();
  135.                }
  136.             }while(volver==0);
  137.             system("CLS");
  138.             break;
  139.  
  140.          case 3:
  141.             salir=1;
  142.             break;
  143.  
  144.          default:
  145.             cout << "Opcion no valida" << endl;
  146.       }
  147.    }while(salir == 0);
  148.    return 0;
  149. }
  #4 (permalink)  
Antiguo 27/10/2015, 06:16
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: ¿Buffer de entrada en modo binario?

Parte 2:
Código C++:
Ver original
  1. void OpcionEncriptFile()
  2. {
  3.    char origen[1024];
  4.    char salida[1024];
  5.    int rotacion;
  6.  
  7.    cout << "Introduce el path del archivo que contiene el texto a encriptar: ";
  8.    cin.getline(origen,1023,'\n');
  9.    cout << "Introduce el path del archivo de salida: ";
  10.    cin.getline(salida,1023,'\n');
  11.    cout << "Introduce el desplazamiento: ";
  12.    cin >> rotacion;
  13.  
  14.    // Ignore to the end of line
  15.    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  16.  
  17.    switch(CesarEncriptFile(origen,rotacion,salida)){
  18.       case 0:
  19.          cout << "Cifrado satisfactorio" << endl;
  20.          break;
  21.       case -1:
  22.          cout << "Se encontraron caracteres no validos" << endl;
  23.          break;
  24.       case -2:
  25.          cout << "No se pudo abrir el archivo de origen" << endl;
  26.          break;
  27.       case -3:
  28.          cout << "No se pudo abrir el archivo de destino" << endl;
  29.          break;
  30.    }
  31. }
  32.  
  33. void OpcionDecriptFile()
  34. {
  35.    char origen[1024];
  36.    char salida[1024];
  37.    int rotacion;
  38.  
  39.    cout << "Introduce el path del archivo que contiene el texto a desencriptar: ";
  40.    cin.getline(origen,1023,'\n');
  41.    cout << "Introduce el path del archivo de salida: ";
  42.    cin.getline(salida,1023,'\n');
  43.    cout << "Introduce el desplazamiento: ";
  44.    cin >> rotacion;
  45.  
  46.    // Ignore to the end of line
  47.    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  48.  
  49.    switch(CesarDecriptFile(origen,rotacion,salida)){
  50.       case 0:
  51.          cout << "Descifrado satisfactorio" << endl;
  52.          break;
  53.       case -1:
  54.          cout << "Se encontraron caracteres no validos" << endl;
  55.          break;
  56.       case -2:
  57.          cout << "No se pudo abrir el archivo de origen" << endl;
  58.          break;
  59.       case -3:
  60.          cout << "No se pudo abrir el archivo de destino" << endl;
  61.          break;
  62.    }
  63. }
  64.  
  65. int CesarEncriptFile(char *nameFileIn, int desplazamiento, char *nameFileOut)
  66. {
  67.    string final;
  68.    ifstream origen;
  69.    ofstream salida;
  70.    char *cadena;
  71.    int i,posInicial,posFinal;
  72.    int retval=0;
  73.  
  74.    origen.open(nameFileIn,ios::binary);
  75.  
  76.    if(origen.good()){
  77.       origen.seekg(0,ios::end);
  78.       int length = origen.tellg();
  79.       origen.seekg(0,ios::beg);
  80.       cadena = new char[length+1];
  81.  
  82.       salida.open(nameFileOut,ios::binary | ios::trunc);
  83.  
  84.       if(salida.good()){
  85.          origen.read(cadena,length);
  86.          cadena[length]='\0';
  87.  
  88.          for(i=0;i<length;i++){
  89.             posInicial = Letras.find(cadena[i]);
  90.             if(posInicial < 0){
  91.                retval=-1;
  92.                break;
  93.             }
  94.             posFinal = (Letras.length() + posInicial + desplazamiento) % Letras.length();
  95.             final.append(Letras, posFinal, 1);
  96.          }
  97.          salida.write(final.c_str(),length);
  98.          salida.close();
  99.       }else{
  100.          retval=-3;
  101.       }
  102.       delete(cadena);
  103.       origen.close();
  104.    }else{
  105.       retval=-2;
  106.    }
  107.    return retval;
  108. }
  109. //---------------------------------------------------------------------------
  110.  
  111. int CesarDecriptFile(char *nameFileIn, int desplazamiento, char *nameFileOut)
  112. {
  113.    string final;
  114.    ifstream origen;
  115.    ofstream salida;
  116.    char *cadena;
  117.    int i,posInicial,posFinal;
  118.    int retval=0;
  119.  
  120.    origen.open(nameFileIn,ios::binary);
  121.  
  122.    if(origen.good()){
  123.       origen.seekg(0,ios::end);
  124.       int length = origen.tellg();
  125.       origen.seekg(0,ios::beg);
  126.       cadena = new char[length+1];
  127.  
  128.       salida.open(nameFileOut,ios::binary | ios::trunc);
  129.  
  130.       if(salida.good()){
  131.          origen.read(cadena,length);
  132.          cadena[length]='\0';
  133.  
  134.          for(i=0;i<length;i++){
  135.             posInicial = Letras.find(cadena[i]);
  136.             if(posInicial < 0){
  137.                retval=-1;
  138.                break;
  139.             }
  140.             posFinal = (Letras.length() + posInicial - desplazamiento) % Letras.length();
  141.             final.append(Letras, posFinal, 1);
  142.          }
  143.          salida.write(final.c_str(),length);
  144.          salida.close();
  145.       }else{
  146.          retval=-3;
  147.       }
  148.       delete(cadena);
  149.       origen.close();
  150.    }else{
  151.       retval=-2;
  152.    }
  153.    return retval;
  154. }
  155. //---------------------------------------------------------------------------
  156.  
  157. string CesarEncriptText(string texto, int desplazamiento)
  158. {
  159.    int i,posInicial,posFinal;
  160.    string final;
  161.  
  162.    for(i=0;i<texto.length();i++){
  163.       posInicial = Letras.find(texto.at(i));
  164.       if(posInicial < 0){
  165.          final="";
  166.          break;
  167.       }
  168.       posFinal = (Letras.length() + posInicial + desplazamiento) % Letras.length();
  169.       final.append(Letras, posFinal, 1);
  170.    }
  171.    return final;
  172. }
  173. //---------------------------------------------------------------------------
  174.  
  175. string CesarDecriptText(string texto, int desplazamiento)
  176. {
  177.    int i,posInicial,posFinal;
  178.    string final;
  179.  
  180.    for(i=0;i<texto.length();i++){
  181.       posInicial = Letras.find(texto.at(i));
  182.       if(posInicial < 0){
  183.          final="";
  184.          break;
  185.       }
  186.       posFinal = (Letras.length() + posInicial - desplazamiento) % Letras.length();
  187.       final.append(Letras, posFinal, 1);
  188.    }
  189.    return final;
  190. }
  191. //---------------------------------------------------------------------------

La parte que cifra y descifra archivos va perfecta pero el problema lo tengo con el buffer de entrada que en el momento que meto un caracter que no es de los estandar se carga la jugada jejeje.

Tambien hice esta prueba y no funcionó porque simplemente no guarda nada ni en waux:
Código C++:
Ver original
  1. cout << "wstring: ";
  2.    wstring wstr;
  3.    wchar_t waux[1024];
  4.    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
  5.    wcin.getline(waux,1024,'\n');
  6.    wstr = waux;

Última edición por aguml; 27/10/2015 a las 06:28
  #5 (permalink)  
Antiguo 27/10/2015, 07:54
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: ¿Buffer de entrada en modo binario?

Utilizar caracteres fuera del estándar ASCII suele ser problemático tanto en C como en C++.

En estos casos lo más recomendado es utilizar alguna librería especializada en la gestión de caracteres no ASCII.

Qt por ejemplo tiene un soporte buenísimo para cualquier alfabeto, puede ser una solución a tu problema.
  #6 (permalink)  
Antiguo 27/10/2015, 09:32
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: ¿Buffer de entrada en modo binario?

Me parece increíble que ni el estándar de C ni el de C++ estén preparados para algo tan básico como capturar del teclado en binario. Los caracteres estándar llegan hasta 125 y el resto no simplemente porque un char no da más pero un uchar si que puede ya que no hay negativos así que no entiendo porque el código que puse no captura por ejemplo la Ñ que si que esta entre los 255 caracteres.
  #7 (permalink)  
Antiguo 27/10/2015, 14:39
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: ¿Buffer de entrada en modo binario?

Cita:
Iniciado por aguml Ver Mensaje
Me parece increíble que ni el estándar de C ni el de C++ estén preparados para algo tan básico como capturar del teclado en binario. Los caracteres estándar llegan hasta 125 y el resto no simplemente porque un char no da más pero un uchar si que puede ya que no hay negativos así que no entiendo porque el código que puse no captura por ejemplo la Ñ que si que esta entre los 255 caracteres.
El estándar de C++ deja mucho que desear en cosas tan básicas como la gestión de la consola o las cadenas de caracteres... los últimos dos estándares C++11 y C++14 han corregido algunas lagunas muy serias del lenguaje, como el soporte multihilo de forma estándar, pero aún le queda mucho camino por recorrer.

Uno de los mayores problemas es conseguir que los nuevos estándares no afecten a la compilación de código realizado con versiones anteriores... no se, seguramente esto se acabe corrigiendo, pero desde luego no va a ser mañana :)
  #8 (permalink)  
Antiguo 27/10/2015, 16:59
 
Fecha de Ingreso: octubre-2015
Mensajes: 1
Antigüedad: 8 años, 6 meses
Puntos: 0
Busqueda Respuesta: ¿Buffer de entrada en modo binario?

Cita:
Iniciado por aguml Ver Mensaje
Me parece increíble que ni el estándar de C ni el de C++ estén preparados para algo tan básico como capturar del teclado en binario. Los caracteres estándar llegan hasta 125 y el resto no simplemente porque un char no da más pero un uchar si que puede ya que no hay negativos así que no entiendo porque el código que puse no captura por ejemplo la Ñ que si que esta entre los 255 caracteres.
Que quieres decir por capturar del teclado en binario?

Que entiendes por caracteres estandar?

En realidad si puedes almacenar un caracter con codigo ascii superior a 127 en una variable de tipo char. Por ejemplo la ñ que vale 150. La distincion entre con signo o sin signo solo te afecta para cuestiones aritmeticas. A ti te da igual, al fin y al cabo las dos son un espacio de memoria de 1 byte.

Ese no es el problema, y de hecho para imprimir por pantalla una ñ no te hace falta ni siquiera un wide-character, y mucho menos tirar de unicode. Mira a ver si esto te funciona e imprime una "ñ" despues de "abc". Luego prueba a comentar la linea del "setlocale" y mira a ver si ya no eres capaz de imprimirla. Si es asi, prueba a meter la linea del "setlocale" en tu programa, al principio, y mira a ver si funciona.

Código:
#include <iostream>
#include <clocale>

int main()
{
char a[] = "abcñ";
std::setlocale(LC_ALL, "");
std::cout << a << std::endl;

return 0;
}
  #9 (permalink)  
Antiguo 28/10/2015, 02:23
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: ¿Buffer de entrada en modo binario?

Cita:
Iniciado por jorgegl Ver Mensaje
Ese no es el problema, y de hecho para imprimir por pantalla una ñ no te hace falta ni siquiera un wide-character, y mucho menos tirar de unicode. Mira a ver si esto te funciona e imprime una "ñ" despues de "abc". Luego prueba a comentar la linea del "setlocale" y mira a ver si ya no eres capaz de imprimirla. Si es asi, prueba a meter la linea del "setlocale" en tu programa, al principio, y mira a ver si funciona.
El problema que tiene C++ es que no ha adoptado un mecanismo uniforme para gestionar strings en lenguajes diferentes al inglés. Quizás para entrada/salida funcione tu solución, pero si luego intentas manipular los caracteres para, por ejemplo, realizar transformaciones, la 'ñ', que puede perfectamente acabar ocupando 2 bytes en su codificación, te encuentras con que tienes que lidiar manualmente con estas circunstancias cuando no debería ser así.

Desde mi punto de vista cada item individual de un string debería corresponder a un carácter, independientemente de que dicho carácter ocupe 1 byte o 4 bytes, y en este punto el estándar de C++ falla irremediablemente.
  #10 (permalink)  
Antiguo 29/10/2015, 06:29
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: ¿Buffer de entrada en modo binario?

Funciona a medias. Si imprime caracteres como la ñ pero el problema principal es que al comparar los caracteres introducidos con los de una string, aun introduciendo lo mismo no funciona. Si se mira el valor que hay en lo que introducimos y miramos el valor almacenado en la cadena en la que buscamos ese valor veremos que no es el mismo. Hice este pequeño codigo para que veas la diferencia y a ver si pueden ayudarme:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <clocale>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.    char a[] = "ñ";
  10.    char b[2]={0};
  11.    bool encontrada=false;
  12.  
  13.    setlocale(LC_ALL, "");
  14.    cout << "Introduce el caracter a buscar en 'a': ";
  15.    cin.getline(b,2,'\n');
  16.    for(int i=0;i<strlen(a);i++){
  17.       if(a[i]==b[0]){
  18.          cout << "encontrada en la cadena " << a << " en la posicion: " << i << endl;
  19.          encontrada=true;
  20.       }
  21.    }
  22.    if(!encontrada)
  23.       cout << "no encontrada en la cadena " << a << endl;
  24.  
  25.    cout << "Valor de a: " << (char)a[0] << endl;
  26.    cout << "Valor de b: " << (char)b[0] << endl;
  27.    return 0;
  28. }
  #11 (permalink)  
Antiguo 29/10/2015, 07:31
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: ¿Buffer de entrada en modo binario?

Cita:
Iniciado por aguml Ver Mensaje
el problema principal es que al comparar los caracteres introducidos con los de una string, aun introduciendo lo mismo no funciona.
Cita:
Iniciado por eferion Ver Mensaje
... pero si luego intentas manipular los caracteres para, por ejemplo, realizar transformaciones, la 'ñ', que puede perfectamente acabar ocupando 2 bytes en su codificación, te encuentras con que tienes que lidiar manualmente con estas circunstancias cuando no debería ser así.
Yo te recomendaría usar alguna librería que trabaje con unicode o usar Qt.
  #12 (permalink)  
Antiguo 29/10/2015, 23:56
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Buffer de entrada en modo binario?

Hola; creo que hay una confusión aquí. El C++ no tiene nada que ver con ninguna consola; esas son cosas de tu sistema operativo.
Asumo que usas Windows.

En tu código, voy a cambiar un par de líneas que usas para mostrar las dos cadenas a y b, por estas otras:

Código:
cout << "Valor de a: " << (int)(unsigned char)a[0] << endl;
cout << "Valor de b: " << (int)(unsigned char)b[0] << endl;
Así tendría que mostrar el valor decimal de la primera "ñ" que has escrito para a, y de las segunda "ñ", que has ingresado por teclado.

Se debería mostrar:
Código:
Valor de a: 241
Valor de b: 164
Donde el primero de esos valores fue generado por el editor de texto que usaste para escribir el código y luego compilarlo y el segundo fue generado por tu consola. Pero la consola de Windows usa el viejo juego de caracteres IBM, anterior al ASCII de 127 caracteres (y anterior, naturalmente, al ASCII extendido de 256, y ni hablar de Unicode). Y en ese juego de caracteres, la "ñ" tiene el valor decimal 164. Entonces, la primera "ñ" (decimal 241) es correcta, es la que escribió tu editor de texto como sabe hacerlo, y la segunda "ñ" (decimal 164) también es correcta, es la que escribió la consola con el juego de caracteres que usa hace 30 años (puedes ver https://en.wikipedia.org/wiki/Code_page_437)

Si pones esta línea (https://msdn.microsoft.com/en-us/lib...=vs.85).aspx):
Código:
SetConsoleCP(GetACP());
antes de usar la consola (necesita #include "Windows.h"), pondrás el input code page de la consola en armonía con el ANSI code page que esté activo en tu Windows.

Bueno, como ves, nada de todo esto tiene que ver con el C++, para el que ni siquiera existen los conceptos de "consola" ni de "teclado", figúrate. Y por favor, deja eso de "capturar del teclado en binario", que sólo tú sabrás qué has querido decir, y esas quejas sobre el lenguaje, al menos espera a enterarte un poco de qué va... :)
  #13 (permalink)  
Antiguo 30/10/2015, 03:08
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: ¿Buffer de entrada en modo binario?

Ok amigo, es lo que pasa cuando uno habla desde el desconocimiento, que puede soltar burradas para los oidos de los que realmente saben jejeje.
Ahora si que me funciona esa parte pero ahora tengo otro problema. Con mi codigo, si le digo que quiero descifrar la letra 'ñ' con un desplazamiento de 5 me tendria que mostrar la 'ñ' pero sin embargo me muestra el simbolo matematico '±' incluso teniendo la linea setlocale(LC_ALL, ""); que se supone que es para que me muestre los caracteres especiales ¿no? Con lo que he leido de tu contestacion entiendo que con SetConsoleCP(GetACP()); cambio la pagina de codificacion de la consola pero eso hace que el caracter 'ñ' valga 241 mientras que si miro la tabla ascii extendido veo que vale 145 y que el 241 es realmente el que me está mostrando. ¿tengo que cambiar tambien algo de la salida de consola para que me muestre los caracteres correctamente? ¿puedes ayudarme con esto ultimo?
Edito:
Lo he solucionado esto último después de buscar mucho ya que al usar SerConsoleOutputCP (GetACP ()); me pasaba que al dar a alguna tecla especial como por ejemplo la Ñ no me imprimía esta en consola y encontré este enlace: http://es.comp.lenguajes.c.narkive.c...mostrando-enes
Y con esa ayuda me cree esta funcion:
Código C++:
Ver original
  1. string StringToOem (string cadena)
  2. {
  3.    char *aux=new (nothrow) char [cadena.length ()];
  4.    if (aux != NULL){
  5.       CharToOem (cadena.c_str (),aux);
  6.       cadena=aux;
  7.       delete aux;
  8.    }else {
  9.       cadena="";
  10.    }
  11.    return cadena;
  12. }
Luego de obtener la cadena cifrada hago:
Código C++:
Ver original
  1. encriptada=StringToOem (encriptada);
Y ya la muestro y se ve perfecta.
He probado también a cambiar la fuente de la consola y también funcionaba pero quería saber que opción es más limpia y por cual optarIan.

Última edición por aguml; 30/10/2015 a las 07:06

Etiquetas: entrada, int, modo, string
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 12:52.