Pegar del portapapeles

Moderador: ivancp

Preguntas y respuestas sobre programacion en Windows con Visual C++

Pegar del portapapeles

Notapor i52camam » Lun Sep 05, 2011 1:06 pm

Hola,

Como ya dije, tenia esta funcion que pega lo que antes copiamos al portapapeles. La funcion parece que funciona correctamente, excepto al leer un dato del fichero, que no lo lee correctamente, y hace que la funcion deje de funcionar. Al ser un archivo binario, no puedo comprobar si el archivo a sido creado con los datos correctamente, pero tiene dos o tres fread delante de el que da el problema que leen los datos satisfactoriamente


Código: Seleccionar todo
  1.  

  2. int CAdestView::PegarVariables(void)

  3. {

  4.         FILE *fichero;                  // Puntero a un fichero

  5.         int tamano_b;                   // tamano temporal

  6.         int x=0;                                // elementos copiados

  7.         CString nombre_b;               // nombre temporal

  8.         double dato_b=0;                // datos temporal para introducirlo en un vector

  9.         double *datos_b;                // vector de datos si la variable no es de texto

  10.         CString *datostxt_b;    // vector de Cstring si la variable es de texto

  11.         CString datotxt_b;              // datos temporal de una variable de texto

  12.         CString ausente_b;              // dato ausente temporal

  13.         int escala_b=0;                 // escala temporal

  14.         CString etiqueta_b;     // etiqueta temporal

  15.         CString labels_b;               // labels temporal

  16.         int precision_b=0;              // precision temporal

  17.         int tipo_b=0;                   // tipo temporal

  18.  

  19.         CString path;

  20.         CString error;                  // Cadena para mostrar error

  21.         INT_PTR tam_vars;

  22.         int n = 1;                              // Entero para formar el nuevo nombre de la variable

  23.         CString aux_nombre;             // Cadena que almacena los nombres que formamos como posibles

  24.         CString aux_nombre_lista;       // Cadena que almacena los nombres leídos del control lista

  25.         bool salir = false;             // Nos indica si ya hemos encontrado un nuevo nombre válido

  26.         bool encontrado = false;        // Nos indica si hemso encontrado una variable con el mismo nombre

  27.  

  28.         // Se obtiene un puntero de la clase view

  29.         CAdestDoc* pDoc = GetDocument();

  30.         ASSERT_VALID(pDoc);

  31.  

  32.         // Se abre el fichero temporal para lectura

  33.         path= GetUserHomeDir() + _T("\\temporal.dat");

  34.         fichero= fopen(CT2CA(path),"r+b");

  35.  

  36.         /*CString fullPath = VirtualStoreFilePath(_T("temporal.dat"));

  37.         fichero= fopen(CT2CA(fullPath),"r+b");

  38.         */

  39.        

  40.         if (fichero == 0)

  41.                 return 0;

  42.         // Situamos el puntero del fichero

  43.         fseek(fichero,sizeof(int),SEEK_CUR);

  44.         tam_vars = pDoc->Variables.GetSize ();

  45.         // Vemos si existe algun dato a pegar, el primero es el numero

  46.         // de datos a pegar

  47.         // Si no hay datos devolmemos 0 y salimos

  48.         if(fread(&x,sizeof(int),1,fichero)<0)

  49.                 return 0;

  50.  

  51.         // Bucle que recorre todos los elementos a pegar

  52.         for(int h=0;h<x;h++)

  53.         {

  54.                 // Leemos del fichero el tamaño del primer elemento pegado

  55.                 fread(&tamano_b,sizeof(int),1,fichero);

  56.                 // Leemos del fichero el nombre de la variable

  57.                 fread(&nombre_b,sizeof(CString),1,fichero);

  58.                 // Leemos del fichero el tipo de la variable

  59.                 fread(&tipo_b,sizeof(int),1,fichero);

  60.                 /*********************************************************************************/

  61.                 //FALLA AL EXTRAER EL TIPO DEL FICHERO

  62.                 /*******************************************************************************/

  63.                 // Dependiendo del tipo de variable rellenamos un vector u

  64.                 // otro

  65.                 if(tipo_b==0)

  66.                 {

  67.                         // Reservamos memoria para el vector de la variable

  68.                         datos_b=new double[tamano_b];

  69.                         datostxt_b = NULL;

  70.                         for(int p=0;p<tamano_b;p++)

  71.                         {

  72.                                 // Leemos del fichero los datos de la variable

  73.                                 fread(&dato_b,sizeof(double),1,fichero);

  74.                                 datos_b[p]=dato_b;

  75.                         }

  76.                 }

  77.                 else

  78.                 {

  79.                         // Reservamos memoria para los vectores de las variables

  80.                         datostxt_b=new CString[tamano_b];

  81.                         datos_b = NULL;

  82.                         for(int p=0;p<tamano_b;p++)

  83.                         {

  84.                                 // Leemos del fichero los datos de la variable

  85.                                 fread(&datotxt_b,sizeof(CString)*20,1,fichero);

  86.                                 datostxt_b[p]=datotxt_b;

  87.                         }

  88.                 }

  89.  

  90.                 // Leemos del fichero el dato ausente de la variable

  91.                 fread(&ausente_b,sizeof(CString)*10,1,fichero);

  92.                 // Leemos del fichero la escala de la variable

  93.                 fread(&escala_b,sizeof(int),1,fichero);

  94.                 // Leemos del fichero la etiqueta de la variable

  95.                 fread(&etiqueta_b,sizeof(CString)*100,1,fichero);

  96.                 // Leemos del fichero la label de la variable

  97.                 fread(&labels_b,sizeof(CString)*80,1,fichero);

  98.                 // Leemos del fichero la precision de la variable

  99.                 fread(&precision_b,sizeof(int),1,fichero);

  100.                 // obtenemos el numero de variables del espacio de trabajo

  101.                 // Si no hay ninguna, no comprobamos si el nombre esta repetido

  102.                 if(tam_vars == 0)

  103.                 {

  104.                         // Llamamos al constructor de la clase Variables para introducir

  105.                         // los datos

  106.                         GetDocument()->Variables.Add(new CDatos(tipo_b,tamano_b,escala_b,nombre_b, datos_b,datostxt_b,etiqueta_b,labels_b, ausente_b,precision_b));

  107.                         // y los introducimos en la lista

  108.                         m_Lista.InsertItem(n+x,nombre_b);

  109.                         // Actualizamos el número de variables en el espacio

  110.                         //GetDocument()->Variables.GetSize () = n+x;

  111.                 }

  112.                 else

  113.                 {

  114.                         // Hay variables en el espacio de trabajo

  115.                         // Debo comprobar que no inserto con un nombre ya existente

  116.                         salir = false;

  117.                         // Primero vamos a ver si el nombre original de la variable no está ya presente

  118.                         for (int i = 0; i < (tam_vars +1); i++)

  119.                         {

  120.                                 aux_nombre_lista = m_Lista.GetItemText (i, 0);

  121.                                 if (nombre_b == aux_nombre_lista)

  122.                                 {

  123.                                         encontrado = true;

  124.                                         break;

  125.                                 }

  126.                         }

  127.                         if (!encontrado)

  128.                         {

  129.                                 salir = true;

  130.                                 aux_nombre = nombre_b;

  131.                         }

  132.  

  133.                         // El nombre original ya existe, le creo uno nuevo

  134.                         // Escribo un nombre del tipo Var1, Var2, ...

  135.                         while (!salir)

  136.                         {

  137.                                 aux_nombre.Format (TEXT("%s%d"),nombre_b, n);

  138.                                 // Compruebo si ya existe en el espacio de trabajo

  139.                                 for (int i = 0; i < (tam_vars+1); i++)

  140.                                 {

  141.                                         aux_nombre_lista = m_Lista.GetItemText (i, 0);

  142.                                         if (aux_nombre_lista == aux_nombre)

  143.                                         {

  144.                                                 encontrado = true;

  145.                                                 n++;

  146.                                                 break;

  147.                                         }

  148.                                 }

  149.                                 if (!encontrado)

  150.                                         salir = true;

  151.                                 else

  152.                                         encontrado = false;

  153.                         }

  154.  

  155.                         // Llamamos al constructor de la clase Variables para introducir

  156.                         // los datos

  157.                         pDoc->Variables.Add (new CDatos(tipo_b,tamano_b,escala_b,aux_nombre,datos_b,datostxt_b,etiqueta_b,labels_b,ausente_b,precision_b));

  158.  

  159.                         // Actualizamos el número de variables en el espacio

  160.                         //GetDocument()->Variables.GetSize () = n+x;

  161.                 }

  162.         }              

  163.  

  164.         // Se cierra el fichero temporal       

  165.         fclose(fichero);

  166.         bool borrado=FALSE;

  167.         // Devuelvo 1 indicando que la función terminó correctamente

  168.         return 1;

  169. }

  170.  

  171.  

  172.  



