C/Visual C - Ayuda con modificación de archivos en C++

   
Vista:

Ayuda con modificación de archivos en C++

Publicado por Allan (6 intervenciones) el 24/04/2017 05:00:15
Ola, me gustaría que si pueden ayudarme a resolver un problema que tengo al programar la modificación de un registro de un archivo en lenguaje c++, estoy programando en Visual c++ soy principiante en esto de c++.

Cuando quiero modificar el registro uso varios tipos de modificaciones en internet pero ni uno me ha funcionado como:

1
2
3
4
5
6
dire_Fisica = articuloCodigo * sizeof(estructura);
//Tambien este
dire_Fisica = ftell(archivo) - sizeof(estructura);
//Igual este
while(!feof(archivo)
{......} //Aqui busco el codigo del articulo o producto linea por linea

Pero ninguno me da resultado el primero me copia el registro ya modificado hasta arriba del archivo, el segundo lo copia hasta el final del archivo y el ultimo no lo modifica nada, les dejo el código de la parte de la función que tengo fallas y también otra cosa;

¿Por que a veces visual no lee o ejecuta ciertas sentencias de código y no hay ninguna condición que impida que esa sentencia sea ejecutada?

Por su ayuda gracias...

Aquí esta el código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
void egresosE()
{
	FILE *archi;
	archi = fopen(solu, "rb+");
	clrscr();
   long int dirFisica;
   int artiCodi, exis=0;
   char op= '\0';
   gotoxy(5,5);
   cout<<"======= Egresos de existencias =======";
   if(archi == NULL)
   {
   	gotoxy(10,7);
      cout<<"Archivo dañado o no existe.";
      gotoxy(10,9);
      cout<<"Presione cualquier tecla para continuar...";
      getch();
      fclose(archi);
      return;
   }
   gotoxy(10,7);
   cout<<"Ingrese codigo del articulo: ";
   cin>>artiCodi;
 
   //--------------------------------------------Operaciones binarias-----------------------------------//
   dirFisica = artiCodi * sizeof(archi);
   fseek(archi, dirFisica, SEEK_SET);
   fread(&articulos, sizeof(articulos),1,archi);
 
   //------------------------------------Leer registro-------------------------------------//
   //while(!feof(archi))
   //{
   	if(artiCodi == articulos.codigo)
      {
      	gotoxy(10,9);
         cout<<"Codigo: "<<articulos.codigo;
         gotoxy(10,10);
         cout<<"Nombre: "<<articulos.nombre;
         gotoxy(10,11);
         cout<<"Existencia: "<<articulos.existencia;
         gotoxy(10,13);
         cout<<"Cuantas existencias desea quitar: ";
         cin>>exis;
 
         while(op != 's' && op != 'n')
         {
         	gotoxy(10,14);
            cout<<"Esta seguro que desea restar existencias [s/n] >>> ";
            cin>>op;
         }
         if(op == 's')
         {
         	if(exis > articulos.existencia)
            {
            	gotoxy(10,20);
               cout<<"Introdujo un numero mayor a las existencias.";
               gotoxy(10,22);
               cout<<"Presione cualquier tecla para continuar...";
               fclose(archi);
               getch();
               return;
            }
 
            //---------------------------------Hacer la resta de las existencias--------------------------//
            //fclose(archi);
            //archi = fopen(solu, "rb+");
 
            fseek(archi, dirFisica, SEEK_SET);
			articulos.existencia -= exis;
            fwrite(&articulos, sizeof(articulos), 1, archi);
            gotoxy(10,16);
            cout<<"Existencia modificada exitosamente.";
            gotoxy(10,18);
            cout<<"Existencias despues de la modificacion: ";
            cout<<articulos.existencia;
 
            //-----------------------------Cerrar archivo y funcion-------------------------------//
            getch();
            fclose(archi);
            //break;
            return;
         }
         else
         if(op == 'n')
         {
         	fclose(archi);
            return;
         }
      }
      //fread(&articulos, sizeof(articulos), 1, archi);
   //}
 
   if(artiCodi != articulos.codigo)
   {
   	gotoxy(10,16);
      cout<<"Codigo no existente.";
      gotoxy(10,18);
      cout<<"Presione cualquier tecla para continuar...";
      getch();
      fclose(archi);
   }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda con modificación de archivos en C++

Publicado por agustin (266 intervenciones) el 24/04/2017 08:48:58
A ver, no puedes modificar un registro en c++ directamente en un archivo a no ser que sea el último registro del archivo. Lo que se hace es crear un archivo temporal donde se copian todos los registros desde el inicio del archivo al registro que deseas modificar, luego copias el registro modificado, luego copias detrás desde el siguiente registro hasta el final del archivo, cierras ambos archivos, renombrar el original con la extensión .bak por ejemplo por si algo sale mal tienes un backup, y renombrar el temporal al nombre del original y ya tienes tu registro modificado en el archivo.
Por cierto, si estas en c++ ¿por qué usas funciones de c para trabajar con archivos y no usas las que te brinda c++ en su librería fstream?
Por otro lado tu modo de calcular la posición del registro esta bien pero tiene un inconveniente muy importante, si borras un registro que no sea el último ya no te valdrá ese método. Te aconsejo que lo hagas realizando una búsqueda secuencial para buscar desde el inicio al final del archivo que es más lento pero más efectivo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda con modificación de archivos en C++

Publicado por Allan (6 intervenciones) el 24/04/2017 17:59:27
ya veo entonces, uso unas funciones de "c" por la razón que bueno mi profesor nos había comentado que las funciones esas vienen mejor diseñadas por ser código algo antiguo y tienen mejor calculo al abrir un archivo en binario gracias por tu respuesta.

Y otra cosa porque al tener ya demasiado código se salta unas líneas porque tengo una función que borra el producto haciendo lo mismo de copiar y pegar excepto el registro que deseo borrar pero cuando tiene que borrar el archivo temporal no lo hacer pero si lo renombre entonces provoca un desbordamiento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con modificación de archivos en C++

Publicado por agustin (266 intervenciones) el 24/04/2017 21:51:16
Pues supongo que el problema es que el archivo no está cerrado y por eso no te deja ni borrar ni renombrar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda con modificación de archivos en C++

Publicado por Allan (6 intervenciones) el 24/04/2017 23:28:20
Bueno este es el código de las bajas de artículos no creo que el problema sea al no cerrarlo porque a veces hago que me de un mensaje de que la condición fue ejecutada exitosa mente y si entra a las condiciones y a los ciclos y si borra el registro que deseo pero siempre deja los dos archivos porque cuando deseo ver temp.dll si se muestra que se borra el archivo a cambio no lo renombra ni borra solucion.dll:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
void bajaArticulo(FILE *archi)
{
	FILE *temp;
	long int dirFisica=0;
	int artiCodi = 0;
   char pregunta;
   clrscr();
   archi = fopen(solu, "rb");
	temp = fopen(archiTemp, "wb");
 
   gotoxy(10,3);
   cout<<"======= Eliminacion de un articulo =======";
 
   if(archi == NULL || temp == NULL)
   {
   	gotoxy(10,5);
      cout<<"Archivo dañado o no existe";
      gotoxy(10,15);
      cout<<"Presione cualquier tecla para continuar...";
      getch();
      return;
   }
   else
   {
   	gotoxy(10,5);
      cout<<"Ingrese el codigo del producto a eliminar >>> ";
      cin>>artiCodi;
      while(pregunta != 's' && pregunta != 'n')
      {
      	gotoxy(10,7);
      	cout<<"Esta seguro que desea eliminarlo [s/n] >>> ";
      	cin>>pregunta;
      }
 
      //------------------------Eliminar registro------------------------------//
      if(pregunta == 'n')
      {
      	fclose(archi);
      	fclose(temp);
 
      	remove("temp.dll");
 
      	return;
      }
      else
      if(pregunta == 's')
      {
      	//-----------------------------Verificar si el registro existe---------------------------------//
      	fread(&articulos, sizeof(articulos), 1, archi);
      	while(!feof(archi))
         {
         	if(artiCodi == articulos.codigo)
            {
            	gotoxy(10,9);
         		cout<<"Codigo de producto: "<<articulos.codigo;
         		gotoxy(10,10);
         		cout<<"Nombre del articulo: "<<articulos.nombre;
         		gotoxy(10,11);
         		cout<<"Existencia actualmente: "<<articulos.existencia;
            }
            else
            {
            	gotoxy(10,9);
               cout<<"Registro no existe.";
               gotoxy(10,10);
               cout<<"Presione cualquier tecla para continuar...";
               getch();
               fclose(archi);
               return;
            }
            fread(&articulos, sizeof(articulos), 1, archi);
         }
         fread(&articulos, sizeof(articulos), 1, archi);
         gotoxy(10,15);
         cout<<"Articulo eliminado exitosamente";
      	while(!feof(archi))
         {
         	if(artiCodi != articulos.codigo)
            {
            	fwrite(&articulos, sizeof(articulos), 1, temp);
            }
            fread(&articulos, sizeof(articulos),1,archi);
         }
         fclose(archi);
      	fclose(temp);
      	remove("solucion.dll");
 
 
      	getch();
      }
   }
   rename("temp.dll", "solucion.dll");
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con modificación de archivos en C++

Publicado por Tom (557 intervenciones) el 24/04/2017 22:10:43
Probablemente estás tratando de modificar algún fuente que has copiado y que no entiendes en su mayoría.
El procedimiento en general está bien, pero ya que el código es un ejemplo no tiene tratamiento de errores, y eso es muy malo.

El fichero que manejas contiene una serie de "registros" de tamaño fijo, ordenados según el código de artículo. Así puedes calcular directamente la posición dentro del fichero para cada registro (multiplicas el código por el tamaño de cada registro, asumiendo que el primer código es el 0).
En tu caso, además, escribes en el fichero ese mismo código, lo que te permite hacer una comprobación de si el artículo existe o no (para borrar un determinado artículo, puedes escribir un código "malo").
Tienes que comprobar el tamaño del fichero después de abrirlo, eso te permitirá calcular el número de registros que contiene.
Cada vez que trates de leer los datos de un artículo, comprueba que la posición del fichero que has calculado no sobrepase el tamaño de este y, si es correcto, usa fseek() (comprueba que no da error) y lee.
Para escribir el registro modificado, igual, calcula su posición (si no te la has guardado previamente), sitúate con fseek() (si es necesario) y reescribe, siempre comprobando el posible error de cada llamada.

Si quisieras añadir más códigos de artículo podrías, simplemente, recalcular el tamaño del fichero y usar ftruncate() (y por si acaso, cerrar y abrir el fichero otra vez);

Para este tipo de cosas deberías crearte ficheros de índices (en disco o en memoria) o usar algún gestor de bases de datos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda con modificación de archivos en C++

Publicado por Allan (6 intervenciones) el 24/04/2017 23:34:04
Pues si piensas que estoy tratando de modificar algo que vi por allí "no", el código fue puramente echo desde cero por mí. Solo que estoy teniendo muchos problemas con que no es ejecutadas algunas líneas o sentencias mi meta es hacer un programa que puedas consultar registros modificar, insertar, borrar y borrar todos los registros si lo deseas me busque en Internet y vi que tenia que inicializar todas las variables y el archivo en si. Pero yo ya había intentado eso por lo tanto, puse el código como estaba y si he provado hasta revisando registro por registro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con modificación de archivos en C++

Publicado por agustin (266 intervenciones) el 25/04/2017 17:16:44
Sobre el posicionado en el registro deseado, imagina que borras el registro 5 y luego quieres borrar el registro 6, el 6 ya no estaría en la posición 6 sino en la 5 con lo que con tu código borraría el 7. 3)Es mejor buscar en tu caso que calcular o crear un array en memoria con todos los índices o códigos con lo que no tendrías que buscar en todo el archivo sino que lo arias en el array que es mucho más rápido. Para saber si un registro existe puedes buscar en el array ese código. Para insertar igual y así podrías ordenar por inserción muy fácilmente ya que en tu caso el índice del array es una referencia para saber la posición de cada registro en el archivo.
Por otro lado, no te aconsejo que uses la extensión .dll ya que es la que se usa para librerías dinámicas y puede llevar a confusión. Usa mejor .dat que es lo que se suele usar para datos.Muy posiblemente haya habido un error al borrar o renombrar uno de los archivos y por eso tienes esos problemas. Simplemente cambia la extensión y con eso ya, si ha habido algún error con los nombres actuales, debería de funcionarte ya que son nombres diferentes y luego borra los de la extensión dll. Quizás tengas que hacer uso de alguna herramienta como unlocker o ccleaner para solucionar ese error.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Ayuda con modificación de archivos en C++

Publicado por Allan (6 intervenciones) el 26/04/2017 02:55:47
Muchas gracias a todos fue de ayuda sus respuestas y aquí está el código ya terminado ya funciono todo y use la técnica, de recorrer registro por registro :V
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
void buscarArticulo()
{
	FILE *archi;
   clrscr();
   int artiCodi;
   gotoxy(5,5);
   cout<<"======= Buscar articulo =======";
   gotoxy(10,7);
   cout<<"Ingrese el codigo del articulo: ";
   cin>>artiCodi;
   //---------------------------------Abrir archivo solo en modo lectura------------------------------//
   archi = fopen(solu, "r");
   if(archi == NULL)
   {
   	gotoxy(10,10);
      cout<<"Archivo dañado o no existe.";
      gotoxy(10,12);
      cout<<"Presione cualquier tecla para continuar...";
      getch();
      fclose(archi);
   }
   else
   {
   	fread(&articulos, sizeof(articulos), 1,archi);
      while(!feof(archi))
      {
      	if(articulos.codigo == artiCodi)
         {
         	clrscr();
 
            gotoxy(87,5);
            cout<<"Estado";
         	imprimirOpciones();
            gotoxy(3,7);
   			cout<<articulos.codigo;
   			gotoxy(12,7);
   			cout<<articulos.nombre;
   			gotoxy(34,7);
   			cout<<articulos.precio;
   			gotoxy(42,7);
   			cout<<articulos.costo;
   			gotoxy(49,7);
   			cout<<articulos.esta;
   			gotoxy(70,7);
   			cout<<articulos.existencia;
         	gotoxy(87,7);
         	cout<<articulos.estado;
            gotoxy(10,10);
            cout<<"Articulos encontrado exitosamente.";
            gotoxy(10,12);
            cout<<"Presione cualquier tecla para continuar...";
            getch();
            fclose(archi);
            break;
         }
         fread(&articulos, sizeof(articulos), 1, archi);
      }
      if(articulos.codigo != artiCodi)
      {
      	gotoxy(10,10);
         cout<<"Articulo no existente";
         gotoxy(10,13);
         cout<<"Presione cualquier tecla para continuar...";
         getch();
         fclose(archi);
      }
   }
}
 
//------------------------------------------Reporte--------------------------------------------------//
 
void reporte()
{
	FILE *archi;
	archi = fopen(solu, "r");
	clrscr();
   int i = 1;
   if(archi == NULL)
   {
   	gotoxy(10,5);
      cout<<"Archivo dañado o no existe.";
      gotoxy(10,7);
      cout<<"Presione cualquier tecla para continuar...";
   }
   else
   {
   	imprimirOpciones();
      gotoxy(85,5);
      cout<<"Estado";
      fread(&articulos, sizeof(articulos), 1, archi);
      while(!feof(archi))
      {
      	gotoxy(3,5+i);
   		cout<<articulos.codigo;
   		gotoxy(12,5+i);
   		cout<<articulos.nombre;
   		gotoxy(34,5+i);
   		cout<<articulos.precio;
   		gotoxy(42,5+i);
   		cout<<articulos.costo;
   		gotoxy(49,5+i);
   		cout<<articulos.esta;
   		gotoxy(70,5+i);
   		cout<<articulos.existencia;
         gotoxy(87,5+i);
         cout<<articulos.estado;
         i++;
         fread(&articulos, sizeof(articulos),1,archi);
      }
      gotoxy(10,5+(i+5));
      cout<<"Presiona cualquier tecla para continuar...";
      getch();
      fclose(archi);
   }
 
}
 
void ingresosE()
{
	FILE *archi;
	archi = fopen(solu, "rb+");
	clrscr();
   int artiCodi, exis=0;
   char op= '\0';
   gotoxy(5,5);
   cout<<"======= Ingresos de existencias =======";
   if(archi == NULL)
   {
   	gotoxy(10,7);
      cout<<"Archivo dañado o no existe.";
      gotoxy(10,9);
      cout<<"Presione cualquier tecla para continuar...";
      getch();
      fclose(archi);
      return;
   }
   gotoxy(10,7);
   cout<<"Ingrese codigo del articulo: ";
   cin>>artiCodi;
 
   //--------------------------------------------Operaciones binarias-----------------------------------//
   fseek(archi,0,SEEK_SET);  //Cursor al inicio del archivo
   fread(&articulos, sizeof(articulos),1,archi);
 
   //------------------------------------Leer registro-------------------------------------//
   while(!feof(archi))
   {
	   if(articulos.codigo == artiCodi)
		{
			//-------------------------------------------------Modificar registro ------------------------------------------//
			gotoxy(10,9);
			cout<<"Codigo: "<<articulos.codigo;
			gotoxy(10,10);
			cout<<"Nombre: "<<articulos.nombre;
			gotoxy(10,11);
			cout<<"Existencias: "<<articulos.existencia;
 
			gotoxy(10,13);
			cout<<"Cuantas existencias desea eliminar: ";
			cin>>exis;
 
			//---------------------- Pregunta -------------------------//
			while(op != 's' && op != 'n')
			{
			gotoxy(10,15);
			cout<<"Esta seguro que desea quitarlas [s/n] : ";
			cin>>op;
			}
				//------------------ Termina pregunta ---------------------//
 
				//-------------------------------- Condicion de la variable op tipo char ----------------------------------//
 
				//------------------------------------ Agregar existencias ------------------------------------------------//
				if(op == 's')
				{
					articulos.existencia += exis;
					gotoxy(10,17);
					cout<<"Existencias despues de la modificacion: "<<articulos.existencia;
					fseek(archi, ftell(archi) - sizeof(articulos),SEEK_SET);
					fwrite(&articulos, sizeof(struct arti),1,archi);
 
					gotoxy(10,19);
					cout<<"Presione cualquier tecla para continuar...";
					getch();
					fclose(archi);
					return;
			}
			else
			if(op == 'n')
			{
				fclose(archi);
				return;
			}
 
			//---------------------------------- Termina condicion ------------------------------------------------//
		}
	   fread(&articulos, sizeof(articulos),1,archi);
   }
   if(artiCodi != articulos.codigo)
   {
		gotoxy(10,11);
		cout<<"Codigo no existente.";
		gotoxy(10,13);
		cout<<"Presione cualquier tecla para continuar...";
		getch();
		fclose(archi);
		return;
   }
}
 
//-------------------------------------------Egresos o rebajas de existencias---------------------------------------//
 
void egresosE()
{
	FILE *archi;
	archi = fopen(solu, "rb+");
	clrscr();
   int artiCodi, exis=0;
   char op= '\0';
   gotoxy(5,5);
   cout<<"======= Egresos de existencias =======";
   if(archi == NULL)
   {
   	gotoxy(10,7);
      cout<<"Archivo dañado o no existe.";
      gotoxy(10,9);
      cout<<"Presione cualquier tecla para continuar...";
      getch();
      fclose(archi);
      return;
   }
   gotoxy(10,7);
   cout<<"Ingrese codigo del articulo: ";
   cin>>artiCodi;
 
   //--------------------------------------------Operaciones binarias-----------------------------------//
   fseek(archi,0,SEEK_SET);  //Cursor al inicio del archivo
   fread(&articulos, sizeof(articulos),1,archi);
 
   //------------------------------------Leer registro-------------------------------------//
   while(!feof(archi))
   {
	   if(articulos.codigo == artiCodi)
		{
			//-------------------------------------------------Modificar registro ------------------------------------------//
			gotoxy(10,9);
			cout<<"Codigo: "<<articulos.codigo;
			gotoxy(10,10);
			cout<<"Nombre: "<<articulos.nombre;
			gotoxy(10,11);
			cout<<"Existencias: "<<articulos.existencia;
 
			gotoxy(10,13);
			cout<<"Cuantas existencias desea eliminar: ";
			cin>>exis;
 
			//---------------------- Pregunta -------------------------//
			while(op != 's' && op != 'n')
			{
			gotoxy(10,15);
			cout<<"Esta seguro que desea quitarlas [s/n] : ";
			cin>>op;
			}
				//------------------ Termina pregunta ---------------------//
 
				//-------------------------------- Condicion de la variable op tipo char ----------------------------------//
 
				//------------------------------------ Quitar existencias ------------------------------------------------//
				if(op == 's')
				{
					if(exis > articulos.existencia)
					{
						gotoxy(10,17);
						cout<<"Introdujo un numero mayor a las existencias.";
						gotoxy(10,19);
						cout<<"Presione cualquier tecla para continuar...";
						getch();
						fclose(archi);
						return;
					}
					articulos.existencia -= exis;
					gotoxy(10,17);
					cout<<"Existencias despues de la modificacion: "<<articulos.existencia;
					fseek(archi, ftell(archi) - sizeof(articulos),SEEK_SET);
					fwrite(&articulos, sizeof(struct arti),1,archi);
 
				gotoxy(10,19);
				cout<<"Presione cualquier tecla para continuar...";
				getch();
				fclose(archi);
				return;
			}
			else
			if(op == 'n')
			{
				fclose(archi);
				return;
			}
 
			//---------------------------------- Termina condicion ------------------------------------------------//
		}
	   fread(&articulos, sizeof(articulos),1,archi);
   }
   if(artiCodi != articulos.codigo)
   {
		gotoxy(10,11);
		cout<<"Codigo no existente.";
		gotoxy(10,13);
		cout<<"Presione cualquier tecla para continuar...";
		getch();
		fclose(archi);
		return;
   }
}
 
 
void compras()
{
   char op;
   //------------------------------------------Menu principal-----------------------------------------------
   do
   {
   	clrscr();
   	gotoxy(5,5);
   	cout<<"====== Existencias ======";
   	gotoxy(10,9);
   	cout<<"1. Ingreso existencia";
   	gotoxy(10,10);
   	cout<<"2. Egreso existencia";
   	gotoxy(10,13);
   	cout<<"Regresar al menu principal (r)";
   	gotoxy(10,14);
   	cout<<"Elija un opcion >> ";
   	cin>>op;
 
   	switch(op)
   	{
   		case '1':
      	{
      		ingresosE();
         	break;
      	}
         case '2':
         {
         	egresosE();
            break;
         }
   	}
   }
   while(op != 'r');
}
 
void imprimirOpciones()
{
   clrscr();
   gotoxy(3,5);
   cout<<"Codigo";
   gotoxy(12,5);
   cout<<"Nombre del producto";
   gotoxy(34,5);
   cout<<"Precio";
   gotoxy(42,5);
   cout<<"Costo";
   gotoxy(49,5);
   cout<<"Estado [s/n]";
   gotoxy(70,5);
   cout<<"Existencia";
}
 
void inventario()
{
	char op = '\0';
   do
   {
   	clrscr();
      gotoxy(5,3);
      cout<<"------------Inventario------------";
      gotoxy(10,5);
      cout<<"1. Ingresar articulo";
      gotoxy(10,6);
      cout<<"2. Dar de baja un articulo";
      gotoxy(10,7);
      cout<<"Regresar al menu principal (r)";
      gotoxy(10,8);
      cout<<"Elija una opcion >> ";
      cin>>op;
 
      switch(op)
      {
      	case '1':
         {
         	ingresarArticulo();
            break;
         }
         case '2':
         {
         	bajaArticulo();
            break;
         }
      }
   }
   while(op != 'r');
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con modificación de archivos en C++

Publicado por Allan (6 intervenciones) el 26/04/2017 02:57:08
y aquí continua el código para que otro que quieran algo puedan ver el código porque no me deja poner mas de 15,000 lineas la LWP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
void ingresarArticulo()
{
	FILE *archi;
	archi = fopen(solu, "rb");
	long int dirFisica=0;
	int artiCodi = 0;
	clrscr();
   crearVerifica();
   if(verificarArchivo == 0)
   {
   	gotoxy(10,5);
      cout<<"Fallo de sistema o archivo dañado...";
      getch();
   }
   else
   if(verificarArchivo == 1)
   {
   	volverIngresar:              //--------------Etiqueta para volver a ingresar------------------//
      {
   	imprimirOpciones();
      //-----------------------------------Ingresar articulos----------------------------------------//
      	gotoxy(3,7);
      	cin>>artiCodi;
      	dirFisica = articulos.codigo * sizeof(articulos);
      	fseek(archi, dirFisica, SEEK_SET);
      	fread(&articulos, sizeof(struct arti), 1, archi);
      }
      if(artiCodi == 1000)
      {
      	return;
      }
      else
      if(articulos.codigo == artiCodi)
      {
      	gotoxy(10,20);
         cout<<"Codigo ya ingresado, vuelva a ingresar, si desea cancelar escriba == 1000 ==";
         getch();
         goto volverIngresar;
      }
      else
      {
		  fclose(archi);
		  archi = fopen(solu, "ab");
      	gotoxy(12,7);
      	cin>>articulos.nombre;
      	gotoxy(34,7);
      	cin>>articulos.precio;
      	gotoxy(42,7);
      	cin>>articulos.costo;
         while(articulos.esta != 's' && articulos.esta != 'n')
         {
      		gotoxy(49,7);
      		cin>>articulos.esta;
            if(articulos.esta == 's')
            {
            	articulos.estado = 1;
            }
            else
            if(articulos.esta == 'n')
            {
            	articulos.estado = 0;
            }
         }
         gotoxy(70,7);
         cin>>articulos.existencia;
         articulos.codigo = artiCodi;
         fseek(archi, dirFisica, SEEK_SET);
         fwrite(&articulos,sizeof(struct arti),1,archi);
         fclose(archi);
         gotoxy(10,15);
         cout<<"Producto registrado exitosamente...";
         gotoxy(10,20);
         cout<<"Oprima cualquier tecla para continuar";
         getch();
         return;
      }
   }
}
 
void bajaArticulo()
{
	FILE *archi;
	FILE *temp;
	archi = fopen(solu, "rb");
	temp = fopen(archiTemp, "wb+");
	long int dirFisica=0;
	int artiCodi = 0;
   char pregunta = '\0';
   clrscr();
 
   gotoxy(10,3);
   cout<<"======= Eliminacion de un articulo =======";
 
   if(archi == NULL || temp == NULL)
   {
   	gotoxy(10,5);
      cout<<"Archivo dañado o no existe";
      gotoxy(10,15);
      cout<<"Presione cualquier tecla para continuar...";
      getch();
      return;
   }
   else
   {
   	gotoxy(10,5);
      cout<<"Ingrese el codigo del producto a eliminar >>> ";
      cin>>artiCodi;
      while(pregunta != 's' && pregunta != 'n')
      {
      	gotoxy(10,7);
      	cout<<"Esta seguro que desea eliminarlo [s/n] >>> ";
      	cin>>pregunta;
      }
 
      //------------------------Eliminar registro------------------------------//
      if(pregunta == 'n')
      {
      	fclose(archi);
      	fclose(temp);
 
      	remove(archiTemp);
 
      	return;
      }
      else
      if(pregunta == 's')
      {
      	//-----------------------------Verificar si el registro existe---------------------------------//
		fseek(archi, 0, SEEK_SET);
      	fread(&articulos, sizeof(articulos), 1, archi);
      	while(!feof(archi))
		{
			if(artiCodi == articulos.codigo)
			{
				gotoxy(10,9);
				cout<<"Codigo: "<<articulos.codigo;
				gotoxy(10,10);
				cout<<"Nombre: "<<articulos.nombre;
				gotoxy(10,11);
				cout<<"Precio: "<<articulos.precio;
				gotoxy(10,12);
				cout<<"Existencias: "<<articulos.existencia;
 
				fseek(archi, 0, SEEK_SET);
				fseek(temp,0, SEEK_SET);
      			fread(&articulos, sizeof(articulos), 1, archi);
				while(!feof(archi))
				{
					if(articulos.codigo != artiCodi)
					{
						fwrite(&articulos, sizeof(articulos),1, temp);
					}
					fread(&articulos, sizeof(articulos),1,archi);
				}
				fclose(archi);
				fclose(temp);
				remove(solu);
				rename(archiTemp, solu);
				gotoxy(10,14);
				cout<<"Registro eliminado exitosamente.";
				gotoxy(10,15);
				cout<<"Presione cualquier tecla para continuar...";
				getch();
				return;
			}
			fread(&articulos, sizeof(articulos), 1, archi);
		}
		if(artiCodi != articulos.codigo)
		{
			gotoxy(10,9);
			cout<<"Codigo no existente.";
			gotoxy(10,11);
			cout<<"Presione cualquier tecla para continuar...";
			getch();
			fclose(archi);
			fclose(temp);
			remove(archiTemp);
			return;
		}
      }
   }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar