Estoy tratando de leer un archivo en un buffer en bloques de tamaño BLOCK_SIZE (actualmente igual a 1000 unsigned chars). Mi código inicialmente se encuentra el número de bloques que se tiene que leer para leer todo el archivo (generalmente 2-4), luego itera a través de un bucle para leer el archivo (ignorar el «+17+filenamesize» cosas, que es todo lo necesario para que más adelante en el programa.

Sin embargo, sólo en el primer tiempo, cuando j=1, que es lo que realmente poner datos en el buf matriz. En otros casos, cuando j != 1, strlen(buf) devuelve 0.

Creo que el problema es con el uso de fseek() a buscar a la segunda parte de un archivo antes de la lectura o de un problema de asignación de memoria.

Se agradece cualquier ayuda para llegar a leer el 1000-1999th caracteres del archivo en el buf matriz.

Se adjunta a la parte pertinente del código:

unsigned char *buf;
source = fopen(localpath,"r");
temp = filesize / BLOCK_SIZE + 1;

for (j=1; j <= temp; j++) {
  if (j == 1) {
     buf = (unsigned char *) malloc((sizeof(unsigned char)) * (BLOCK_SIZE + 17 + filenamesize));
     fread(buf+17+filenamesize, sizeof(unsigned char), BLOCK_SIZE, source);
   } else if (j == temp) {
     buf = (unsigned char *) malloc((sizeof(unsigned char)) * (filesize + 5 - BLOCK_SIZE*(j-1)));
     fseek(source, BLOCK_SIZE*(j-1), SEEK_SET); //off by one warning
     fread(buf+5, sizeof(unsigned char), filesize - BLOCK_SIZE*(j-1), source);
   } else {
     buf = (unsigned char *) malloc((sizeof(unsigned char)) * (5+BLOCK_SIZE*(j-1)));
     fseek(source, BLOCK_SIZE*(j-1), SEEK_SET); //off by one warning
     fread(buf+5, sizeof(unsigned char), BLOCK_SIZE, source);
   }
   //do stuff with buf here

   buf = "";
   free(buf);
}
  • Es el archivo binario o ASCII?
  • Por cierto, ¿hay realmente NINGUNA razón de utilizar el fseek? Su código actual sólo podría habilidad todos los el fseek por completo y vivir más feliz.
  • El archivo ASCII. Tienes razón, probablemente no es necesario utilizar el fseek. fread sólo deja el puntero de archivo donde se dejó de leer, ¿verdad?
  • Williams: Sí.
  • Genial, gracias. Me he quitado esos y funciona muy bien.
  • Todos los archivos son archivos binarios.

InformationsquelleAutor | 2009-07-24

4 Comentarios

  1. 3

    Yo recomendaría la comprobación de los resultados de el fseek y fread. En particular, asegúrese de que el fseek se devuelve 0 si no lo es, este puede ser el problema en su conjunto.

    Siempre que el fseek está teniendo éxito, fread debe decir el número total de bytes leídos.

    También, strlen no es necesariamente válido para usar, ya que se va a asumir que esto es una cadena terminada en null. Si el primer carácter que leer es una de 0 bytes, strlen devolverá 0. Usted no está tratando esto como una cadena terminada en null (no asignar suficiente espacio para el terminador nulo – exactamente lo que se necesita para adaptarse a sus datos binarios), por lo que la función strlen es probablemente inadecuado.

    • Gracias, ese es el problema, que la cadena comenzó con caracteres nulos. Que ha sido corregido, y también me hizo terminada en null, y ahora se está trabajando muy bien!
  2. 2

    La línea buf = ""; parece un error para mí. De esta forma se establecerá el puntero buf a una constante de cadena que se trate también de free() en la línea siguiente. Me acaba de saltar esta línea.

    También parecen leer el búfer con algunas compensaciones. ie +5 en los dos casos posteriores. La primera parte en el búfer luego ser indefinido, consulte la página man de malloc. Así que un strlen(buf) siente indefinido para mí.

    • Así que hay una fuga, después de todo. Sólo el «» de la cadena es liberado. Creo que puede bloquearse.
    • Gracias por señalar que la fuga — he fijado ahora.
  3. 1

    ¿Por qué usas el fseek a todos? La noción de «lo primero es comprobar lo grande que es el archivo para determinar cuántas veces al leer un bloque» es fundamentalmente errónea. Usted simplemente debe leer los datos hasta que no hay más datos a la izquierda, por ejemplo:

    mientras( BLOCK_SIZE == ( read_count = fread( buf, sizeof *buf, count, fuente )) 
    do_stuff_with_buf( buf, read_count ); 
    
    if( ferror( fuente )) 
    /* Identificador de error */; 
    

    (En este ejemplo se va a llamar nunca do_stuff_with_buf() en una lectura corta, pero que es un trivial de modificación.)

  4. 0

    srtlen devuelve la longitud de una cadena (número de bytes antes de la primera de 0 bytes). Si buf[0] 0 que se devuelve 0. Utilizar el valor de retorno de la fread para determinar cuántos bytes se llegó a leer.

    También tienen pérdida de memoria. Usted malloc en cada iteración del bucle, pero sólo una vez al final.

    • Él llama libre dentro del bucle – eso no es su problema….
    • Estás en lo correcto. No hay ninguna fuga.
    • Hay una fuga – se asigna buf estático puntero («») y, a continuación, intenta liberar() es. Que no debería estar trabajando en el primer lugar.

Dejar respuesta

Please enter your comment!
Please enter your name here