¿Alguien tiene un ejemplo de código que se puede escribir en un archivo binario. Y también de código que puede leer un archivo binario y salida a la pantalla. Buscando ejemplos que puedo escribir en un archivo de aceptar, Pero cuando trato de leer un archivo que no está enviando correctamente.

  • Puedes mostrar el código?
  • El internet tiene un montón de ejemplos. ¿Cómo está la salida de los datos? Quizás lo que está mal.
  • Usted necesita mostrar su código porque de la manera FILE* obras. Su uso asuntos. Preguntas en busca de depuración de ayuda («¿por qué no esta el código de trabajo?») debe incluir el comportamiento deseado, de un problema específico o de error y el menor código necesario para reproducir en la propia pregunta. Preguntas sin una clara declaración del problema no son útiles para otros lectores. Ver: Cómo crear un Mínimo, Completa y Verificable ejemplo.
InformationsquelleAutor user1257114 | 2013-07-11

2 Comentarios

  1. 82

    La lectura y escritura de archivos binarios es prácticamente el mismo que el de cualquier otro archivo, la única diferencia es la forma de abrirlo:

    unsigned char buffer[10];
    FILE *ptr;
    
    ptr = fopen("test.bin","rb");  //r for read, b for binary
    
    fread(buffer,sizeof(buffer),1,ptr); //read 10 bytes to our buffer

    Usted dijo que usted puede leer, pero no sale correctamente… ten en cuenta que cuando «salida» de este tipo de datos, no eres la lectura ASCII, así que no es como la impresión de una cadena en la pantalla:

    for(int i = 0; i<10; i++)
        printf("%u ", buffer[i]); //prints a series of bytes

    Escrito a un archivo es prácticamente el mismo, con la excepción de que usted está usando fwrite() en lugar de fread():

    FILE *write_ptr;
    
    write_ptr = fopen("test.bin","wb");  //w for write, b for binary
    
    fwrite(buffer,sizeof(buffer),1,write_ptr); //write 10 bytes from our buffer

    Ya que estamos hablando de Linux.. hay una manera fácil de hacer una comprobación de validez. Instalar hexdump en su sistema (si no está ya allí) y un volcado de archivo:

    [email protected]-VirtualBox:~/C$ hexdump test.bin
    0000000 457f 464c 0102 0001 0000 0000 0000 0000
    0000010 0001 003e 0001 0000 0000 0000 0000 0000
    ...

    Ahora compara eso a su salida:

    [email protected]-VirtualBox:~/C$ ./a.out 
    127 69 76 70 2 1 1 0 0 0

    hmm, tal vez cambiar el printf a un %x para hacer esto un poco más claro:

    [email protected]-VirtualBox:~/C$ ./a.out 
    7F 45 4C 46 2 1 1 0 0 0

    Hola, mira! Coincide con los datos hasta ahora*. Impresionante, se debe leer el archivo binario correctamente!

    *Nota: los bytes son sólo cambió en la salida, pero que los datos son correctos, usted puede ajustar para este tipo de cosas

    • sé que es viejo, pero hay algunas preguntas que tengo que hacer: «// escribir 10 bytes a nuestro buffer» significa que guarda lo que hay en el buffer del archivo?
    • Sí, debería haber dicho «de» para hacer esto más claro; me he fijado que ahora. En ese ejemplo, estoy asumiendo que «buffer» existe, y se rellena con algunos datos y que va a ser escrito a «de la prueba.bin», como señala write_ptr. Si ejecuta que usted podría entonces «hexdump» de la prueba.archivo bin y ver los bytes en ella.
    • Tenga en cuenta que en Linux (y en sistemas basados en Unix en general), la b bandera es «opcional» — no existe distinción entre un archivo binario y un archivo de texto en dichos sistemas. La diferencia asuntos intensamente en Windows, aunque. Si el código tiene pretensiones de la portabilidad, agregar el b cuando uno va a tratar el archivo como un archivo binario.
    • No olvides fclose(ptr);!
  2. 0

    Estoy muy feliz con mi «hacer un débil pin de almacenamiento de programa» de la solución. Tal vez pueda ayudar a personas que necesitan de una forma muy sencilla de archivo binario IO ejemplo a seguir.

    $ ls
    WeakPin  my_pin_code.pin  weak_pin.c
    $ ./WeakPin
    Pin: 45 47 49 32
    $ ./WeakPin 8 2
    $ Need 4 ints to write a new pin!
    $./WeakPin 8 2 99 49
    Pin saved.
    $ ./WeakPin
    Pin: 8 2 99 49
    $
    $ cat weak_pin.c
    //a program to save and read 4-digit pin codes in binary format
    #include <stdio.h>
    #include <stdlib.h>
    #define PIN_FILE "my_pin_code.pin"
    typedef struct { unsigned short a, b, c, d; } PinCode;
    int main(int argc, const char** argv)
    {
    if (argc > 1)  //create pin
    {
    if (argc != 5)
    {
    printf("Need 4 ints to write a new pin!\n");
    return -1;
    }
    unsigned short _a = atoi(argv[1]);
    unsigned short _b = atoi(argv[2]);
    unsigned short _c = atoi(argv[3]);
    unsigned short _d = atoi(argv[4]);
    PinCode pc;
    pc.a = _a; pc.b = _b; pc.c = _c; pc.d = _d;
    FILE *f = fopen(PIN_FILE, "wb");  //create and/or overwrite
    if (!f)
    {
    printf("Error in creating file. Aborting.\n");
    return -2;
    }
    //write one PinCode object pc to the file *f
    fwrite(&pc, sizeof(PinCode), 1, f);  
    fclose(f);
    printf("Pin saved.\n");
    return 0;
    }
    //else read existing pin
    FILE *f = fopen(PIN_FILE, "rb");
    if (!f)
    {
    printf("Error in reading file. Abort.\n");
    return -3;
    }
    PinCode pc;
    fread(&pc, sizeof(PinCode), 1, f);
    fclose(f);
    printf("Pin: ");
    printf("%hu ", pc.a);
    printf("%hu ", pc.b);
    printf("%hu ", pc.c);
    printf("%hu\n", pc.d);
    return 0;
    }
    $

Dejar respuesta

Please enter your comment!
Please enter your name here