Façon la plus claire à lire et à imprimer .fichier txt lignes en C
Il y a des tas de façons de décrire comment utiliser différentes méthodes pour imprimer les lignes d'un fichier texte sur ce site:
Ils semblent tous être adaptés à un exemple précis.
Il serait génial d'avoir le plus claire et Plus Concis et plus Facile simplement: imprimer chaque ligne d'un fichier texte à l'écran. De préférence avec des explications détaillées de ce que chaque ligne ne.
Points pour des raisons de concision et de clarté.
Qu'essayez-vous de faire ? Voulez-vous dump l'ensemble du dossier ?
Sur UNIX, il est appelé
Je voudrais imprimer chaque ligne du fichier texte à l'écran. Si le fichier a dire 5 lignes, je voudrais que la façon la plus claire pour simplement ouvrir et imprimer ces cinq lignes. En ce qui concerne mon code, je n'ai pas une utilisation spécifique à l'esprit. Ce serait formidable d'avoir une excellente compréhension de la meilleure façon d'exécuter ce concept simple.
Sur UNIX, il est appelé
cat
.Je voudrais imprimer chaque ligne du fichier texte à l'écran. Si le fichier a dire 5 lignes, je voudrais que la façon la plus claire pour simplement ouvrir et imprimer ces cinq lignes. En ce qui concerne mon code, je n'ai pas une utilisation spécifique à l'esprit. Ce serait formidable d'avoir une excellente compréhension de la meilleure façon d'exécuter ce concept simple.
OriginalL'auteur Dlinet | 2012-12-28
Vous devez vous connecter pour publier un commentaire.
La
cat()
fonction n'est pas strictement nécessaire, mais je préfère l'utiliser. Les principales étapes du programme à travers chaque argument de ligne de commande et ouvre le fichier nommé. Si elle réussit, elle appelle lacat()
la fonction d'impression de son contenu. Depuis l'appel àfopen()
ne précise pas"rb"
, il est ouvert en tant que fichier texte. Si le fichier n'est pas ouvert, ce code ignore silencieusement la question. Si aucun fichier n'est spécifié, rien n'est imprimé.La
cat()
fonction se contente de lire des blocs de texte jusqu'à 4096 octets à la fois, et les écrit dans la sortie standard ("l'écran"). Il s'arrête quand il n'y a plus à lire.Si vous voulez prolonger le code pour lire l'entrée standard quand aucun fichier n'est spécifié, alors vous pouvez utiliser:
qui est l'une des raisons pour avoir la
cat()
fonction écrite comme indiqué.Ce code ne paie pas de diriger l'attention vers des retours à la ligne ou des lignes de toute sorte. Si vous voulez traiter formellement une ligne à la fois, alors vous pouvez faire plusieurs choses:
Cela permettra de lire et d'écrire une seule ligne à la fois. Si une ligne est plus que de 4 095 octets, il va lire la ligne en deux ou plus des opérations et de l'écrire dans le même nombre d'opérations. Notez que cela suppose un fichier texte dans une manière que la version à l'aide
fread()
etfwrite()
ne le fait pas. Sur les systèmes POSIX, la version avecfread()
etfwrite()
va gérer arbitraire des fichiers binaires avec des octets nuls ('\0'
) dans les données, mais la version à l'aidefgets()
etfputs()
ne sera pas. Les deux versions sont jusqu'à présent strictement standard C (n'importe quelle version de la norme) qu'ils n'utilisent pas du tout de la plate-forme d'extensions spécifiques; ils sont à peu près aussi portable que le code peut être.Sinon, encore une fois, si vous avez la POSIX 2008
getline()
fonction, vous pouvez l'utiliser, mais vous avez besoin#include <stdlib.h>
trop (parce que vous finissez par avoir à libérer la mémoire qu'il alloue):Cette version, trop, ne seront pas gérer les données binaires (sens des données avec des octets nuls). Il pourrait être mis à niveau pour le faire, bien sûr:
La
getline()
fonction indique combien d'octets à lire (il y a un octet nul après que), mais lefwrite()
fonction est le seul qui prend un flux de l'arbitraire d'octets et les écrit tous les flux.Plus sécurisé ? Plus portable ? Pourquoi ? Plus lent oui, rappelez-vous que tout sur la pile est la plus probable dans le cache du PROCESSEUR... Pourquoi l'utilisation du TAS (un malloc n'est pas lent, mais il n'est pas rapide) ?
un malloc() serait la cause de conditions supplémentaires. Aussi: le programme est dépendant des e/S de toute façon, et read_bunch + write_bunch est désastreux pour le disque-LRU.
Leffler En python, pour imprimer les lignes dans un fichier à l'écran est de 4 lignes. Je sais que c est beaucoup plus complexe, mais j'espérais qu'il y aurait une solution de moins de six fois plus longtemps...
c'est vraiment super C du code. Python pouvez résoudre ce problème en moins de lignes, mais c'est parce que Python est un langage de niveau plus élevé que C. Pour de simples problèmes de ce genre, l'avantage, c'est avec Python; mais C donne au développeur expérimenté le contrôle complet sur ce qui est fait et comment il est fait. Python pouvez résoudre ce problème en moins de lignes... mais Python est écrit en C! (Eh bien, Disponible est de toute façon. Il existe d'autres versions de Python. Mais Disponible est venu en premier et est toujours le roi.)
OriginalL'auteur Jonathan Leffler
Eh bien, voici une très courte solution que j'ai finalement fait. J'imagine qu'il est somethign fondamentalement mauvais avec elle sinon elle aurait été suggéré, mais j'ai pensé que je pourrais le poster ici et j'espère que quelqu'un l'arrache à part:
fopen()
; (3) votre déclaration demain()
n'est pas valide en C99 ou C2011 — il doit êtreint main(void)
ouint main(int argc, char **argv)
(ou, à la rigueur,int main()
); (4) il peut être préférable d'utiliserputchar()
oufputc()
que l'usage de laprintf()
à la sortie d'un seul caractère; (5) il serait plus idiomatiques C pour utiliserwhile ((c = fgetc(MyFile)) != EOF) putchar(c);
; (6) manquantfclose(MyFile)
.+1 pour l'utilisation de
int c;
— qui est à la fois correct et important. Strictement, depuis que vous avez écrit un C89 définition pourmain()
, vous devez utiliserreturn(0);
(donner ou prendre les parenthèses) à la fin demain()
. Si votre code a été C99 conforme, vous pourriez vous en sortir sans que, bien que, à mon avis, il est préférable de le faire même en C99 ou C2011 code.Merci Jonathan, Qui a été très perspicace. Je vais regarder plus sur les différents types de C et de leur main() déclarations!
OriginalL'auteur Dlinet
@Dlinet, vous essayez d'apprendre quelques leçons utiles sur la façon d'organiser un programme. Je ne vais pas poster le code, car il y a déjà un vraiment excellente réponse; je ne peut pas l'améliorer. Mais je voudrais vous recommander un livre pour vous.
Le livre s'appelle Outils Logiciels de Pascal. La langue est Pascal, pas du C, mais pour lire le livre, ce qui va causer aucun préjudice grave. Ils partent de la mise en œuvre des outils simples, comme dans cet exemple (qui sur UNIX est appelé
cat
) et de passer à des choses plus avancées. Non seulement vont-ils enseigner des leçons importantes sur la façon d'organiser ce genre de programme, elles couvrent également la langue des problèmes de conception. (Il y a des problèmes en Pascal qui a vraiment vex, et si vous savez C vous vous rendrez compte que C n'ont pas ces problèmes.)Le livre est épuisé maintenant, mais je l'ai trouvé très précieuse quand j'apprenais à écrire du code. Le soi-disant "gauche de la conception" méthodologie me sert bien à ce jour.
Je vous encourage à trouver une copie utilisée sur Amazon ou ailleurs. Amazon a utilisé des copies à partir de $0.02 plus de $4 expédition.
http://www.amazon.com/Software-Tools-Pascal-Brian-Kernighan/dp/0201103427
Il serait un exercice éducatif pour étudier les programmes dans ce livre et les mettre en œuvre de C. Tout système Linux a déjà plus puissant et entièrement corrigés des versions de ces programmes, mais il ne serait pas un gaspillage de votre temps de travail grâce à ce livre et à apprendre à écrire ce genre de choses.
Vous pouvez également installer FreePascal sur votre ordinateur et l'utiliser pour exécuter les programmes à partir de l'ouvrage.
Bonne chance et que vous avez toujours profiter de développement de logiciels!
OriginalL'auteur steveha
Si vous voulez quelque chose de précuites, il y a
cat
sur les systèmes POSIX.Si vous voulez écrire vous-même, voici la structure de base:
Le point est, il n'est pas vraiment une manière spécifique de le faire. Il suffit de lire, puis à écrire et répéter. Avec une erreur de vérification, vous avez le chat une fois de plus.
Le point que je suis en train de faire est qu'il n'est pas particulièrement belle ou jolie façon de le faire. Juste à C, beaucoup de fichier de code. Beaucoup pour une tâche simple. En Ruby, je peux le faire en une seule ligne, mais C est beaucoup plus. Regarder l'autre réponse pour le code. C'est beaucoup.
J'ai regardé quelques autres réponses. Par exemple: le troisième lien que j'ai posté est de 11 lignes, mais c'est seulement pour les lignes fixes.
OriginalL'auteur Linuxios