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

Modificar Archivo en C

Estas en el tema de Modificar Archivo en C en el foro de C/C++ en Foros del Web. Hola que tal! bueno les comento mi problema... estoy haciendo un abm en c para la facu y tengo un problemita en las modificaciones... el ...
  #1 (permalink)  
Antiguo 02/11/2011, 20:08
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 13 años, 5 meses
Puntos: 3
Modificar Archivo en C

Hola que tal! bueno les comento mi problema... estoy haciendo un abm en c para la facu y tengo un problemita en las modificaciones... el codigo es el siguiente:

Código:
/*Limpia pantalla*/
            system ("cls");

            /*Declaro un vector de tipo estructura*/
            struct listaPrecios vec[1];

            //Muestro el contenido del fichero
            mostrar(parchivo);

            printf("***********************************************\n");

            //Buscar
            printf("Ingrese el codigo del archivo que desea buscar\n");
            scanf("%i", &buscar);

            //Busca en el archvio y se posiciona al principio del mismo
            fseek(parchivo, (long)(buscar) * sizeof(vec), SEEK_SET);
            //Lee en el archivo
            fread(&vec,sizeof(vec),1,parchivo);
            //Muestra en pantalla
            puts(vec);
el problema que tengo es que se posiciona mal en la busqueda del archivo... y no se que tiene de mal el fseek

bueno muchisimas gracias de antemano
  #2 (permalink)  
Antiguo 03/11/2011, 00:58
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 5 meses
Puntos: 73
Respuesta: Modificar Archivo en C

Suponiendo que hayas abierto el archivo correctamente para modo binario ( fopen("NombreArchivo", "rb") ), el problema es que, tal como has declarado vec, éste es un array de un solo elemento. El nombre de un array, sin índice detrás, es un puntero al primer elemento del array. Por lo tanto, sizeof(vec) te da el tamaño de un puntero (que depende de la implementación, usualmente 4 bytes en un SO de 32 bits), y de ahí que se posicione mal. En lugar de sizeof(vec) utiliza sizeof(listaPrecios).
  #3 (permalink)  
Antiguo 03/11/2011, 07:40
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 13 años, 5 meses
Puntos: 3
Respuesta: Modificar Archivo en C

Bueno antes que nada muchas gracias por responder. Te comento lo que me pasa ahora
1)
Cita:
FILE *parchivo;
parchivo=fopen("archivo.txt", "a+t");
fclose(parchivo);
Asi es como abri el archivo y lo cerre.

2)sizeof(listaPrecios) hice asi como me dijiste y el compilador tira error de que no esta declarada. Luego la declaro y lo cambio asi
Cita:
struct listaPrecios listaPrecios;
//Busca en el archvio y se posiciona al principio del mismo
fseek(parchivo, (long)(buscar) * sizeof(listaPrecios), SEEK_SET);
//Lee en el archivo
fread(&listaPrecios,sizeof(listaPrecios),1,parchiv o);
//Muestra en pantalla
puts(listaPrecios);
Pero ahora tira error en el puts y por lo que vi es por que no acepta variables comunes tiene que ser un vector...

y desp lo que hice fue a la variable "listaPrecios", cambiarla a "lista" (lo hice por las dudas por si interpreta mal el compilar a la estructura con la variable) y pasa lo mismo con el puts

gracias
  #4 (permalink)  
Antiguo 03/11/2011, 08:18
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Modificar Archivo en C

el puts se utiliza unicamente para cadena de caracteres. Te recomendaria usar fwrite que es parecido al fread pero escribe de forma binaria en el archivo.

Saludos
  #5 (permalink)  
Antiguo 03/11/2011, 09:47
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 13 años, 5 meses
Puntos: 3
Respuesta: Modificar Archivo en C

disculpa que te moleste pero no comprendo... en lugar del puts que utilizo? y el fwrite no es para escribir en el archivo?, primero que el archivo no esta en forma binaria y desp el fread lee sobre el archivo , no entiendo en que se parece al fwrite

