#include <stdio.h>
#include <stdlib.h>

int main(void) {

    FILE *fp;

    fp = fopen("clients.dat", "wb");
    fclose(fp);

    fp = fopen("clients.dat", "rb");

    while (1) {
        if (fp == EOF)
            break;
        else 
            printf("There is something inside a file");
    }

    fclose(fp);
    return 0;
}

Voici une question: que contiennent les fichiers binaires vides? le pointeur doit-il pointer sur le caractère EOF? Je veux dire: n'est-ce pas que la première et la dernière chose dans le fichier est EOF? OU comment puis-je vérifier si un fichier est vide ou non?

0
Will Hunting 7 oct. 2020 à 10:20

4 réponses

Meilleure réponse

La fonction fopen renvoie un pointeur vers un descripteur de fichier de type FILE, pas un pointeur vers un contenu du fichier ou un pointeur vers un caractère EOF. Le pointeur est NULL si le fichier n'a pas pu être ouvert du tout, mais n'indique pas si le fichier est vide ou non.

Pour vérifier si un fichier est vide, vous devez soit (1) tenter de lire les octets et gérer les différents résultats, soit (2) utiliser fseek et ftell pour déplacer le pointeur de lecture vers le terminez et demandez ensuite le poste.

(1)

fp=fopen("clients.dat","rb");
char buffer;
size_t bytesRead = fread(&buffer, 1, 1, fp); // try to read one byte
if(bytesRead == 1) {
    printf("file contains at least one byte\n");
} else { // error handling
   if (feof(fp))
      printf("Attemt to read though end of file has been reached. File is empty.\n");
   else if (ferror(fp)) {
       perror("Error reading file.");
   }
}

(2)

fp=fopen("clients.dat","rb");
fseek(fp, 0L, SEEK_END);
long size = ftell(fp);
if (size==0) {
   // file is empty.
}

Je préférerais la deuxième variante.

1
Stephan Lechner 7 oct. 2020 à 07:41

Un fichier vide ne contient rien, il est vide. Donc, il contient 0 octet. EOF n'est pas un caractère qui se trouve à la fin d'un fichier, il s'agit d'une constante entière utilisée comme valeur de retour de certaines des méthodes standard lisant un fichier pour indiquer la fin du fichier ou une sorte d'erreur.

Lorsque vous ouvrez un fichier, vous obtenez un pointeur vers un FILE tapez à nouveau, c'est ce que vous pouvez attendre même d'un fichier vide.

Un fichier ne se termine pas de la même manière qu'une chaîne, il n'y a donc pas d'équivalent d'un caractère NULL dans un fichier, qui détermine quand le contenu du fichier s'arrête.

Pour déterminer si un fichier que vous avez ouvert et sur lequel vous avez un pointeur FILE valide est vide, vous pouvez utiliser fseek et ftell < / a>:

fseek(fp, 0, SEEK_END);
size = ftell(fp);
if (size == 0) {
    // File is empty
}
2
chqrlie 7 oct. 2020 à 08:56

Voici une autre approche:

Pour vérifier si le fichier est vide, vous pouvez simplement lire le fichier:

int c = fgetc(fp);
if (c == EOF)
{
    // The file is empty or an error occured
    if (feof(fp))
    {
        // Empty
    }
    else
    {
        // Error during file read
    }
}
else
{
    // non-empty file
}
1
4386427 7 oct. 2020 à 07:42

Voici une question sur ce que contiennent les fichiers binaires vides?

Les fichiers vides ne contiennent rien, c'est ce qui les rend vides.

Les fichiers normaux ont une taille qui ne fait pas partie de leurs données, mais fait normalement partie de l'entrée de répertoire ou de l'inode.

le pointeur doit-il pointer sur le caractère EOF?

Non

Tout d'abord, le pointeur renvoyé par fopen n'est PAS un pointeur vers le contenu du fichier, mais simplement un pointeur vers une structure de données décrivant le fichier ouvert.

Deuxièmement, EOF n'est pas une partie réelle du fichier, mais une valeur de retour spéciale de la famille de fonctions getc utilisée pour indiquer que la fin du fichier a été atteinte.

Pour tester si vous êtes à la fin d'un fichier sans en lire, vous pouvez utiliser la fonction feof.

1
plugwash 7 oct. 2020 à 08:43