Me pregunto si esta es la mejor manera de ir sobre la solución de mi problema.

Conozco los valores particulares de desplazamientos de un archivo binario en el que la información que yo quiero es celebrado…Lo que quiero hacer es saltar a los desplazamientos y, a continuación, leer una cierta cantidad de bytes, a partir de esa ubicación.

Después de usar google, he llegado a la conclusión de que mi mejor opción es usar el fseek() para desplazarse hasta la posición del desplazamiento y, a continuación, utilizar fread() para leer una cantidad de bytes a partir de esa posición.

Żestoy en lo cierto al pensar esto? Y si es así, ¿cómo es la mejor manera de hacerlo? es decir, cómo incorporar a los dos juntos.

Si no estoy correcto, lo que sugeriría yo en su lugar?

Muchas gracias de antemano por su ayuda.

Matt

Editar:

He seguido un tutorial sobre fread() y se ajustan a la siguiente:

    `#include <stdio.h>
    int main()
    {
      FILE *f;
      char buffer[11];
      if (f = fopen("comm_array2.img", "rt"))
      {
        fread(buffer, 1, 10, f);
        buffer[10] = 0;
        fclose(f);
        printf("first 10 characters of the file:\n%s\n", buffer);
      }
      return 0;
    }`

Así que he usado el archivo ‘comm_array2.img’ y leer los 10 primeros caracteres del archivo.

Pero por lo que puedo entender de la misma, esto va desde el inicio-de-archivo, yo quiero ir a partir de algunos-lugar-en-archivo (offset)

Se esta haciendo más sentido?

Edición Número 2:

Parece que yo estaba siendo un poco tenue, y todo lo que se necesita (parece de mi intento) es la de poner el fseek() antes de la fread() que tengo en el código anterior, y se busca que la ubicación y, a continuación, lee a partir de ahí.

Sí. Utilizar el fseek() y fread(). Qué código has intentado?
Sí, tienes razón, pero ¿cuál es su pregunta o problema?
Hay tutoriales en la web que muestran cómo usarlos. Utilizando los términos de búsqueda «el fseek fread C tutorial», debe ser sencillo encontrar algunos. Usted ha trabajado a través de cualquiera?
Buscar el pread() llamada al sistema. Emular es a través de secuencias en lugar de descriptores de archivo. Tal vez usted mismo escribe una función, tales como: ssize_t fpread(char *buffer, size_t nbytes, size_t offset, FILE *fp);.
Si la plataforma lo admite, puede utilizar pread() lugar, lo que hace que ambas operaciones a la vez.

OriginalEl autor user1291631 | 2012-03-25