muchas gracias por responder
  #6 (permalink)  
Antiguo 03/11/2011, 10:10
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Modificar Archivo en C

Perdon por perderte, memerie un poco con otro post. Lo que tu quieres hacer es leer una posicion e imprimirla en pantalla??

Depende de la estructura internar del struct listaPrecios.....deberias crear uma funcion que la imprima. El compilador no se puede avivar como imprimirla...

Por ejemplo:

Código C++:
Ver original
  1. struct persona {
  2.     int edad;
  3.     char nombre[50];
  4. }
  5.  
  6. void imprimir_persona(struct persona p)
  7. {
  8.     printf("La persona se llama: %s. Y tiene : %d años\n",p.nombre,p.edad);
  9. }

Como veras imprimir una estructura depende de ella misma. Saludos
  #7 (permalink)  
Antiguo 03/11/2011, 10:27
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 13 años, 5 meses
Puntos: 3
Respuesta: Modificar Archivo en C

ahi lo modifique... pero no hice una funcion simplemente ingrese un printf desp del fread y borre el puts.
printf("El producto es: %i \n %s \s %f \n", vec[1].cod, vec[1].prod, vec[1].precio);

esa linea hice , pero el problema es que me devuelve cualquier cosa, son datos que estan la memoria...

que me recomendas que haga?

gracias nuevamente
  #8 (permalink)  
Antiguo 03/11/2011, 10:56
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 13 años, 5 meses
Puntos: 3
Respuesta: Modificar Archivo en C

ahi dice \s esta mal va \n pero igual no anda
  #9 (permalink)  
Antiguo 03/11/2011, 17:43
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Modificar Archivo en C

En un lado tenias la variable vec y en otro lado otra variable..

ademas a vec lo tenias definido como struct listaPrecio vec[1];

Eso quiere decir que tiene una sola posicion y es la cero....

Comproba esas cosas y mostra el codigo entero.
  #10 (permalink)  
Antiguo 03/11/2011, 19:28
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 13 años, 5 meses
Puntos: 3
Respuesta: Modificar Archivo en C

ese es mi case de las modis
Cita:
//Modificaciones
case 2:{
/*Limpia pantalla*/
system ("cls");

/*Declaro un vector de tipo estructura*/
struct listaPrecios vec[100];

//Muestro el contenido del fichero
mostrar(parchivo);

printf("****************************************** *****\n");

//Buscar
printf("Ingrese el codigo del archivo que desea buscar\n");
scanf("%i", &buscar);

//Busca en el archvio y se posiciona al principio del mismo
fseek(parchivo, (long)(buscar) * sizeof(vec[100]), SEEK_SET);
//Lee en el archivo
fread(&vec,sizeof(vec[100]),1,parchivo);
//Muestra en pantalla
puts(vec);

break;
}
le cambie las posiciones al vector pero igual no anda hace los mismo, el printf lo saque por que me mostraba datos de la memoria , algo por el estilo

gracias por ayudarme sam90
  #11 (permalink)  
Antiguo 03/11/2011, 19:35
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Modificar Archivo en C

Código C:
Ver original
  1. //Modificaciones
  2. case 2:{
  3. /*Limpia pantalla*/
  4. system ("cls");
  5.  
  6. /*Declaro un vector de tipo estructura*/
  7. struct listaPrecios vec[100];
  8.  
  9. //Muestro el contenido del fichero
  10. mostrar(parchivo);
  11.  
  12. printf("****************************************** *****\n");
  13.  
  14. //Buscar
  15. printf("Ingrese el codigo del archivo que desea buscar\n");
  16. scanf("%i", &buscar);
  17.  
  18. //Busca en el archvio y se posiciona al principio del mismo
  19. fseek(parchivo, (long)(buscar) * sizeof(struct listaPrecios), SEEK_SET);
  20. //Lee en el archivo
  21. fread(&vec,sizeof(struct listaPrecios),1,parchivo);
  22. //poner printf
  23.  
  24. break;
  25. }