Esta es la linea que falla:

fread(&tipo_b,sizeof(int),1,fichero);
i52camam
Novato
Novato
 
Mensajes: 18
Registrado: Lun Mar 14, 2011 7:04 am


Re: Pegar del portapapeles

Notapor ivancp » Vie Sep 09, 2011 4:21 pm

No conozco la estructura de tu archivo binario, pero para saber si fread ha logrado leer algo debes capturar el valor devuelto.

Código: Seleccionar todo
  1. size_t leidos;

  2. if(!(leidos = fread(&tipo_b,sizeof(int),1,fichero)))

  3. {

  4.     AfxMessageBox("Error al leer tipo_b");

  5.     return 0; // o algun otro valor que indique error

  6. }

Imagen @latindev | Mi Blog
Por favor lee las reglas del foro
Avatar de Usuario
ivancp
Colaborador
Colaborador
 
Mensajes: 680
Registrado: Jue Sep 06, 2007 12:58 pm


Re: Pegar del portapapeles

Notapor i52camam » Lun Sep 26, 2011 4:03 am

Hola, he probado lo que me has dicho, pero parece que si entra al fichero y lee, aunque extrae un valor extraño que no es el que deberia extraer, lo mas extraño es que solo extrae el valor extraño en este fread y no en todos los anteiores que lo hace todo bien.
Solo puedo pensar que por cualquier situacion no escriba el valor adecuado en este campo la funcion copiar.
i52camam
Novato
Novato
 
Mensajes: 18
Registrado: Lun Mar 14, 2011 7:04 am

Re: Pegar del portapapeles

Notapor ivancp » Lun Sep 26, 2011 8:50 am

Me parece que no estas guardando correctamente el valor que vas a recuperar luego.
Imagen @latindev | Mi Blog
Por favor lee las reglas del foro
Avatar de Usuario
ivancp
Colaborador
Colaborador
 
Mensajes: 680
Registrado: Jue Sep 06, 2007 12:58 pm

Re: Pegar del portapapeles

Notapor i52camam » Lun Sep 26, 2011 9:21 am

Pero el codigo es correcto, es mas, hay otro dato de tipo int, que lo escribo en el fichero de la misma manera y no da ningun problema, solo este dato
i52camam
Novato
Novato
 
Mensajes: 18
Registrado: Lun Mar 14, 2011 7:04 am


    

Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot], Google Adsense [Bot] y 2 invitados