Cela doit être une question commune que tous les programmeurs se posent de temps en temps. Comment lire une ligne d'un fichier texte? Ensuite, la question suivante est toujours de savoir comment l'écrire.
Bien sûr, la plupart d'entre vous utilisent un cadre de haut niveau dans la programmation quotidienne (ce qui est bien à utiliser dans les réponses) mais parfois il est bon de savoir comment le faire à un niveau bas aussi.
Je sais moi-même comment le faire dans C
, C++
et Objective-C
, mais il serait certainement utile de voir comment cela se fait dans toutes les langues populaires, ne serait-ce que pour nous aider à prendre une meilleure décision sur la langue dans laquelle créer notre fichier io. En particulier Je pense qu'il serait intéressant de voir comment son fait dans les langues de manipulation de chaîne, comme: python
, ruby
et bien sûr perl
.
Je pense donc que nous pouvons créer une ressource communautaire à laquelle nous pouvons tous mettre en vedette nos profils et à laquelle nous nous référons lorsque nous devons effectuer des E / S de fichiers dans une nouvelle langue. Sans parler de l'exposition que nous aurons tous à des langues que nous ne traitons pas quotidiennement.
Voici comment vous devez répondre:
- Créez un nouveau fichier texte appelé " fileio.txt "
- Écrivez la première ligne "bonjour" dans le fichier texte.
- Ajoutez la deuxième ligne «monde» au fichier texte.
- Lisez la deuxième ligne "monde" dans une chaîne d'entrée.
- Imprimez la chaîne d'entrée sur la console.
Clarification:
- Vous devez montrer comment faire cela dans un seul langage de programmation par réponse.
- Supposons que le fichier texte n'existe pas au préalable
- Vous n'avez pas besoin de rouvrir le fichier texte après avoir écrit la première ligne
Aucune limite particulière sur la langue.
C
, C++
, C#
, Java
, Objective-C
Sont tous excellents.
Si vous savez comment le faire dans Prolog
, Haskell
, Fortran
, Lisp
ou Basic
alors s'il vous plaît allez - y.
la source
Réponses:
Python 3
Clarifications
readlines () renvoie une liste de toutes les lignes du fichier. Par conséquent, l'invocation de readlines () entraîne la lecture de chaque ligne du fichier. Dans ce cas particulier, il est bien d'utiliser readlines () car nous devons quand même lire le fichier entier (nous voulons sa dernière ligne). Mais si notre fichier contient de nombreuses lignes et que nous voulons simplement imprimer sa nième ligne, il est inutile de lire le fichier entier. Voici quelques meilleures façons d'obtenir la nième ligne d'un fichier en Python: Qu'est - ce qui remplace xreadlines () dans Python 3? .
Qu'est-ce que c'est avec déclaration? L'instruction with démarre un bloc de code dans lequel vous pouvez utiliser la variable f comme objet de flux renvoyé par l'appel à open (). Lorsque le bloc with se termine, python appelle automatiquement f.close (). Cela garantit que le fichier sera fermé lorsque vous quitterez le bloc with, peu importe comment ou quand vous quittez le bloc (même si vous le quittez via une exception non gérée). Vous pouvez appeler f.close () explicitement, mais que faire si votre code lève une exception et que vous n'obtenez pas l'appel à f.close ()? C'est pourquoi l'instruction with est utile.
Vous n'avez pas besoin de rouvrir le fichier avant chaque opération. Vous pouvez écrire tout le code à l'intérieur d'un avec block.
J'en ai utilisé trois avec des blocs pour illustrer la différence entre les trois opérations: write (mode 'w'), append (mode 'a'), read (mode 'r', la valeur par défaut).
la source
readlines()[1]
exemple de code. Dans ce cas, vous savez peut-être que le fichier ne comporte que deux lignes, mais quelqu'un d'autre supposant que c'est une bonne solution pourrait l'essayer sur un fichier d'un million de lignes et avoir une mauvaise surprise.readlines()
retours d'un itérateur (pas une liste) Juste une note: vous ne pouvez généralement pas indexer un itérateur.range
objet a un support spécial pour l'indexation, ce qui se fait dans O (1).LOLCODE
Les spécifications sont pour le moins fragmentaires, mais j'ai fait de mon mieux. Que le vote négatif commence! :) Je trouve toujours que c'est un exercice amusant.
la source
Cerveau *** k
la source
COBOL
Puisque personne d'autre ne l'a fait ......
la source
Haskell
Si vous souhaitez simplement lire / écrire un fichier:
la source
IO a
qui a un support de compilateur spécial pour les effets secondaires. (La pureté est préservée ailleurs parce que tout ce qui effectue ou observe un effet secondaire est de typeIO a
, donc le système de types garantit que le reste de votre programme reste pur.)IO
c'est une monade, mais ce n'est pas pourquoi il est autorisé à faire des effets secondaires. Être une monade est ce qui vous permet d'écrire cette syntaxe impérative: cela garantit également (également avec un support de langage spécial) que les effets secondaires se produisent dans un ordre raisonnable, de sorte que vous ne lisez pas le fichier avant de l'écrire, etc. .ré
la source
Rubis
la source
File.open
avec un bloc, le fichier est ouvert, passé au bloc, puis fermé automatiquement.C #
File.ReadLines(path).ElementAt(1)
est .Net 4.0 uniquement, l'alternative est d'File.ReadAllLines(path)[1]
analyser le fichier entier dans un tableau.la source
ANSI C
la source
Script de shell (UNIX)
En fait, la
sed -n "2p"
pièce imprime la deuxième ligne, mais la question demande que la deuxième ligne soit stockée dans une variable puis imprimée, donc ... :)la source
sed
), ici: stackoverflow.com/questions/3538156/...LINE=`foo`
capture la sortie defoo
dans la variableLINE
.Assembleur x86 (NASM) sous Linux
Je n'ai pas touché asm depuis 7 ans, j'ai donc dû utiliser un peu google pour pirater cela ensemble, mais ça marche quand même;) Je sais que ce n'est pas correct à 100%, mais bon: D
OK, ça ne marche pas. désolé pour ça. bien qu'il imprime
world
à la fin, il ne l'imprime pas à partir du fichier, mais à partir de celuiecx
qui est défini à la ligne 27.Références utilisées: http://www.cin.ufpe.br/~if817/arquivos/asmtut/quickstart.html
http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html
http://www.digilife.be/quickreferences/QRC/LINUX%20System%20Call%20Quick%20Reference.pdf
la source
JavaScript - node.js
Tout d'abord, de nombreux rappels imbriqués.
Un peu plus propre:
la source
node.js
plateforme. Voir nodejs.orgCommon Lisp
la source
PowerShell
la source
gc
au lieu de a ducat
sens :-)get-alias
m'a donné lecat
premier (je n'utilise pas beaucoup PowerShell).Script de Shell
Voici un script shell utilisant uniquement des commandes intégrées, plutôt que d'appeler des commandes externes telles que
sed
outail
comme l'ont fait les réponses précédentes.Lors de l'écriture de scripts shell importants, il est conseillé d'utiliser autant que possible les fonctions intégrées, car la création d'un processus séparé peut être lente; à partir d'un test rapide sur ma machine, la
sed
solution est environ 20 fois plus lente que l'utilisationread
. Si vous appelezsed
une fois, comme dans ce cas, cela n'a pas vraiment d'importance, car il s'exécutera plus rapidement que vous ne pouvez le remarquer, mais si vous allez l'exécuter des centaines ou des milliers de fois, il peut additionner.Pour ceux qui ne connaissent pas la syntaxe,
{
et}
exécutez une liste de commandes dans l'environnement shell actuel (par opposition à(
et)
qui créent un sous-shell; nous devons fonctionner dans l'environnement shell actuel, nous pouvons donc utiliser la valeur de la variable plus tard) . Nous devons regrouper les commandes afin qu'elles fonctionnent toutes les deux sur le même flux d'entrée, créé en redirigeant à partir defileio.txt
; si nous exécutions simplementread < fileio.txt; read input < fileio.txt
, nous obtiendrions simplement la première ligne, car le fichier serait fermé et rouvert entre les deux commandes. En raison d'une idiosyncrasie de la syntaxe du shell ({
et}
sont des mots réservés, par opposition aux métacaractères), nous devons séparer les{
et}
à partir du reste des commandes avec des espaces, et terminez la liste des commandes avec un;
.L'
read
intégré prend comme argument les noms des variables à lire. Il consomme une ligne d'entrée, rompt l'entrée par un espace (techniquement, il le rompt en fonction du contenu de$IFS
, qui par défaut est un caractère d'espace, où un caractère d'espace signifie le diviser sur n'importe quel espace, tabulation ou nouvelle ligne), assigne chaque mot aux noms de variables donnés dans l'ordre, et affecte le reste de la ligne à la dernière variable. Étant donné que nous ne fournissons qu'une seule variable, cela met simplement toute la ligne dans cette variable. Nous réutilisons la$input
variable, car nous ne nous soucions pas de ce qui se trouve sur la première ligne (si nous utilisons Bash, nous ne pourrions tout simplement pas fournir un nom de variable, mais pour être portable, vous devez toujours fournir au moins un nom).Notez que même si vous pouvez lire les lignes une à la fois, comme je le fais ici, un modèle beaucoup plus courant serait de l'envelopper dans une boucle while:
la source
Clojure
Ou de manière équivalente, en utilisant la macro de threading
->
(également connue sous le nom de paren Remover):la source
spit
est vraiment le nom de la fonction d'écriture dans un fichier?F#
la source
DE BASE
Je n'ai pas utilisé BASIC depuis près de 10 ans, mais cette question m'a donné une raison de rafraîchir rapidement mes connaissances. :)
la source
Objectif c
la source
Perl
la source
perl -we 'for (q{ps aux |}){ open _; print <_>; }'
R:
la source
PHP
la source
?>
: framework.zend.com/manual/enJava
la source
C ++
ou un peu moins pédantiquement,
la source
<limits>
juste pour direignore
qu'il n'y a pas de limite à la taille de la ligne.Aller
la source
os.O_RDWR | os.O_CREATE, 0666
indésirable même nécessaire pour les E / S de fichier de base dans Go?Erlang
Probablement pas l'Erlang le plus idiomatique, mais:
la source
Emacs Lisp
Malgré ce que certains disent, Emacs est principalement un éditeur de texte [1]. Ainsi, alors qu'Emacs Lisp peut être utilisé pour résoudre toutes sortes de problèmes, il est optimisé pour les besoins d'un éditeur de texte. Étant donné que les éditeurs de texte ont (évidemment) des besoins assez spécifiques en ce qui concerne la manière dont les fichiers sont traités, cela affecte les fonctionnalités liées aux fichiers qu'offre Emacs Lisp.
Fondamentalement, cela signifie qu'Emacs Lisp n'offre pas de fonctions pour ouvrir un fichier en tant que flux, et le lire partie par partie. De même, vous ne pouvez pas ajouter à un fichier sans charger d'abord le fichier entier. Au lieu de cela, le fichier est complètement [2] lu dans un tampon [3], édité puis sauvegardé à nouveau dans un fichier.
Pour les tâches incontournables, vous utiliseriez Emacs Lisp car cela convient et si vous voulez faire quelque chose qui n'implique pas l'édition, les mêmes fonctions peuvent être utilisées.
Si vous souhaitez ajouter à un fichier encore et encore, cela entraîne une surcharge énorme, mais c'est possible comme illustré ici. En pratique, vous terminez normalement d'apporter des modifications à un tampon, que ce soit manuellement ou par programme avant d'écrire dans un fichier (combinez simplement les deux premières expressions s dans l'exemple ci-dessous).
[1] Au moins, je n'irais pas jusqu'à l'appeler un OS; une interface utilisateur alternative oui, un OS non.
[2] Vous ne pouvez charger que des parties d'un fichier, mais cela ne peut être spécifié que par octet.
[3] Un tampon est à la fois un type de données en quelque sorte similaire à une chaîne ainsi que la "chose que vous voyez lors de l'édition d'un fichier". Lors de l'édition, un tampon est affiché dans une fenêtre, mais les tampons ne doivent pas nécessairement être visibles pour l'utilisateur.
Modifier: si vous voulez voir le texte inséré dans le tampon, vous devez évidemment le rendre visible et dormir entre les actions. Étant donné qu'Emacs ne réaffiche normalement l'écran que lorsqu'il attend l'entrée de l'utilisateur (et que le sommeil n'est pas la même chose que l'attente d'une entrée), vous devez également forcer le réaffichage. Ceci est nécessaire dans cet exemple (utilisez-le à la place du second sexp); dans la pratique, je n'ai jamais eu à utiliser `redisplay 'ne serait-ce qu'une seule fois - donc oui, c'est moche mais ...
la source
Fichiers batch Windows - Version 2
Pour expliquer cette dernière horrible boucle de recherche, il suppose qu'il n'y a que le monde bonjour (nouvelle ligne) dans le fichier. Donc, il saute simplement la première ligne et ne fait écho qu'à la seconde.
Changelog
2 - Opps, faut de mal lire les exigences ou elles ont changé sur moi. Lit maintenant la dernière ligne du fichier
la source
Scala:
Utilisation de la bibliothèque standard:
Utilisation de la bibliothèque Scala-ARM de Josh Suereth :
Étant donné que de nombreuses personnes ont utilisé le même descripteur de fichier pour écrire les deux chaînes, j'inclus également de cette façon dans ma réponse.
Utilisation de la bibliothèque standard:
Utilisation de la bibliothèque Scala-ARM de Josh Suereth :
la source
getLines().toList()
devrait êtregetLines().toSeq
ce qui est paresseux?Sensationnel
la source