18/02/2016, 08:18
|
| | Fecha de Ingreso: febrero-2016
Mensajes: 1
Antigüedad: 8 años, 9 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
|