Tomar datos de un archivo y ponerlos en un vector!!!

Iniciado por the_jocker, 11 Julio 2012, 15:51 PM

0 Miembros y 1 Visitante están viendo este tema.

durasno

Citaren 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

Citarsi 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 %p


Saludos
Ahorrate una pregunta, lee el man

xiruko

Citarno 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.

CitarNo, 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.

the_jocker

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);
while(!feof(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);
}
fclose(stock1);
}


Creo que el problema esta en como sobreescribo el dato, creo nose. Gracias.

durasno

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
Ahorrate una pregunta, lee el man

the_jocker

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);

durasno

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 &
Ahorrate una pregunta, lee el man

the_jocker

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.

durasno

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("\n0 - Salir: ");
scanf("%d",&st);
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: ");
                             scanf("%d",&cod);
                             printf("\nIngrese la cantidad a descontar: ");
                             scanf("%d",&cantidad);
                             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);
pos=ftell(stock1);
fread(art,sizeof(art),1,stock1);
fread(&cantidad,sizeof(int),1,stock1);
fread(&precio,sizeof(float),1,stock1);
while(!feof(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);
pos=ftell(stock1);
fread(art,sizeof(art),1,stock1);
fread(&cantidad,sizeof(int),1,stock1);
fread(&precio,sizeof(float),1,stock1);
}
fclose(stock1);
}



Saludos
Ahorrate una pregunta, lee el man