Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/02/2016, 08:18
Anarchy
 
Fecha de Ingreso: febrero-2016
Mensajes: 1
Antigüedad: 8 años, 10 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