Comment copier un fichier texte à la chaîne en C?
J'ai besoin de copier le contenu d'un fichier texte à un allouée dynamiquement tableau de caractères.
Mon problème est d'obtenir la taille du contenu du fichier; Google révèle que j'ai besoin d'utiliser fseek
et ftell
, mais pour que le fichier apparemment doit être ouvert en mode binaire, et qui ne donne que des ordures.
EDIT: j'ai essayé d'ouvrir en mode texte, mais j'ai la bizarre numéros. Voici le code (j'ai omis de simple vérification des erreurs pour plus de clarté):
long f_size;
char* code;
size_t code_s, result;
FILE* fp = fopen(argv[0], "r");
fseek(fp, 0, SEEK_END);
f_size = ftell(fp); /* This returns 29696, but file is 85 bytes */
fseek(fp, 0, SEEK_SET);
code_s = sizeof(char) * f_size;
code = malloc(code_s);
result = fread(code, 1, f_size, fp); /* This returns 1045, it should be the same as f_size */
L'ouverture d'un fichier en mode binaire et non de modifier son contenu. Post quel est le code que vous avez de sorte que nous pouvons repérer d'éventuels problèmes.
voir cette question: stackoverflow.com/questions/410943/...
N'est-ce pas à peu près ce que je fais?
oui. Avez-vous réellement ouvrir le fichier? Vous devez vérifier si
Oui, je le fais. Le problème est que le retour des fonctions de numéros qui ne font pas de sens.
voir cette question: stackoverflow.com/questions/410943/...
N'est-ce pas à peu près ce que je fais?
oui. Avez-vous réellement ouvrir le fichier? Vous devez vérifier si
fp
n'est pas NULL.Oui, je le fais. Le problème est que le retour des fonctions de numéros qui ne font pas de sens.
OriginalL'auteur Javier | 2009-08-16
Vous devez vous connecter pour publier un commentaire.
La racine du problème est ici:
argv[0] est votre programme exécutable, PAS le paramètre. Ce ne sera certainement pas un fichier texte. Essayez argv[1], et de voir ce qui se passe ensuite.
bon 🙂 Ça va être mon tour...
OriginalL'auteur Roddy
Vous ne pouvez pas déterminer la taille d'un fichier en caractères sans la lecture des données, sauf si vous êtes en utilisant une largeur fixe l'encodage.
Par exemple, un fichier en UTF-8, qui est de 8 octets de long pourrait être de 2 à 8 caractères.
Ce n'est pas une limitation de l'Api de fichier, il est d'un naturel limitation de l'absence d'un mapping direct de "la taille des données binaires" pour "nombre de caractères."
Si vous avez une largeur fixe l'encodage, alors vous pouvez simplement diviser la taille du fichier en octets par le nombre d'octets par caractère. L'ASCII est l'exemple le plus évident de cela, mais si votre fichier est encodé en UTF-16 et vous arrive d'être sur un système qui traite de code UTF-16 points alors que les "indigènes" interne type de caractère (qui inclut Java, .NET et Windows) ensuite, vous pouvez prédire le nombre de "caractères" à assigner comme si UTF-16 sont de largeur fixe. (UTF-16 est de largeur variable en raison des caractères Unicode au-dessus de U+FFFF être encodés en plusieurs points de code, mais la plupart du temps, les développeurs de l'ignorer.)
Ou utiliser fstat(2). Voir gnu.org/s/libc/manual/html_node/Reading-Attributes.html
Voulez-vous vite, ou voulez-vous juste? Il y a juste logiquement pas moyen de faire sans lecture du fichier de données si vous utilisez une largeur variable de codage - à moins que quelque chose d'autre l'a fait en premier (comme le système d'exploitation) et de la mise en cache des données.
(J'ai été en supposant que vous intéressés par le nombre de caractères à la place du nombre d'octets, par la voie... et que vous avez une largeur variable de codage. Si vraiment vous voulez juste connaître la taille du fichier en octets, ce qui est différent et bien plus simple de la matière.)
Mon point est que beaucoup de plates - formes, y compris Java et .NET - utilisation de code UTF-16 points de "caractères". Par exemple, si vous voulez lire un fichier qui contient 120 de code UTF-16 points, vous allouer un tableau de caractères de taille 120, et si le fichier est encodé en UTF-16, on peut prédire que la taille en fonction de la taille du fichier en octets. Vous pouvez argumenter tout ce que vous voulez au sujet de si oui ou non c'est une bonne idée (je n'étais pas le donner comme des "conseils", d'ailleurs), mais c'est la façon que les grands systèmes sont mis en œuvre. Je vais modifier la réponse à la rendre plus claire à ce sujet...
OriginalL'auteur Jon Skeet
Je suis sûr que argv[0] ne sera pas un fichier texte.
OriginalL'auteur phoku
Donner à ceci un essai (n'ont pas compilé, mais j'ai fait un bazillion fois, donc je suis sûr que c'est au moins proche):
OriginalL'auteur Imagist
Si vous êtes en développement pour Linux (ou d'autres systèmes de type Unix), vous pouvez récupérer la taille de fichier avec stat avant d'ouvrir le fichier:
EDIT: Comme je voir le code, je dois entrer dans la ligne avec les autres affiches:
Le tableau qui prend les arguments du programme-l'appel est construite de cette façon:
[0] nom du programme lui-même
[1] le premier argument donné
[2] le deuxième argument donné
[n] n-ième argument donné
Vous devriez également vérifier argc avant d'essayer d'utiliser un champ autre que " 0 " de la argv-tableau:
OriginalL'auteur
argv[0] est le chemin vers l'exécutable et donc argv[1] sera le premier utilisateur soumis entrée. Essayez de modifier et d'ajouter une simple vérification des erreurs, telles que la vérification si fp == 0, et on pourrait être en mesure pour vous aider davantage.
OriginalL'auteur Håkon
Vous pouvez ouvrir le fichier, placez le curseur à la fin du fichier, stocker le décalage, et revenir au début du fichier, et faire la différence.
OriginalL'auteur Aif
Vous pouvez utiliser
fseek
pour les fichiers texte.fseek
à la fin du fichierftell
le décalagefseek
de retour pour le débutet vous avez la taille du fichier
OriginalL'auteur Jakub Arnold
Un peu difficile avec aucun exemple de code, mais fstat (ou stat) vous indiquera la taille du fichier est. Vous allouer la mémoire nécessaire, et buvez du fichier.
OriginalL'auteur xcramps
Une autre approche consiste à lire le fichier une pièce à la fois et les prolonger votre dynamique de la mémoire tampon:
Il existe des inconvénients à cette approche; pour une chose, si il n'y a pas assez de mémoire pour contenir le contenu du fichier, vous ne savez pas immédiatement. Aussi, realloc() est relativement cher à l'appel, de sorte que vous ne voulez pas faire de votre page de tailles trop petites.
Toutefois, cela évite d'avoir à utiliser fstat() ou fseek()/ftell() pour déterminer comment grand que le fichier est au préalable.
OriginalL'auteur John Bode