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

Fallo segmentacion con fread

Estas en el tema de Fallo segmentacion con fread en el foro de C/C++ en Foros del Web. Buenas, ¿sabéis por qué me da un fallo segmentación con la función fread? Código: #include <stdio.h> int main() { FILE *fichero1; char buffer[255]; fichero1=fopen("hola.txt", "r"); ...
  #1 (permalink)  
Antiguo 23/10/2010, 11:34
Avatar de mikeW  
Fecha de Ingreso: octubre-2010
Mensajes: 6
Antigüedad: 13 años, 6 meses
Puntos: 1
Fallo segmentacion con fread

Buenas, ¿sabéis por qué me da un fallo segmentación con la función fread?

Código:
#include <stdio.h>
int main() {

    FILE *fichero1;
    char buffer[255];

    fichero1=fopen("hola.txt", "r");
    
    while(feof(fichero1)==0) {
        fread(&buffer, sizeof(buffer), 1, fichero1);
    }
    fclose(fichero1);
}
Uso GCC como compilador y linux
  #2 (permalink)  
Antiguo 23/10/2010, 16:44
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Fallo segmentacion con fread

Acabo de probar el codigo. Con el archivo creado no falla. Pero si borras el archivo si falla. Comproba que el archivo este exista. Por cuando abris un archivo en modo lectura que no existe, es no es creado, asi que la variable fichero1 no esta seteada correctamente.
  #3 (permalink)  
Antiguo 25/10/2010, 01:57
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: Fallo segmentacion con fread

Ese fallo de segmentación tiene dos posibles causas:

1.- Como te dice sam90, si el archivo no existe el programa fallará. Comprueba el valor de tu variable fichero nada más abrir el archivo, si vale NULL es que ha fallado la operación de apertura, y cualquier intento de operar con ese archivo te puede provocar ese error de segmentación. Deberías poner algo así como

Código C++:
Ver original
  1. fichero = fopen(....);
  2. if (fichero == NULL)
  3. {
  4. // Tratar el fallo en la apertura
  5. }
  6. else
  7. {
  8. // Hacer el tratamiento del fichero
  9. }

2.- Cuando llamas a fread, estás pasando la dirección de la variable buffer:

fread(&buffer,....);

Ten en cuenta que buffer ya ha sido declarada como array, con lo que el nombre del array es un puntero al primer elemento. La llamada deberá ser:

fread(buffer, ...);

Si el archivo ya existía, ésta es la causa más probable del error.

Un par de comentarios adicionales:

1.- Tal como has puesto la apertura del fichero, ésta se va a hacer en modo secuencial (texto), pero luego utilizas fread, que es para acceso directo (binario).Si vas a leerlo en modo texto, utiliza fscanf, fgets, etc, o ábrelo con "rb" si vas a leerlo en modo binario.

2.- La marca de final de fichero (código ASCII 26) no tiene sentido cuando lees un fichero en modo binario, ya que puedes tener un byte con ese valor que no tenga nada que ver con el final de fichero. Lo digo porque el bucle de lectura del fichero lo controlas con la marca de fin de fichero, como secuencial (que es como lo has abierto), pero luego lo estás leyendo como binario (con fread), así no detectará el final de fichero y puede entrar un bucle infinito.

Etiquetas: fallo
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 20:50.