¿Cuál es la diferencia entre estos bloques de código? Traté de buscar "wb" pero no lo veo en ningún lado. El archivo que contiene "wb" es de uno de mis tutores

FILE *f = fopen(DB_FILE_NAME, "wb");
    if (f == NULL) {
        printf("Write error\n");
    } else {
        /* write n_students elements of the studentlist array */
        fwrite(studentlist, sizeof(student_t), n_students, f);
        fclose(f);
    }  

Y

FILE *f = fopen(DB_FILE_NAME, "w");
    if (f == NULL) {
        printf("Write error\n");
    } else {
        /* write n_students elements of the studentlist array */
        fwrite(studentlist, sizeof(student_t), n_students, f);
        fclose(f);
    }
9
Anh Minh Tran 4 may. 2017 a las 11:41

3 respuestas

La mejor respuesta

Absolutamente cualquier referencia en la función fopen() te habría dicho esto. Por ejemplo, la página del manual, que es la documentación común utilizada en entornos similares a Unix:

La cadena de modo también puede incluir la letra 'b' como último carácter o como un carácter entre los caracteres en cualquiera de las cadenas de dos caracteres descritas anteriormente. Esto es estrictamente por compatibilidad con C89 y no tiene ningún efecto; la 'b' se ignora en todos los sistemas conformes POSIX, incluido Linux. (Otros sistemas pueden tratar los archivos de texto y los archivos binarios de manera diferente, y agregar la 'b' puede ser una buena idea si realiza E / S a un archivo binario y espera que su programa pueda ser portado a entornos que no sean UNIX).

Por lo tanto, significa b inary y es útil para indicar que tiene la intención de tratar el contenido del archivo como si no fuera texto.

Para su código, el acceso binario parece correcto. Sin embargo, escribir directamente los valores sin procesar struct generalmente es una muy mala idea, ya que no conoce el formato interno exacto utilizado por el compilador y puede cambiar inesperadamente. Para los archivos que deberían compartirse y / o acceder "más tarde", esta no es la forma correcta de hacerlo en C. Examine la serialización.

8
unwind 4 may. 2017 a las 08:43

La especificación de "b" en el modo de acceso evita que (algunas implementaciones de) la biblioteca estándar traduzca algunos caracteres al leer / escribir en el archivo.

La traducción más común es para el final de la línea: \n se traduce a \r\n en Windows.

8
pmg 4 may. 2017 a las 08:50

En documentación de fopen:

Con los especificadores de modo anteriores, el archivo se abre como un archivo de texto. Para abrir un archivo como archivo binario, se debe incluir un carácter "b" en la cadena de modo. Este carácter adicional "b" se puede agregar al final de la cadena (haciendo así los siguientes modos compuestos: "rb", "wb", "ab", "r + b", "w + b", "a + b ") o se inserta entre la letra y el signo" + "para los modos mixtos (" rb + "," wb + "," ab + ").

3
Badda 4 may. 2017 a las 08:44