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
- int CAdestView::PegarVariables(void)
- {
- FILE *fichero; // Puntero a un fichero
- int tamano_b; // tamano temporal
- int x=0; // elementos copiados
- CString nombre_b; // nombre temporal
- double dato_b=0; // datos temporal para introducirlo en un vector
- double *datos_b; // vector de datos si la variable no es de texto
- CString *datostxt_b; // vector de Cstring si la variable es de texto
- CString datotxt_b; // datos temporal de una variable de texto
- CString ausente_b; // dato ausente temporal
- int escala_b=0; // escala temporal
- CString etiqueta_b; // etiqueta temporal
- CString labels_b; // labels temporal
- int precision_b=0; // precision temporal
- int tipo_b=0; // tipo temporal
- CString path;
- CString error; // Cadena para mostrar error
- INT_PTR tam_vars;
- int n = 1; // Entero para formar el nuevo nombre de la variable
- CString aux_nombre; // Cadena que almacena los nombres que formamos como posibles
- CString aux_nombre_lista; // Cadena que almacena los nombres leídos del control lista
- bool salir = false; // Nos indica si ya hemos encontrado un nuevo nombre válido
- bool encontrado = false; // Nos indica si hemso encontrado una variable con el mismo nombre
- // Se obtiene un puntero de la clase view
- CAdestDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- // Se abre el fichero temporal para lectura
- path= GetUserHomeDir() + _T("\\temporal.dat");
- fichero= fopen(CT2CA(path),"r+b");
- /*CString fullPath = VirtualStoreFilePath(_T("temporal.dat"));
- fichero= fopen(CT2CA(fullPath),"r+b");
- */
- if (fichero == 0)
- return 0;
- // Situamos el puntero del fichero
- fseek(fichero,sizeof(int),SEEK_CUR);
- tam_vars = pDoc->Variables.GetSize ();
- // Vemos si existe algun dato a pegar, el primero es el numero
- // de datos a pegar
- // Si no hay datos devolmemos 0 y salimos
- if(fread(&x,sizeof(int),1,fichero)<0)
- return 0;
- // Bucle que recorre todos los elementos a pegar
- for(int h=0;h<x;h++)
- {
- // Leemos del fichero el tamaño del primer elemento pegado
- fread(&tamano_b,sizeof(int),1,fichero);
- // Leemos del fichero el nombre de la variable
- fread(&nombre_b,sizeof(CString),1,fichero);
- // Leemos del fichero el tipo de la variable
- fread(&tipo_b,sizeof(int),1,fichero);
- /*********************************************************************************/
- //FALLA AL EXTRAER EL TIPO DEL FICHERO
- /*******************************************************************************/
- // Dependiendo del tipo de variable rellenamos un vector u
- // otro
- if(tipo_b==0)
- {
- // Reservamos memoria para el vector de la variable
- datos_b=new double[tamano_b];
- datostxt_b = NULL;
- for(int p=0;p<tamano_b;p++)
- {
- // Leemos del fichero los datos de la variable
- fread(&dato_b,sizeof(double),1,fichero);
- datos_b[p]=dato_b;
- }
- }
- else
- {
- // Reservamos memoria para los vectores de las variables
- datostxt_b=new CString[tamano_b];
- datos_b = NULL;
- for(int p=0;p<tamano_b;p++)
- {
- // Leemos del fichero los datos de la variable
- fread(&datotxt_b,sizeof(CString)*20,1,fichero);
- datostxt_b[p]=datotxt_b;
- }
- }
- // Leemos del fichero el dato ausente de la variable
- fread(&ausente_b,sizeof(CString)*10,1,fichero);
- // Leemos del fichero la escala de la variable
- fread(&escala_b,sizeof(int),1,fichero);
- // Leemos del fichero la etiqueta de la variable
- fread(&etiqueta_b,sizeof(CString)*100,1,fichero);
- // Leemos del fichero la label de la variable
- fread(&labels_b,sizeof(CString)*80,1,fichero);
- // Leemos del fichero la precision de la variable
- fread(&precision_b,sizeof(int),1,fichero);
- // obtenemos el numero de variables del espacio de trabajo
- // Si no hay ninguna, no comprobamos si el nombre esta repetido
- if(tam_vars == 0)
- {
- // Llamamos al constructor de la clase Variables para introducir
- // los datos
- 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));
- // y los introducimos en la lista
- m_Lista.InsertItem(n+x,nombre_b);
- // Actualizamos el número de variables en el espacio
- //GetDocument()->Variables.GetSize () = n+x;
- }
- else
- {
- // Hay variables en el espacio de trabajo
- // Debo comprobar que no inserto con un nombre ya existente
- salir = false;
- // Primero vamos a ver si el nombre original de la variable no está ya presente
- for (int i = 0; i < (tam_vars +1); i++)
- {
- aux_nombre_lista = m_Lista.GetItemText (i, 0);
- if (nombre_b == aux_nombre_lista)
- {
- encontrado = true;
- break;
- }
- }
- if (!encontrado)
- {
- salir = true;
- aux_nombre = nombre_b;
- }
- // El nombre original ya existe, le creo uno nuevo
- // Escribo un nombre del tipo Var1, Var2, ...
- while (!salir)
- {
- aux_nombre.Format (TEXT("%s%d"),nombre_b, n);
- // Compruebo si ya existe en el espacio de trabajo
- for (int i = 0; i < (tam_vars+1); i++)
- {
- aux_nombre_lista = m_Lista.GetItemText (i, 0);
- if (aux_nombre_lista == aux_nombre)
- {
- encontrado = true;
- n++;
- break;
- }
- }
- if (!encontrado)
- salir = true;
- else
- encontrado = false;
- }
- // Llamamos al constructor de la clase Variables para introducir
- // los datos
- 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));
- // Actualizamos el número de variables en el espacio
- //GetDocument()->Variables.GetSize () = n+x;
- }
- }
- // Se cierra el fichero temporal
- fclose(fichero);
- bool borrado=FALSE;
- // Devuelvo 1 indicando que la función terminó correctamente
- return 1;
- }
Esta es la linea que falla:
fread(&tipo_b,sizeof(int),1,fichero);