Dos preguntas el metodo mostrar contenido del archivo que hace?? segunda pregunta como estas escribiendo en el archivo...saludos
  #12 (permalink)  
Antiguo 03/11/2011, 19:40
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 13 años, 5 meses
Puntos: 3
Respuesta: Modificar Archivo en C

tampoco me funciono, si pongo el printf hace lo mismo que te dije y si pongo el puts hace lo mismo de antes se posiciono en otro lugar.
te paso todo el código de como yo lo tenia al principio.
Cita:
#include <stdio.h>
#include <conio.h>
#include <string.h>

void carga(FILE *parchivo);
void mostrar(FILE *parchivo);

//Código ASCII
#define S 83
#define s 115

int main(){

/*Tipo archivo, creo un puntero*/
FILE *parchivo;
/*Abro el archivo*/
parchivo=fopen("archivo.txt", "a+t"); // si no " a+t" (si no existe lo crea, si no agrega datos), "wt" para borrar

/*Variables*/
int i, buscar=0, op, altas, otroIngreso[2];

/*Creo la estructura*/
struct listaPrecios{
int cod;
char prod[50];
float precio;
};
/*Ingreso la opcion que deseo*/
printf("Altas: ingrese 1\n");
printf("Modificaciones ingrese 2\n");
printf("Bajas ingrese 3\n");
printf("Mostrar Lista ingrese 4\n");
printf("Salir ingrese 5\n");
scanf("%i", &op);

switch(op){

/*Altas*/
case 1:{
if(op == 1){

/*Limpia pantalla*/
system ("cls");

/*Declaro un vector de tipo estructura*/
struct listaPrecios vec[1];

/*Altas*/
carga(parchivo);
}
break;
}

//Modificaciones
case 2:{
/*Limpia pantalla*/
system ("cls");

/*Declaro un vector de tipo estructura*/
struct listaPrecios vec[1];

//Muestro el contenido del fichero
mostrar(parchivo);

printf("****************************************** *****\n");

//Buscar
printf("Ingrese el codigo del archivo que desea buscar\n");
scanf("%i", &buscar);

//Busca en el archvio y se posiciona al principio del mismo
fseek(parchivo, (long)(buscar) * sizeof(vec), SEEK_SET);
//Lee en el archivo
fread(&vec,sizeof(vec),1,parchivo);
//Muestra en pantalla
puts(vec);

break;
}

//Bajas
case 3:{
break;
}

//Muestro el contenido del fichero
case 4:{
/*Limpia pantalla*/
system ("cls");


/*Declaro un vector de tipo estructura*/
struct listaPrecios vec[1];

//Mostrar fichero
mostrar(parchivo);
break;
}

//Salgo del programa
case 5: {
close();
break;
}



/*Cierre del switch*/
}

/*Cierro el archivo*/
fclose(parchivo);

/*Pausa*/
getch();

}
//-----------------------------------------------------------------

//Funcion de ALTA
void carga(FILE *parchivo){

//Variables
int i;

/*Creo la estructura*/
struct listaPrecios{
int cod;
char prod[50];
float precio;
};

/*Declaro un vector de tipo estructura*/
struct listaPrecios vec[1];

char sig;
//Altas
do{
for(i=0;i<1;i++){
/*Limpia pantalla*/
system ("cls");
/*Ingreso el codigo*/
printf("Ingrese el codigo\n");
scanf("%i", &vec[i].cod);
/*Ingreso el producto*/
printf("Ingrese el producto\n");
fflush(stdin);
gets(vec[i].prod);
/*Ingreso el precio*/
printf("Ingrese el precio\n");
scanf("%f", &vec[i].precio);
/*Grabo los datos en el txt*/
fprintf(parchivo, "---------------------------------------------\n");
fprintf(parchivo, " Codigo: %i \n Producto: %s \n Precio: %f \n", vec[i].cod, vec[i].prod, vec[i].precio);
}
printf(" ¿Desea Agregar otro producto? Ingrese la letra: S, de lo contrario ingrese: N\n");
scanf("%s", &sig);
}while(sig == 'S' || sig == 's');

}