3 Comentarios

  1. 2

    Si usted está utilizando secuencias de archivo en lugar de descriptores de archivo, entonces usted puede escribir un (simple) función análoga a la de POSIX pread() llamada al sistema.

    Puede emular fácilmente es a través de secuencias en lugar de descriptores de archivo1. Tal vez debería escribir una función como esta (que tiene una ligeramente diferente de la interfaz desde la que he sugerido en un comentario):

    size_t fpread(void *buffer, size_t size, size_t mitems, size_t offset, FILE *fp)
    {
         if (fseek(fp, offset, SEEK_SET) != 0)
             return 0;
         return fread(buffer, size, nitems, fp);
    }

    Este es un compromiso razonable entre los convenios de pread() y fread().


    ¿Cómo sería la sintaxis de la llamada a la función? Por ejemplo, la lectura de la compensación 732 y, a continuación, de nuevo desde el offset 432 (ambos desde el comienzo del archivo) y filestream llamado f.

    Ya que no dijo cuántos bytes a leer, voy a asumir el 100 cada momento. Estoy suponiendo que las variables objetivo (buffers) son buffer1 y buffer2, y que ambos son lo suficientemente grandes.

    if (fpread(buffer1, 100, 1, 732, f) != 1)
        ...error reading at offset 732...
    if (fpread(buffer2, 100, 1, 432, f) != 1)
        ...error reading at offset 432...

    El retorno count es el número de unidades completas de 100 bytes cada uno; 1 (tiene todo) o 0 (algo salió mal).

    Hay otras maneras de escribir ese código:

    if (fpread(buffer1, sizeof(char), 100, 732, f) != 100)
        ...error reading at offset 732...
    if (fpread(buffer2, sizeof(char), 100, 432, f) != 100)
        ...error reading at offset 432...

    Esto lee 100 bytes solo a cada momento; la prueba se asegura de que tiene todos 100 de ellos, como se esperaba. Si se captura el valor de retorno en este segundo ejemplo, se puede saber la cantidad de datos que usted recibió. Sería muy sorprendente si la primera lectura correcta y la segunda no; algún otro programa (o hilo) habría tenido que truncar el archivo entre las dos llamadas a fpread(), pero más divertido de las cosas han sido conocidos a suceder.


    1 La emulación de no ser perfecto; la pread() llamada garantiza la atomicidad de que la combinación de fseek() y fread() no va a proporcionar. Pero que rara vez un problema en la práctica, a menos que haya varios procesos o subprocesos simultáneamente actualizar el archivo, mientras que usted está tratando de posición y leer de ella.

    Gracias por esto, yo estaba a punto de pedirle que vaya a su comentario un poco más y se me adelantó, así que gracias. Así que si yo soy la comprensión de este derecho, me gustaría crear esa función, y el uso de la misma fue de los que me habría utilizado originalmente pread y pasarle el nombre del archivo (en lugar de descriptor de archivo) y offset?
    Tipo de…Tu comentario menciona de nombre de archivo, pero ni fread() ni fseek() funciona con nombres de archivo; que es fopen()‘s de trabajo. El fpread() función es casi una gota en el reemplazo para el fseek() y fread() llamadas. Claramente, si usted desea que se lleve un nombre de archivo, usted tiene que fopen() y (presumiblemente) fclose() el archivo dentro de la función, y no se pasa el fp parámetro. Usted probablemente iba a poner el nombre del archivo como el primer argumento. Tendría que utilizar "rb" para abrir el archivo binario para lectura; no importa si es el b hay en Unix, pero en otras plataformas, lo hace.
    Ah, sí, mis disculpas quise decir pasar de lo que sería ‘fp’ (es decir, lo que normalmente se devuelve cuando se utiliza fopen() como yo lo entiendo) sin Embargo, a partir de tu comentario veo que no voy, de hecho, pasar el ‘fp’ parámetro?
    El código que se muestra espera que el FILE *; yo esperaría a que pase la secuencia de archivo. (Yo estaba confundido/engañado por tu primer comentario.) puede escribir una función para abrir la posición, leer, cerca de un determinado nombre de archivo y, a continuación, se pasa un nombre de archivo en lugar de una secuencia de archivo. Pero, si vas a leer más de una sección de un archivo a la vez, no lo recomiendo; fopen() es relativamente lento de la función, y debe ser llamado no más frecuencia de la necesaria. Por tanto, dada su comentario original significaba secuencia de archivo en lugar de nombre de archivo, entonces sí: se puede usar fpread() como usted quería.
    Ok, muchas gracias por su ayuda y aclaración. Una última cosa para que yo pueda entender completamente su función ha creado, ¿cómo sería la sintaxis de la llamada a la función? Por ejemplo, la lectura de la compensación 732 y, a continuación, de nuevo desde el offset 432 (ambos desde el comienzo del archivo) y filestream llamado ‘f’. Me disculpo si esto parece una pregunta fácil, pero quiero asegurarme de que entiendo de esto. Gracias de nuevo por tu tiempo, es muy apreciado.

    OriginalEl autor Jonathan Leffler

  2. 1

    Con frecuencia depende de la distancia entre las partes que te interesan. Si sólo estás saltando sobre/ignorar un par de bytes entre las partes que te interesan, es a menudo más fácil de leer los datos y de ignorar lo que se lee, sino que el uso de fseek a saltar más allá de ella. Una forma típica de hacerlo es definir una estructura que poseen tanto los datos que te interesan, y en el lugar de los titulares de las que no te interesan, leer en la estructura y, a continuación, utilizar las partes que te importa:

    struct whatever {
       long a;
       long ignore;
       short b;
    } w;
    
    fread(&w, 1, sizeof(w), some_file);
    
    //use 'w.a' and 'w.b' here.

    Si hay una gran distancia entre las piezas que importa, sin embargo, es probable que su idea original de utilizar fseek para llegar a las partes que la materia será más sencillo.

    OriginalEl autor Jerry Coffin

  3. 0

    Su teoría suena correcto. Abrir, buscar, leer, cerrar.

    Crear una estructura para los datos que desea leer y pasar un puntero a leer (a) de la estructura de la memoria asignada. Usted probablemente necesitará #pragma pack(1) o similar en la estructura para evitar la desalineación de los problemas.

    OriginalEl autor Java42

Dejar respuesta

Please enter your comment!
Please enter your name here