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

Incovenientes en Borrado Logico

Estas en el tema de Incovenientes en Borrado Logico en el foro de C/C++ en Foros del Web. Buenos dias gente. Estoy realizando una baja logica en un archivo binario de enteros y se me presenta el siguiente inconveniente, al momento de actualizar ...
  #1 (permalink)  
Antiguo 18/02/2016, 08:18
 
Fecha de Ingreso: febrero-2016
Mensajes: 1
Antigüedad: 8 años, 2 meses
Puntos: 0
Incovenientes en Borrado Logico

Buenos dias gente. Estoy realizando una baja logica en un archivo binario de enteros y se me presenta el siguiente inconveniente, al momento de actualizar el archivo (reemplazo el entero por su valor negativo, osea si tenia un dos lo actualizo a -2) el programa como que me corrompe el archivo. Puedo ver el archivo grabado con el PSPad y un plugin para transformar binarios en hexa y antes de actualizarlo esta todo ahi, cuando lo actualizo solo veo caracteres ilegibles o a veces nada. Les adjunto el codigo a ver si pueden encontrar en que estoy fallando. Estoy trabajando en Visua Studio Ultimate 2012, Windows 10. Muchas Gracia !
Código:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void grabarArch(int *resultado, char nombrneArch[]);
void mostrarArch(int *resul, char nombreArch[]);
void eliminarValorL(int *encontro, int valor, int *result, char nombreArch[]);
int main(){
	
	int valenc = 1, valor = 0, resul = 0;
	int valorBorrar = 0;
	char nombre[] = "ejercicio1.dat"; 

	grabarArch(&resul, nombre);

	puts("Valores:");

	mostrarArch(&resul, nombre);

	printf("Ingrese un valor a elimiar del archivo antes creado: ");
	scanf("%d", &valor);

	eliminarValorL(&valenc, valor, &resul, nombre); 

	if(valenc == 0){
		
		puts("Se borraron los elementos. El nuevo archivo es: \n");
		
		mostrarArch(&resul, nombre);

		if (resul == 1){

			puts("No se pudo leer el archivo");
		}//if (resul == 1)
	}else{
		puts("El valor ingresado no se encuentra en el archivo");	
	}//if(valenc == 0)

	return resul;
}
void grabarArch( int *resul, char nombreArch[]){

	int valor, i = 0;

	FILE *arch;
	arch = fopen(nombreArch,"wb");

	if(arch != NULL){

		printf("Ingrese un entero (-1 para finalizar): ");
		scanf("%d", &valor);	

		while (valor != -1){
			fwrite(&valor, sizeof(valor), 1, arch);

			printf("Ingrese un entero (-1 para finalizar): ");
			scanf("%d", &valor);
		}//while (valor != -1)		

		fclose(arch);
	}else{
		
		*resul = 1;
	}//if (arch != NULL)

}

void mostrarArch(int *resul, char nombreArch[]){

	int i = 0;
	int entero = 0;
	FILE *arch;
	arch = fopen(nombreArch,"rb");
	

	if (arch != NULL){
		
		fread(&entero, sizeof(entero),1, arch);

		while(!feof(arch)){
			if (entero >0){
				printf("%d\n", entero);	
				fread(&entero, sizeof(entero),1, arch);
			}
		}//while(!feof(arch))

		fclose(arch);
	}else{
		
		*resul = 1;
	}//if (arch != NULL)

}

void eliminarValorL(int *encontrado, int valor, int *result, char nombreArch[]){
	
	int entero;
	int datoAct;
	FILE *arch;

	
	arch = fopen(nombreArch, "rb+");
	
	if( arch == NULL){
		*result = 1;
	}else{
		
		fread(&entero, sizeof(entero), 1, arch);
		
		while(!feof(arch)){
			
			if(entero>0 && entero == valor){

				fseek(arch,-1*(int)sizeof(entero),SEEK_CUR);
				entero *= -1;
				fwrite(&entero, sizeof(entero), 1, arch);
				fseek(arch,0,SEEK_CUR);
				*encontrado = 0;
			}//if(entero>0 && entero == valor)

			fread(&entero, sizeof(entero), 1, arch);
		}//while(!feof(arch))

		fclose(arch);
	}//if( arch != NULL)
}//void eliminarValorL
  #2 (permalink)  
Antiguo 18/02/2016, 15:23
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: Incovenientes en Borrado Logico

No he mirado el código en detalle, pero, para empezar, en las funciones mostrarArch() y eliminarValor() estás utilizando feof (fin de fichero), pero los ficheros los abres en modo binario. En modo binario no se tiene en cuenta esta marca. En este post tienes la explicación:

http://www.forosdelweb.com/f96/leer-...0/#post3992738

En ficheros binarios eres tú quien tiene que controlar en qué parte del fichero estás posicionado. Si necesitas moverte adelante y atrás del fichero, mírate las funciones ftell, fseek, fgetpos, fsetpos, rewind.

Etiquetas: borrado, char, int, logico, programa, string
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 06:31.