web-dev-qa-db-fra.com

La différence entre le mode d'accès aux fichiers "w" et "wb

Quelle est la différence entre ces blocs de code. J'ai essayé de rechercher "wb" mais je ne le vois nulle part. Le fichier contenant "wb" provient d'un de mes tuteurs

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);
    }  

et

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);
    }
8
Anh Minh Tran

Absolument any référence sur la fonction fopen() vous l'aurait dit. Par exemple, la page de manuel qui est la documentation courante utilisée dans les environnements de type Unix:

La chaîne de mode peut également inclure la lettre "b" en tant que dernier caractère ou en tant que caractère entre les caractères de l'une des chaînes de deux caractères décrites ci-dessus. Ceci est strictement pour la compatibilité avec C89 et n'a aucun effet; le "b" est ignoré sur tous les systèmes conformes POSIX, y compris Linux. (D'autres systèmes peuvent traiter différemment les fichiers texte et les fichiers binaires, et l'ajout du "b" peut être une bonne idée si vous effectuez des E/S dans un fichier binaire et que vous vous attendez à ce que votre programme soit porté vers des environnements non UNIX.)

Ainsi, il signifie b Inary et est utile pour indiquer que vous avez l'intention de traiter le contenu du fichier comme n'étant pas du texte.

Pour votre code, l'accès binaire semble correct. Cependant, écrire directement des valeurs brutes struct est généralement une très mauvaise idée, car vous ne connaissez pas le format interne exact utilisé par le compilateur et il peut changer de façon inattendue. Pour les fichiers qui doivent être partagés et/ou accessibles "plus tard", ce n'est pas la bonne façon de le faire dans C. Regardez dans la sérialisation.

8
unwind

En précisant "b" en mode d'accès empêche (certaines implémentations de) la bibliothèque standard de traduire quelques caractères lors de la lecture/écriture dans le fichier.

La traduction la plus courante concerne la fin de ligne: \n est traduit en \r\n sous Windows.

5
pmg

Dans fopen documentation :

Avec les spécificateurs de mode ci-dessus, le fichier est ouvert en tant que fichier texte. Pour ouvrir un fichier en tant que fichier binaire, un caractère "b" doit être inclus dans la chaîne de mode. Ce caractère "b" supplémentaire peut être ajouté à la fin de la chaîne (créant ainsi les modes composés suivants: "rb", "wb", "ab", "r + b", "w + b", "a + b ") ou être inséré entre la lettre et le signe" + "pour les modes mixtes (" rb + "," wb + "," ab + ").

3
Badda