#1 Le 13/10/2015, à 10:52
- DonutMan75
[RESOLU] [C] Descripteur de fichier vs Pointeur sur fichier
Bonjour à tous,
j'aimerais connaître vos avis concernant ces deux façons différentes d'accéder aux fichiers en C
Première méthode : via un pointeur sur fichier
Bibliothèque nécessaire : standard (<stdlib.h>)
Syntaxe :
FILE *fin = fopen("toto.txt", "r+"); // Ouvrir le fichier
char c = getc(fin); // Lire un caractère
putc('A', fin); // Ecrire un caractère
fclose(fin); // Fermer le fichier
Seconde méthode : via un descripteur de fichier
Bibliothèque nécessaire : aucune (?) ou à la rigueur <fcntl.h> pour la définition des constantes de flags comme O_RDWR
Syntaxe :
char *tamp = (char *) malloc(sizeof(char));
int pin = open("toto.txt", O_RDWR); // Ouvrir le fichier
int nin = read(pin, tamp, 1); // Lire un caractère (1 octet)
int nout = write(pin, tamp, 1); // Ecrire un caractère (1 octet)
close(pin); // Fermer le fichier
free(tamp);
Différences :
- la méthode via un descripteur de fichier (read, write) est plus BAS NIVEAU que getc et putc (mais au fond, qu'est ce que ça veut dire ?)
- la méthode via un descripteur de fichier (read, write) peut lire des octets qui ne sont pas des chaînes de caractère (???) donc on peut s'en servir par exemple pour copier des fichiers binaires (chose qui serait impossible avec getc et putc ????)
- autres différences ?
Donc au final, si je travaille avec de l'ASCII mieux vaut utiliser les pointeurs de fichiers. Si je travaille avec du binaire, mieux vaut utiliser les descripteurs de fichiers ?
Merci d'avance pour vos lumières
D.
Dernière modification par DonutMan75 (Le 13/10/2015, à 16:01)
Hors ligne
#2 Le 13/10/2015, à 12:25
- grim7reaper
Re : [RESOLU] [C] Descripteur de fichier vs Pointeur sur fichier
Salut,
Bibliothèque nécessaire : aucune (?) ou à la rigueur <fcntl.h> pour la définition des constantes de flags comme O_RDWR
Il me semble qu'il faut au moins inclure <unistd.h>
la méthode via un descripteur de fichier (read, write) est plus BAS NIVEAU que getc et putc (mais au fond, qu'est ce que ça veut dire ?)
La plus grosse différence à mes yeux c'est que read/write c'est du POSIX (donc pas forcément disponible partout, Windows par exemple…) alors que l'API FILE c'est du C standard (donc disponible partout à priori).
la méthode via un descripteur de fichier (read, write) peut lire des octets qui ne sont pas des chaînes de caractère (???)
Je ne comprends pas trop ce que tu veux dire, mais il est tout à fait possible de faire des I/O en mode binaire avec un FILE (cf. fread/fwrite).
Donc au final, si je travaille avec de l'ASCII mieux vaut utiliser les pointeurs de fichiers. Si je travaille avec du binaire, mieux vaut utiliser les descripteurs de fichiers ?
Au final je dirais que par défaut tu dois partir pour du l'API FILE (c'est standard, plus haut niveau, …) et si ça ne va pas (et quand tu seras dans ce cas, tu le sauras sinon c'est que FILE convient) alors passe par les descripteurs de fichiers.
Hors ligne
#3 Le 13/10/2015, à 16:05
- DonutMan75
Re : [RESOLU] [C] Descripteur de fichier vs Pointeur sur fichier
Bonjour grim7reaper,
merci pour ta réponse, les choses sont un peu plus claires maintenant
P.S : je suis allé voir ton blog du coup, c'est très intéressant (surtout les articles crackme). D'ailleurs je me suis posé une question : comment définirais-tu un mot de passe dans un code en C pour qu'il ne soit pas visible par strings ./monprogramme ?
Bonne soirée et à bientôt,
D.
Hors ligne
#4 Le 13/10/2015, à 22:28
- grim7reaper
Re : [RESOLU] [C] Descripteur de fichier vs Pointeur sur fichier
P.S : je suis allé voir ton blog du coup, c'est très intéressant (surtout les articles crackme).
Merci
Content que ça te plaise (d’autant plus que les articles sur les crackme ont failli disparaître (j’ai eu des demandes de retrait), mais je les ai conservés ce qui a eu pour conséquence de me faire bannir de root-me en tant que tricheur… (le ban je le mérite, je n'ai pas respecté leur conditions d’utilisations, mais l’étiquette de tricheur…))
D'ailleurs je me suis posé une question : comment définirais-tu un mot de passe dans un code en C pour qu'il ne soit pas visible par strings ./monprogramme ?
C’est une question dont la réponse correcte ne risque pas de tenir en un message, mais disons que tu peux avoir deux approches:
- ne pas stocker le mot de passe dans le programme (le lire depuis un fichier par exemple).
- ne pas utiliser le mot de passe en clair (utiliser un hash du mot de passe par exemple).
Hors ligne
#5 Le 14/10/2015, à 13:16
- grigouille
Re : [RESOLU] [C] Descripteur de fichier vs Pointeur sur fichier
Ne pas oublier de saler le mot de passe.
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne