Autor
|
Tema: Tomar datos de un archivo y ponerlos en un vector!!! (Leído 7,268 veces)
|
the_jocker
Desconectado
Mensajes: 41
|
Buenas, de nuevo, siempre tengo mas dudas de las que puedo solucionar, pero bueno, resulta de que mi vieja cumple años, y tiene un negocio, yo le prometi un programa, es pequeño el negocio, osea que no necesita un super software, lo pongo aqui por que lo estoy haciendo en c, bien voy a postear el codigo, en realidad el problema radica en la lectura de los archivos, tengo 3, uno para ventas, uno para el stock y el ultimo para clientes, es bastante entendible el codigo, para que no haya confusión, recien estoy aprendiendo vectores, asi que estructuras y demás todavia no, las funciones se preguntaran porque son void, bueno en realidad, no devuelven nada, hacen trabajos pero no devuelven nada, se que es un mala practica de programación, ya lo voy a corregir, posteo el codigo y les digo que pasa: #include <stdio.h> #include <string.h> void STOCK(FILE *stock1); void CLIENTES(FILE *clientes1); main() { FILE *clientes; FILE *stock; int op,cod,v,cantidad,cl;/*v y cl Variable para la la opcion del modulo de stock y clientes*/ char descripcion[100] = ""; char nombre[100] = ""; float total,precio,saldo; clientes = fopen("Clientes.dat","wb"); stock = fopen("Stock.dat","wb"); printf("\n____________________"); printf("\nEscoja su opcion: "); printf("\n___________________\n"); while(op != 0) { if(op == 1) { } if(op == 2) { printf("\nBienvenido al modulo de stock"); printf("\n_______________________"); printf("\nElija su opcion: "); printf("\n1 - Alta de un articulo: "); printf("\n2 - Consulta de un articulo: "); printf("\n3 - Modificar el inventario: "); printf("\n0 - Salir del modulo de Stock: "); printf("\n_______________________\n"); if(v == 1) { printf("\nIngrese el codigo del producto: "); while(cod != 0) { printf("\nIngrese el nombre y la descripcion: "); printf("\nIngrese la cantidad: "); printf("\nIngrese el precio del articulo: "); printf("\n__________________________\n"); fwrite(&cod ,sizeof(int),1,stock ); fwrite(&descripcion ,sizeof(int),1,stock ); fwrite(&cantidad ,sizeof(int),1,stock ); fwrite(&precio ,sizeof(int),1,stock ); printf("\nIngrese el codigo del articulo: "); } printf("\nEl articulo fue guardado con exito\n"); } if(v == 2) { STOCK(stock); } } if(op == 3) { printf("\n________________________"); printf("\nBienvenido al modulo de clientes: "); printf("\nSeleccione su opcion: "); printf("\n1 - Alta de un cliente"); printf("\n2 - Consulta de un cliente"); printf("\n_________________________\n"); while(cl != 0) { printf("\nIngrese el nombre y apellido: "); while(nombre != NULL) { printf("\nIngrese el saldo de tener alguno: "); fwrite(&nombre ,sizeof(int),1,clientes ); fwrite(&saldo ,sizeof(int),1,clientes ); printf("\nIngrese el nombre y apellido: "); } } } printf("\n____________________"); printf("\nEscoja su opcion: "); printf("___________________\n"); } return 0; } void STOCK(FILE *stock1) { int cod,cantidad; int x;/*Variable para extraer los datos del archivo.*/ char descripcion[50] = ""; float precio; x = 0; precio = 0; cantidad = 0; printf("\nIngrese el codigo del articulo: "); stock1 = fopen("Stock.dat","r+b"); fread(&x ,sizeof(int),1,stock1 ); { if(x == cod) { printf("\n_____________________"); printf("\nArticulo: %s",descripcion ); printf("\nCantidad: %d",cantidad ); printf("\nPrecio: %.2f",precio ); printf("\n_____________________\n"); fseek(stock1 ,2,SEEK_END ); } fread(&x ,sizeof(int),1,stock1 ); } } void CLIENTES(FILE *clientes1) { int op,n; char x[100] = ""; float saldo; char nombre[50] = ""; clientes1 = fopen("Clientes.dat","r+b"); printf("\nIngresar el nombre del cliente: "); fread(&x ,sizeof(int),1,clientes1 ); { if(x == nombre) { printf("\nNombre: %s",nombre ); fseek(clientes1 ,2,SEEK_END ); } fread(&x ,sizeof(int),1,clientes1 ); } }
Como dije es bastante entendible, creo. Pero el problema esta en las funciones,cuando yo en el main cargo los datos del producto por ejemplo, cuando elijo consultar, lo comparo y me encuentra el código, pero no me muestra nada más que el codigo, cuando la carga y la consulta la hacia dentro de la funcion stock lo podia consultar bien, bueno como está, lo que yo no puedo es, nose si podra, leer en linea,nose si me explico. código - nombre - cantidad - precio. Y de ahí comparar,para poder imprimir, y en la funcion clientes, ingreso el nombre y probe de mil formas no puedo salir del ciclo, osea, si presiono 0 no sale, si lo dejo en blanco no sale, si pongo una letra no sale, Desde ya gracias a todos.
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
Hola! no te quiero arruinar el regalo pero tenes varios errores conceptuales. Lo mas raro es que digas "recien estoy aprendiendo vectores", cuando ya estas queriendo manejar archivos... Te marco lo errores que vi: 1º Tenes que revisar como se usa la funcion fwrite(). No podes utilizar sizeof(int) en todos los casos, estas guardando mal. 2º Lo mismo fread 3º En el main cuando elegis la opcion: "1 - Alta de un articulo" ó "3 - Clientes" cerras los archivos(con fclose). El problema es: ¿que pasa si el usuario vuelve a elegir esas opciones? los archivos van a estar cerrados por lo que vas a tener un error cuando quieras volver a guardar algo. Tenes que abrir los archivos antes de elegir esas opciones 4º Con este ciclo: while(nombre != NULL) estas generando un bucle infinito. No tiene sentido hacer esa comparacion ¿que es lo que querias hacer? 5º En la funcion STOCK() el principal error esta en el uso de fread. Ya que no sabes manejar estructuras, lo que tenes que hacer para cada ciclo de lectura es: fread(&x ,sizeof(int),1,stock1 ); fread(descripcion ,sizeof(descripcion ),1,stock1 ); fread(&cantidad ,sizeof(int),1,stock1 ); fread(&precio ,sizeof(float),1,stock1 );
Hay muchas cosas que se pueden mejorar aun. Mi consejo es que antes de seguir con esto practiques un poco mas con manejo de archivos, y con estructuras Saludos
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
flacc
|
yo tampoco te quiero arruinar el regalo, es mas me parece que tienes muy buenas intenciones pero me imagino que ti software sería mas productivo si ocuparas alguna biblioteca para usar ventanas en vez de consolas que imagino que es lo que estas haciendo(si no no me prestes atención xD), lo otro, los if que usas para comparar el valor de op los puedes hacer con un switch que esta hecho para esa clase de cosas, también sería bueno que agregaras validaciones a tu software como "la opción ingresada no es válida", etc y que permitieran un mejor manejo del mismo, también tu función main no tiene tipo de retorno aun cuando retornas 0... en fin... un poquito de critica constructiva nunca esta demás...saludos
|
|
|
En línea
|
|
|
|
the_jocker
Desconectado
Mensajes: 41
|
Eso es lo que quiero, muchas gracias por hacer criticas, si bien es cierto lo del progrma, es el primer proyecto por asi decir en el que me meto de lleno, lo de los vectores es cierto, archivos los vi bien y el problema es que como bien lo marcas la falla en el ciclo para volver a leer, no lo puedo solucionar, ya que el problema está en donde lo ubico a la apertura del archivo para que cuando se seleccione esa opción se lo pueda leer correctamente, más preciso yo queria poner los datos en un vector, para no usar tantas variables, y comparar con un for, pero me es imposible, los archivos ademas son como bd en el programa, gracias de verdad por las criticas.
|
|
|
En línea
|
|
|
|
bemone
Desconectado
Mensajes: 74
|
Eso es lo que quiero, muchas gracias por hacer criticas, si bien es cierto lo del progrma, es el primer proyecto por asi decir en el que me meto de lleno, lo de los vectores es cierto, archivos los vi bien y el problema es que como bien lo marcas la falla en el ciclo para volver a leer, no lo puedo solucionar, ya que el problema está en donde lo ubico a la apertura del archivo para que cuando se seleccione esa opción se lo pueda leer correctamente, más preciso yo queria poner los datos en un vector, para no usar tantas variables, y comparar con un for, pero me es imposible, los archivos ademas son como bd en el programa, gracias de verdad por las criticas.
Como dijeron arriba, utiliza los switch para hacerlo mas prolijo y el default para enviar un mensaje en caso de que el numero no sea correcto. Con el tema de los archivos podes crear una funcion que habra los archivos, hacer lo que tengas que hacer y volver a cerrarlo cada vez que utilize alguna opcion. En el caso de los vectores no es nada mas que recorrerlo, asignar el valor y guardarlo en el archivo, si decidis almacenar cada producto con sus datos en una linea y abajo otro producto, podes tomar la linea completa con un getline(archivo, string). Espero haber entendido bien tu problema.
|
|
|
En línea
|
Odio los tipos de variable de Windows.
|
|
|
the_jocker
Desconectado
Mensajes: 41
|
Buenas, estoy de nuevo, lo modifique al programa un cachito y segui el consejo y lo separe en funciones, lo muestro para que lo vean y me den una mano para continuar. #include <stdio.h> #include <string.h> #include <stdlib.h> FILE *ventas; FILE *stock; FILE *clientes; float VENTAS_CONTADO(FILE *ventas1, FILE *stock1, FILE *clientes1); float VENTAS_CTACTE(FILE *ventas1, FILE *stock1, FILE *clientes1); void ALTAS_ARTICULOS(FILE *stock1); void CONSULTA_ARTICULOS(FILE *stock1); void ALTAS_CLIENTES(FILE *clientes1); void CONSULTA_CLIENTES(FILE *clientes1); main() { /*op,v,cl,st son variables para la eleccion de la opreacio*/ int op,v,cl,st; float cta,cont; printf("\nIngrese la opcion: "); while(op != 0) { switch(op) { case 0: return 0; case 1: if(op == 1) { printf("\n___________________________"); printf("\nBienvenido al modulo de ventas: "); printf("\nEscoja la opcion: "); printf("\n1 - Ventas Contado"); printf("\n2 - Ventas Cuenta Corriente"); printf("\n___________________________\n"); switch(v) { case 0: return 0; case 1: if(v == 1) cont = VENTAS_CONTADO(ventas,clientes,stock); break; case 2: if(v == 2) cta = VENTAS_CTACTE(ventas,clientes,stock); break; default: printf("\nSu opcion no es correcta\n"); break; } } break; 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("\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; default: printf("\nLa opcion no es correcta "); break; } break; } case 3: if(op == 3) { printf("\n___________________________"); printf("\nBienvenido al modulo de clientes"); printf("\nEscoja la opcion: "); printf("\n1 - Alta de un cliente"); printf("\n2 - Consulta de un cliente"); printf("\n____________________________\n"); switch(cl) { case 0: return 0; break; case 1: if(cl == 1) { ALTAS_CLIENTES(clientes); } break; case 2: if(cl == 2) CONSULTA_CLIENTES(clientes); break; default: printf("\nLa opcion no es correcta "); break; } } break; default: printf("\nLa opcion ingresada no es correcta"); break; } printf("\n_____________________"); printf("\nIngrese la opcion: "); printf("\n_______________________\n"); } } void ALTAS_ARTICULOS(FILE *stock1) { int cantidad,codigo; float precio; char art[50]; cantidad = 0;codigo = 0; precio = 0; stock1 = fopen("Stock.dat","ab");//Solo escribir el archivo, en caso de existir escribe al final printf("\nIngrese el codigo del articulo: "); while(codigo != 0) { printf("\nIngresar el nombre del articulo y una breve descripcion: "); printf("\nIngrese la cantidad: "); printf("\nIngrese el precio: "); fwrite(&codigo ,sizeof(int),1,stock1 ); fwrite(&art ,sizeof(art ),1,stock1 ); fwrite(&cantidad ,sizeof(int),1,stock1 ); fwrite(&precio ,sizeof(float),1,stock1 ); printf("\nIngresar el codigo del articulo: "); } printf("\nEl/los articulos fueron guardados con exito\n"); } void CONSULTA_ARTICULOS(FILE *stock1) {/*Funcion que hace lo mismo que CONSULTA_CLIENTES */ int codigo,cantidad,x; float precio; char art[50]; stock1 = fopen("Stock.dat","rb");//rb para solo lectura ya que el archivo existe printf("\nIngrese el codigo del articulo: "); fread(&x ,sizeof(int),1,stock1 ); fread(&precio ,sizeof(float),1,stock1 ); fread(&cantidad ,sizeof(int),1,stock1 ); fread(&art ,sizeof(art ),1,stock1 ); { if(codigo == x) { printf("\n____________________"); printf("\nCodigo: %d",codigo ); printf("\nDescripcion: %s",art ); printf("\nCantidad: %d",cantidad ); printf("\nPrecio: %.2f",precio ); printf("\n____________________\n"); fseek(stock1 ,2,SEEK_END ); } fread(&x ,sizeof(int),1,stock1 ); fread(&precio ,sizeof(float),1,stock1 ); fread(&cantidad ,sizeof(int),1,stock1 ); fread(&art ,sizeof(art ),1,stock1 ); } } void ALTAS_CLIENTES(FILE *clientes1) { char nombre[50]; int cod; float saldo; clientes1 = fopen("Clientes.dat","ab");//Solo escribir el archivo, en caso de existir escribe al final printf("\nIngrese el codigo de identificacion del cliente: "); while(cod != 0) { printf("\nIngrese el nombre del cliente: "); printf("\nIngrese el saldo de tener alguno: "); fwrite(&saldo ,sizeof(float),1,clientes1 ); fwrite(&cod ,sizeof(int),1,clientes1 ); fwrite(&nombre ,sizeof(nombre ),1,clientes1 ); printf("\nIngrese el codigo: "); } } void CONSULTA_CLIENTES(FILE *clientes1) { /*Funcion que busca por codigo y si encuentra imprime codigo,nombre y saldo y posiciona la lectura al final del archivo */ int cod,x; float saldo; char nombre[50]; saldo = 0; clientes1 = fopen("Clientes.dat","rb");//rb para solo lectura ya que el archivo existe printf("\nIngrese el codigo de idectificacion del cliente: "); fread(&saldo ,sizeof(float),1,clientes1 ); fread(&x ,sizeof(int),1,clientes1 ); fread(&nombre ,sizeof(nombre ),1,clientes1 ); { if(cod == x) { printf("\nSaldo: %.2f",saldo ); printf("\n__________________\n"); fseek(clientes1 ,2,SEEK_END ); } fread(&saldo ,sizeof(float),1,clientes1 ); fread(&x ,sizeof(int),1,clientes1 ); fread(&nombre ,sizeof(nombre ),1,clientes1 ); } } float VENTAS_CONTADO(FILE *ventas1, FILE *stock1, FILE *clientes1) { } float VENTAS_CTACTE(FILE *ventas1, FILE *stock1, FILE *clientes1) { }
Como veran, esta un poco mejor y estoy manejando las exepciones, pero yo de la unica forma de leer y escribir un archivo es esa, no se de estructuras, ya lo voy a mejorar, pero sigo con el problema de la lectura, me esta costando y todavia faltan las funciones mas importantes com las ventas.Gracias a todos por ayudarme.
|
|
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
Hola! el codigo esta bastante mejor, mas ordenado pero. Te marco algunas cosas:
1º Revisa el uso del switch-case. Te recomendaron que uses switch para que el codigo se vea mas lindo y para reemplazar a los ifs
2º El problema en la lectura es el orden de como lo haces. En la funcion ALTAS_ARTICULOS() guardas con fwrite en este orden: codigo - art - cantidad - precio. Y en CONSULTA_ARTICULOS(): codigo - precio - cantidad - art... El orden tiene que coincidir tanto para leer como para guardar
3º no queda muy lindo que pongas un return en los case. Aparte no tiene ninguna utilidad ahi
4º El while(op!=0) {} lo podes optimizar con un do-while, asi no tenes que repetir dos veces el menu principal
Saludos
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
the_jocker
Desconectado
Mensajes: 41
|
Bueno, ya logre que funcione el modulo de ventas de contado, funciona casi todo, pero quiero hacer que se descuente el stock por medio de una variable que paso por la funcion, les muestro el codigo ai lo pispean y me dicen. Yo creo que el problema está en la lectura del archivo, por eso no me descuentea. void DESCONTAR_STOCK(FILE *stock1, int diferencia1, int comp1) { int cod,cantidad,ns;//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) { ns = cantidad - *diferencia1; 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 ,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 ); } }
diferencia y comp, son variables que saque de una función para poder realizar la resta, diferencia contiene el valor de la cantidad que vendo - la cantidad que tengo y comp es el codigo del articulo que vendi para poder saber a cual descontar.
|
|
« Última modificación: 13 Julio 2012, 22:31 pm por the_jocker »
|
En línea
|
|
|
|
durasno
Desconectado
Mensajes: 373
|
Hola! if(*comp1 == cod) { ns = cantidad - *diferencia1;
¿por que usas el "*" delante de las variables? En: void DESCONTAR_STOCK(FILE *stock1, int diferencia1, int comp1)
las variables diferencia1 y comp1 se paso por valor Pone como hiciste la llamada. Saludos
|
|
|
En línea
|
Ahorrate una pregunta, lee el man
|
|
|
xiruko
Desconectado
Mensajes: 438
|
yo aun me lio con algunas cosas de apuntadores, pero a ver si consigo explicarme bien: primero, 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. segundo, imaginate a la variable tipo puntero a int como una variable que almacena 2 datos, una direccion de memoria a la que apunta y el valor que hay en esa direccion. si haces un printf("%d", a), el resultado sera un numero largo que indica la direccion de memoria a la que apunta. en cambio, *a indica el valor almacenado en esa direccion de memoria. las diferencias entre, por ejemplo, una variable int a y una variable int* b son que: 1. el valor almacenado se saca con: a y con *b2. la direccion de memoria donde esta almacenada la propia variable se saca con: &a y &b3. el valor "extra" que indica donde apunta una variable de tipo puntero se saca con: bquizas te preguntes entonces que para que sirven los punteros ya que aparentemente hacen lo mismo pero de una manera distinta y mas complicada. pues el principal uso de los punteros es poder gestionar la memoria de manera dinamica (poder asignar y liberar memoria despues de haber compilado). algo que, por ejemplo, te permitiria hacer un programa que preguntase al usuario cuantos datos quiere ingresar y entonces tu podrias usar la memoria justa sin riesgo a usar demasiada ni a quedarte corto. te dejo un pequeño codigo tipico de aprender apuntadores (da algunos warnings al compilar pero corre perfectamente): #include <stdio.h> int main() { int a=12, *b; printf("\nPARA a:\ndireccion propia: &a= %d\nvalor de a: a= %d\n\n", &a , a ); b=&a; //hacemos que el puntero b apunte a la variable a printf("PARA b:\napunta a la direccion: b= %d\nel valor almacenado ahi es: *b= %d\ndireccion propia: &b= %d\n\n", b , *b , &b ); return 0; }
su salida: PARA a: direccion propia: &a= 1606416780 valor de a: a= 12
PARA b: apunta a la direccion: b= 1606416780 el valor almacenado ahi es: *b= 12 direccion propia: &b= 1606416768 y ultimo, cuando hagas alguna funcion con parametros tienes que preguntarte si modificaras el valor de algun parametro. si no te interesa hacerlo, puedes pasar el parametro como una "variable normal" y usarla como tal. si necesitas modificar el valor de la variable, entonces le tienes que pasar a la funcion la direccion de memoria donde esta almacenada la variable, para que asi digamos que pueda escribir sobre ella. y para pasar la direccion de memoria entonces tienes que usar punteros. ultimo codigo de ejemplo: #include <stdio.h> void funcion(int n, int* p); int main() { int a=1, b=5; printf("VARIABLES ANTES DE LA FUNCION:\na= %d\nb= %d\n", a , b ); funcion(a, &b); printf("VARIABLES DESPUES DE LA FUNCION:\na= %d\nb= %d\n", a , b ); return 0; } void funcion(int n, int* p) { // n es una variable de tipo int "normal". n contiene el valor de la variable a. PASO POR VALOR (no se puede modificar) // p es una variable de tipo puntero a int. p contiende la direccion de memoria de b. PASO POR REFERENCIA (se puede modificar) printf("VALORES EN LA FUNCION:\nn= %d\n*p= %d\n", n , *p ); // intentamos modificar las variables (*p)=3; n=2; }
y su salida, donde se ve que 1 variable se ha modificado y la otra no: VARIABLES ANTES DE LA FUNCION: a= 1 b= 5 VALORES EN LA FUNCION: n= 1 *p= 5 VARIABLES DESPUES DE LA FUNCION: a= 1 b= 3 espero que sirva de ayuda... si tienes alguna duda no tienes mas que consultar. un saludo!
|
|
« Última modificación: 14 Julio 2012, 14:50 pm por xiruko »
|
En línea
|
|
|
|
|
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
|
|