Ver Mensaje Individual
  #4 (permalink)  
Antiguo 27/10/2015, 06:16
aguml
 
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