Autor
|
Tema: Tomar datos de un archivo y ponerlos en un vector!!! (Leído 7,267 veces)
|
durasno
Desconectado
Mensajes: 373
|
en vez de declarar un puntero como int *a intenta declararlo como int* a. parece una tonteria, y para el compilador es lo mismo, pero de la segunda manera se ve claramente que a es una variable de tipo puntero a int. en cambio de la primera se puede pensar que *a es un puntero a int. no se entiende lo que queres decir. En una declaracion de puntero cualquiera de las dos formas se entiende que es un puntero si haces un printf("%d", a), el resultado sera un numero largo que indica la direccion de memoria a la que apunta No, para saber la direccion a la que apunta se usa %pSaludos
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
xiruko
Desconectado
Mensajes: 438
|
no se entiende lo que queres decir. En una declaracion de puntero cualquiera de las dos formas se entiende que es un puntero si, para ti si, pero para alguien que esta aprendiendo puede llegar a confundir. al menos a mi me paso. como he dicho es una tonteria y es lo mismo, pero es quizas mas entendible para el usuario que aprende o al menos a mi me ayudo. No, para saber la direccion a la que apunta se usa %p de eso no tenia ni idea, pero poniendo el especificador de formato como si fuera un int, el compilador te manda un warning pero lo imprime sin problemas. tan solo era como una introduccion a los punteros, sin tocar temas profundos ni tecnicismos innecesarios.
|
|
|
En línea
|
|
|
|
the_jocker
Desconectado
Mensajes: 41
|
Bueno, gracias por responder, es cierto que puse mal las variables, ya lo corregi pero sigue sin descontar el stock, yo leo los datos, si coinciden lo escribo de nuevo y pongo el valor de la cantidad - lo que vendi, y sigo con el mismo valor del inicio, creo que asi no se modifican los datos, nose si ustedes me pueden decir como ustedes lo modificarian, o si esta mal como lo hice, posteo el codigo: void DESCONTAR_STOCK(FILE *stock1, int diferencia1, int comp1) { int cod,cantidad;//nc: nueva cantidad del articulo float precio; char art[50]; stock1 = fopen("Stock.dat","r+b"); fread(&cod ,sizeof(int),1,stock1 ); fread(&art ,sizeof(art ),1,stock1 ); fread(&cantidad ,sizeof(int),1,stock1 ); fread(&precio ,sizeof(float),1,stock1 ); { if(comp1 == cod) { fwrite(&cod ,sizeof(int),1,stock1 ); fwrite(&art ,sizeof(art ),1,stock1 ); fwrite(&cantidad ,sizeof(diferencia1 ),1,stock1 ); fwrite(&precio ,sizeof(float),1,stock1 ); fseek(stock1 ,2,SEEK_END ); } fread(&cod ,sizeof(int),1,stock1 ); fread(&art ,sizeof(art ),1,stock1 ); fread(&cantidad ,sizeof(int),1,stock1 ); fread(&precio ,sizeof(float),1,stock1 ); } }
Creo que el problema esta en como sobreescribo el dato, creo nose. Gracias.
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
Hola! es como decis vos, el problema esta en sobreescribir. Cuando vos lees algo de un archivo el cursor se desplaza, por lo tanto cuando quieras guardar vas a hacerlo a partir de donde esta posicionado el cursor. Lo que tendrias que hacer es volver a posicionarte cuando se cumple comp1 == cod. Tenes que usar fseek
Fijate si te sale sino te sigo ayudando. Saludos
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
the_jocker
Desconectado
Mensajes: 41
|
Gracias durasno por tomarte el tiempo de responder, si pruebo con el fseek y me cuesta ya que me confundo con la posición de la lectura del archivo, mira yo la ultima lectura que hago es el precio entonces si coincide al codigo con la variable comp1, con el fseek vuelvo una posición hacia atrás y pongo al principio el cursor y escribo la variable diferencia1, estoy en lo correcto?. fseek(stock1 ,-sizeof(cantidad ),SEEK_SET ); fwrite(&diferencia1 ,sizeof(diferencia1 ),1,stock1 ); fseek(stock1 ,2,SEEK_END );
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
Q oxidado estoy con archivos :S. Entre la lectura de cod y art pone: pos =ftell(fp ); // ftell devuelve la posicion del cursor
pos es un entero. Luego si se cumple que es el codigo correcto pone: if(comp1 == cod) { ns = cantidad - diferencia1; fseek(fp ,pos -1,SEEK_SET ); fwrite(&cod ,sizeof(int),1,stock1 ); fwrite(art ,sizeof(art ),1,stock1 ); fwrite(&ns ,sizeof(int),1,stock1 ); fwrite(&precio ,sizeof(float),1,stock1 ); fseek(stock1 ,0,SEEK_END ); }
Otra cosa, algo q no me habia dado cuenta es que tanto en la lectura como la escritura pones & delante de art, lo cual creo q causa un error ya que esta demas el &
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
the_jocker
Desconectado
Mensajes: 41
|
Gracias durasno, por responder, si probe el codigo y sigo en lo mismo, voy a para un rato ya, no consigo dar con la solución, pero voy a seguir estudiando el tema, la mayoria de los ejemplos que vi de la función fssek, son con estructuras, y no se nada de estructuras todavía, igual mi vieja cumple en agosto asi que todavia tengo tiempo de terminar el raglo, nunca mejor dicho terminar un regalo. Gracias igual durasno y a todos los que se dignaron ayudarme.
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
Me parece bien que estudies acerca de estructuras ya que te facilita varias cosas. Mire otra ves el codigo y me equivoque en pasarte esto: fseek(stock ,pos -1,SEEK_SET );
tenia que ser: fseek(stock ,pos -sizeof(int),SEEK_SET );
Hay q descontar sizeof(int) a pos ya que despues de leer el codigo del archivo, el cursor se desplaza 4bytes(o 2bytes) Compile el programa y me anda bien, te dejo las modificaciones: En el modulo de stock case 2: if(op == 2) { printf("\n____________________________"); printf("\nBienvenidoal modulo de stock: "); printf("\nEscoja la opcion: "); printf("\n1 - Alta de un articulo"); printf("\n2 - Consulta de un articulo "); printf("\n3 - Descontar stock"); printf("\n___________________________\n"); switch(st) { case 0: return 0; break; case 1: if(st == 1) ALTAS_ARTICULOS(stock); break; case 2: if(st == 2) CONSULTA_ARTICULOS(stock); break; case 3: printf("\nIngrese codigo del articulo: "); printf("\nIngrese la cantidad a descontar: "); DESCONTAR_STOCK(stock, cantidad, cod); break; default: printf("\nLa opcion no es correcta "); break; } break; }
Funcion modificada: void DESCONTAR_STOCK(FILE *stock1, int diferencia, int x) { int cod,cantidad,ns;//nc: nueva cantidad del articulo float precio; int pos; char art[50]; stock1 = fopen("Stock.dat","r+b"); fread(&cod ,sizeof(int),1,stock1 ); fread(art ,sizeof(art ),1,stock1 ); fread(&cantidad ,sizeof(int),1,stock1 ); fread(&precio ,sizeof(float),1,stock1 ); { if(x == cod) { ns = cantidad - diferencia; fseek(stock1 ,pos -sizeof(int),SEEK_SET ); fwrite(&cod ,sizeof(int),1,stock1 ); fwrite(art ,sizeof(art ),1,stock1 ); fwrite(&ns ,sizeof(int),1,stock1 ); fwrite(&precio ,sizeof(float),1,stock1 ); fseek(stock1 ,0,SEEK_END ); } fread(&cod ,sizeof(int),1,stock1 ); fread(art ,sizeof(art ),1,stock1 ); fread(&cantidad ,sizeof(int),1,stock1 ); fread(&precio ,sizeof(float),1,stock1 ); } }
Saludos
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Cómo tomar atributos de archivo y mostrarlos con Echo SOLUCIONADO
Scripting
|
<ИΘZIЭ(ŦB>
|
8
|
6,916
|
23 Agosto 2009, 05:50 am
por <ИΘZIЭ(ŦB>
|
|
|
Como tomar datos del PC
« 1 2 »
PHP
|
Skeletron
|
15
|
12,682
|
16 Abril 2010, 02:57 am
por Castg!
|
|
|
Eliminar datos de un vector
Programación C/C++
|
gatusko
|
1
|
12,996
|
16 Septiembre 2010, 12:25 pm
por satu
|
|
|
Imposible tomar datos de una tabla [VBS]
Scripting
|
P4nd3m0n1um
|
1
|
2,041
|
13 Julio 2012, 03:38 am
por Eleкtro
|
|
|
tomar fecha de subida de datos
PHP
|
basickdagger
|
2
|
1,456
|
13 Noviembre 2013, 19:43 pm
por basickdagger
|
|