Salida incorrecta al escribir en un archivo en formato binario

Estoy tratando de escribir alguna entrada de usuario en un archivo en formato binario. Cuando miro el archivo, espero ver solo 0 y 1, pero la salida del archivo se imprime en texto normal:

    FILE *f;
    char array[8];
    f = fopen("numbers.bin", "ab+");
    if(f==NULL){
        printf("Could not open file!\n");
        system("pause");
        exit(1);
        }

     for(i=0;i<numberOfInputs;i++){
         printf("\nEnter number nr %i:", i+1);
         gets(array); //get the input and place it in array
         strcat(array, "\n"); // add a newline to the input
         fwrite(array,sizeof(char),1,f); //write output to the file
}

¿Alguien es capaz de detectar lo que estoy haciendo mal aquí?

preguntado el 09 de marzo de 12 a las 14:03

¿Esperas "solo 0 y 1"? ¿Que estás tratando de hacer? ¿Debe el usuario ingresar números (enteros, para ser más precisos) y desea agregarlos en formato binario (dependiente del sistema operativo)? ¿O desea agregar las cadenas con caracteres de nueva línea agregados tal cual? -

No utilice obtiene. Si hay una línea de más de 8 caracteres en su archivo, tiene un desbordamiento de búfer. -

Por el motivo del desbordamiento del búfer, gets() se eliminó recientemente del lenguaje C, cuando se lanzó la versión actual del estándar (C11). Los programas que usan gets() no se compilarán en futuros compiladores de C. -

2 Respuestas

ya que lees la entrada como una cadena (gets), así es como se escriben los datos más adelante. necesitas usar scanf para leer los números.

int num;
scanf("%d", &num);
fwrite(&num, sizeof(int), 1, f);

respondido 09 mar '12, 14:03

Edité el código usando sus sugerencias, donde recorro la matriz y leo cada elemento con scanf, y lo escribo en el archivo. Obtengo una salida no legible, por lo que podría estar funcionando como se esperaba. Aceptaré esto como respondido cuando haya verificado el resultado :) - John Snow

Solo estás escribiendo un carácter.

Tratar...

fwrite(array,strlen(array),1,f);

Estas documentos muestre que el segundo parámetro es el tamaño del elemento a escribir, y el tercero es el número de elementos. Podrías poner estos dos al revés, o poner sizeof(char) en lugar de 1 (siempre es uno).

Tenga en cuenta que tendrá un problema aquí si el usuario ingresa una cadena de más de 6 caracteres, ya que la nueva línea y el terminador nulo también ocupan memoria.

respondido 09 mar '12, 14:03

El código anterior funcionó, pero aún se imprime en texto "normal" cuando veo el archivo con el bloc de notas: John Snow

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.