//Funcion de Mostrar contenido del fichero
void mostrar(FILE *parchivo){

/*Creo la estructura*/
struct listaPrecios{
int cod;
char prod[50];
float precio;
};

/*Declaro un vector de tipo estructura*/
struct listaPrecios vec[1];

printf("El contenido del archivo es: \n");

//Recorro el archivo
do{
fgets(vec, 100, parchivo);
puts(vec);
}while(fgetc(parchivo) != EOF);

}

//------------------------------------------------------
Muchisimas gracias
  #13 (permalink)  
Antiguo 03/11/2011, 20:38
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Modificar Archivo en C

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. void carga(FILE *parchivo);
  5. void mostrar(FILE *parchivo);
  6.  
  7. //Código ASCII
  8. #define S 83
  9. #define s 115
  10.  
  11. // Las estructuras definilas afuera del main o de cualqueir funcion, asi son visibles por todos ************************
  12. // AGREGO UN TYPEDEF PARA  NO TENER QUE USAR LA PALABRA STRUCT TODO EL TIEMPO. APARTIR DE AHORA ES UN TIPO  MAS COMO TODOS.
  13. typedef struct __listaPrecios{
  14.     int cod;
  15.     char prod[50];
  16.     float precio;
  17. } listaPrecios;
  18.  
  19.  
  20.     int main(){
  21.  
  22.         FILE *parchivo;
  23.         parchivo=fopen("archivo.txt", "ab+"); // ERROR: Estabas abriendo mal el archivo....faltaba el modo binario.
  24.         listaPrecios t;
  25.         int i, buscar=0, op, altas, otroIngreso[2];
  26.         printf("1 - Altas\n");
  27.         printf("2 - Modificaciones\n");
  28.         printf("3 - Bajas\n");
  29.         printf("4 - Mostrar Lista \n");
  30.         printf("5 - Salir\n");
  31.         scanf("%i", &op);
  32.  
  33.         switch(op){
  34.             case 1:  // NO SE NECESITABAN LAS LLAVES NI EL IF  
  35.                 carga(parchivo);
  36.                 break;
  37.  
  38.             case 2:
  39.                 //mostrar(parchivo);
  40.  
  41.                 printf("****************************************** *****\n");
  42.                 printf("Ingrese el codigo del archivo que desea buscar\n");
  43.                 scanf("%i", &buscar);
  44.                 i = fseek(parchivo,(buscar-1) * sizeof(listaPrecios), SEEK_SET);
  45.                 fread(&t,sizeof(listaPrecios),1,parchivo);
  46.                 printf("%d: %d %s %f\n", i, t.cod , t.prod , t.precio);
  47.                 break;
  48.  
  49.             case 3:
  50.                 break;
  51.  
  52.             case 4:
  53.                 //mostrar(parchivo);
  54.                 break;
  55.            
  56.             case 5:
  57.                 //close();
  58.                 break;
  59.  
  60.         }
  61.         fclose(parchivo);
  62.     }
  63. //-----------------------------------------------------------------
  64.  
  65. //Funcion de ALTA
  66.     void carga(FILE *parchivo)
  67.     {
  68.         int i;
  69.         listaPrecios l;
  70.         char sig;
  71.  
  72.         do{
  73.             for(i=0;i<1;i++){
  74.                 printf("Ingrese el codigo:");
  75.                 scanf("%i", &(l.cod));
  76.                 while(getchar() != '\n');
  77.                 printf("Ingrese el producto:");
  78.                 gets(l.prod);
  79.                 printf("Ingrese el precio");
  80.                 scanf("%f", &(l.precio));
  81.                 while(getchar() != '\n');
  82.                 // ERROR FATAL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  83.                 // ESTABAS ESCRIBIENDO TEXTO Y NO EN BINARIO ASI QUE NUNCA IBAS A PODER LEER
  84.                 fseek ( parchivo , 0 , SEEK_END ); //  ME POSICIONO AL FINAL DEL ARCHIVO
  85.                 fwrite(&l, sizeof(listaPrecios) , 1 , parchivo);
  86.             }
  87.             printf(" ¿Desea Agregar otro producto? Ingrese la letra: S, de lo contrario ingrese: N\n");
  88.             scanf("%s", &sig);
  89.         }while(sig == 'S' || sig == 's');
  90.  
  91.     }
  92.  
  93. /*
  94. //Funcion de Mostrar contenido del fichero
  95.     void mostrar(FILE *parchivo)
  96.     {
  97.  
  98.         struct listaPrecios vec[1];
  99.  
  100.     printf("El contenido del archivo es: \n");
  101.  
  102. //Recorro el archivo
  103.     do{
  104.     fgets(vec, 100, parchivo);
  105.     puts(vec);
  106.     }while(fgetc(parchivo) != EOF);
  107.  
  108. }
  109. */
  110. //------------------------------------------------------


