Quel est le moyen le plus simple (le moins sujet aux erreurs, le moins de lignes de code, quelle que soit la manière dont vous voulez l'interpréter) pour ouvrir un fichier en C et lire son contenu dans une chaîne (char *, char [], peu importe)?
96
string s = File.ReadAllText(filename);
. Comment cela pourrait-il être plus simple et plus sujet aux erreurs?Réponses:
J'ai tendance à charger tout le tampon en tant que bloc de mémoire brute dans la mémoire et à faire l'analyse par moi-même. De cette façon, j'ai le meilleur contrôle sur ce que fait la bibliothèque standard sur plusieurs plates-formes.
C'est un talon que j'utilise pour cela. vous pouvez également vérifier les codes d'erreur pour fseek, ftell et fread. (omis pour plus de clarté).
la source
fread
votre chaîne ne termine pas par zéro. Cela peut entraîner des problèmes.buffer = malloc (length + 1);
et ajouterais après fclose:buffer[length] = '\0';
(validé par Valgrind)Une autre solution, malheureusement très dépendante du système d'exploitation, consiste à mapper le fichier en mémoire. Les avantages comprennent généralement les performances de lecture et une utilisation réduite de la mémoire, car la vue des applications et le cache des fichiers du système d'exploitation peuvent en fait partager la mémoire physique.
Le code POSIX ressemblerait à ceci:
Windows en revanche est un peu plus délicat, et malheureusement je n'ai pas de compilateur devant moi à tester, mais la fonctionnalité est fournie par
CreateFileMapping()
etMapViewOfFile()
.la source
Si "lire son contenu dans une chaîne" signifie que le fichier ne contient pas de caractères avec le code 0, vous pouvez également utiliser la fonction getdelim (), qui accepte un bloc de mémoire et le réalloue si nécessaire, ou alloue simplement le tampon entier pour vous, et y lit le fichier jusqu'à ce qu'il rencontre un délimiteur ou une fin de fichier spécifié. Passez simplement '\ 0' comme délimiteur pour lire le fichier entier.
Cette fonction est disponible dans la bibliothèque GNU C, http://www.gnu.org/software/libc/manual/html_mono/libc.html#index-getdelim-994
L'exemple de code peut sembler aussi simple que
la source
Si le fichier est du texte et que vous souhaitez obtenir le texte ligne par ligne, le moyen le plus simple est d'utiliser fgets ().
la source
Si vous lisez des fichiers spéciaux comme stdin ou un tube, vous ne pourrez pas utiliser fstat pour obtenir la taille du fichier au préalable. De plus, si vous lisez un fichier binaire, fgets perdra les informations de taille de chaîne à cause des caractères '\ 0' incorporés. La meilleure façon de lire un fichier est alors d'utiliser read et realloc:
la source
Remarque: Ceci est une modification de la réponse acceptée ci-dessus.
Voici un moyen de le faire, avec une vérification des erreurs.
J'ai ajouté un vérificateur de taille pour quitter lorsque le fichier était supérieur à 1 Gio. J'ai fait cela parce que le programme met le fichier entier dans une chaîne qui peut utiliser trop de RAM et faire planter un ordinateur. Cependant, si cela ne vous intéresse pas, vous pouvez simplement le supprimer du code.
Et pour vérifier les erreurs:
la source
Si vous utilisez
glib
, vous pouvez utiliser g_file_get_contents ;la source
C'est une solution assez grossière car rien n'est vérifié par rapport à null.
la source
glShaderSource
prend éventuellement.Juste modifié de la réponse acceptée ci-dessus.
la source
J'ajouterai ma propre version, basée sur les réponses ici, juste pour référence. Mon code prend en compte sizeof (char) et y ajoute quelques commentaires.
la source
facile et soigné (en supposant que le contenu du fichier est inférieur à 10000):
la source