Perdon por lo que voy a decir, pero estaba todo pesimamente hecho. Por un lado imprimes como si fuese texto plano y por otro lado querias leer como si fuesse binario... ahi lo corregi para que quede tipo binario y a mi me funciono. Solo una aclaracion, el modificar quedo hecho un buscar por asi decirlo. Te pide el numero de registro y lo muestra nada mas...pero anda.

Te falta mucho por aprender....yo leeria un poco mas y haria cosas mas faciles para empezar...como manejar el tema de punteros y memoria. Eso te va a aclarar mucho como se manejan los achivos en C++..

Saludos,

PD: Agregue indexado al codigo y un para de comentarios como para que aprendas un par de cosas. Como por ejemplo donde declarar las estructuras y el uso del typedef.
  #14 (permalink)  
Antiguo 04/11/2011, 12:16
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 13 años, 5 meses
Puntos: 3
Respuesta: Modificar Archivo en C

gracias por ayudarme. Puede ser que sea un poco avanzado para mi ya que no hace menos de un mes que vi estructuras y manejo de archivos.. pero quise hacer algo importante para aprender mejor, gracias a tu ayuda reconosi varios errores.. te hago unas ultimas consultas que me quedo de dudas con el codigo....

1)por que lo abris en modo binario? cual es el problema de abrir el archivo como yo lo estaba abriendo.
2)En el metodo cargar... "while(getchar() != '\n');" por q usas ese código , lo probre sin el codigo y el programa no toma los datos pero por que , el "\n" no es solo en las cadenas de caracteres? y esta linea de código "fseek (parchivo , 0 , SEEK_END);" por que te posicionas al final del archvio no tendria que ser al princio?
3)Y mi ultima duda... "fseek(parchivo,(buscar-1) * sizeof(listaPrecios), SEEK_SET);" esa linea esta cuando buscar... por que el -1¿¿?


bueno la verdad que no tengo palabras de agredecimiento para vos me estas ayudando un montonaso y a la vez estoy aprendiendo. Muchisimas gracias
  #15 (permalink)  
Antiguo 04/11/2011, 15:45
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Modificar Archivo en C

Lo abro en binario porqeu justamente pense que querias eso. Si estas haciendo un abm (Alta baja modificacion) se te va a complicar con texto plano. El fseek creo que no esta permitido en ese tipo de archivo. Ademas con el formato que vos lo guardabas, no ibas a poder buscar registros con el fseek. ya que las cadenas eran de longitud variable....

Si lo quieres hacer con texto plano podrias implementer un archivo tipo CSV donde los datos estan separados por coma y los registro por nueva linea.

"while(getchar() != '\n');" Esto lo uso porque al usar el gets o getline busca hasta encontrar una nueva linea, en el scanf anterior al tocar el enter, este es procesado por el gets y no te deja ingresar el nombre.

El -1 es simplemente un corrimiento. Digamos vos pones desde 1....N pero en el archivo la primera informacion esta en el lugar cero, es simplemente eso.....

No se que tipo de manejo de archivos diste pero antes le estabas errando feo a las cosas.

Saludos

Etiquetas: modificar, struct
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 14:02.