Dies muss eine häufige Frage sein, die alle Programmierer von Zeit zu Zeit haben. Wie lese ich eine Zeile aus einer Textdatei? Dann ist die nächste Frage immer, wie ich es zurückschreibe.
Natürlich verwenden die meisten von Ihnen ein High-Level-Framework für die tägliche Programmierung (das in Antworten gut zu verwenden ist), aber manchmal ist es auch schön zu wissen, wie man es auf niedrigem Level macht.
Ich selbst weiß, wie es gemacht wird C
, C++
und Objective-C
, aber es wäre sicher praktisch zu sehen, wie es in allen gängigen Sprachen gemacht wird, wenn wir nur eine bessere Entscheidung darüber treffen wollen, in welcher Sprache wir unsere Datei io machen sollen. Insbesondere ich denke , es wäre interessant zu sehen , wie seine in den String - Manipulation Sprachen gemacht, wie: python
, ruby
und natürlich perl
.
Also ich hier Abbildung können wir erstellen Community - Ressource , dass wir alle können Sterne in unseren Profilen und verweisen , wenn wir tun müssen , E / A - Datei in einigen der neuen Sprache. Ganz zu schweigen von der Exposition gegenüber Sprachen, mit denen wir uns nicht täglich beschäftigen.
So müssen Sie antworten:
- Erstellen Sie eine neue Textdatei mit dem Namen " fileio.txt ".
- Schreiben Sie die erste Zeile "Hallo" in die Textdatei.
- Hängen Sie die zweite Zeile "Welt" an die Textdatei an.
- Lesen Sie die zweite Zeile "Welt" in eine Eingabezeichenfolge.
- Drucken Sie die Eingabezeichenfolge in die Konsole.
Klärung:
- Sie sollten zeigen, wie dies in einer Programmiersprache pro Antwort funktioniert.
- Angenommen, die Textdatei existiert vorher nicht
- Sie müssen die Textdatei nach dem Schreiben der ersten Zeile nicht erneut öffnen
Keine besondere Einschränkung der Sprache.
C
, C++
, C#
, Java
, Objective-C
Sind alle großartig.
Wenn Sie wissen , wie es zu tun in Prolog
, Haskell
, Fortran
, Lisp
, oder Basic
dann bitte rechts weiter gehen.
quelle
Antworten:
Python 3
Klarstellungen
readlines () gibt eine Liste aller Zeilen in der Datei zurück. Daher führt der Aufruf von readlines () zum Lesen jeder einzelnen Zeile der Datei. In diesem speziellen Fall ist es in Ordnung, readlines () zu verwenden, da wir sowieso die gesamte Datei lesen müssen (wir wollen die letzte Zeile). Wenn unsere Datei jedoch viele Zeilen enthält und wir nur die n-te Zeile drucken möchten, ist es nicht erforderlich, die gesamte Datei zu lesen. Hier sind einige bessere Möglichkeiten, um die n-te Zeile einer Datei in Python abzurufen : Was ersetzt xreadlines () in Python 3? .
Was ist das mit Aussage? Die with-Anweisung startet einen Codeblock, in dem Sie die Variable f als Stream-Objekt verwenden können, das vom Aufruf von open () zurückgegeben wird. Wenn der with-Block endet, ruft Python f.close () automatisch auf. Dies garantiert, dass die Datei geschlossen wird, wenn Sie den with-Block beenden, egal wie oder wann Sie den Block verlassen (auch wenn Sie ihn über eine nicht behandelte Ausnahme beenden). Sie könnten f.close () explizit aufrufen, aber was ist, wenn Ihr Code eine Ausnahme auslöst und Sie nicht zum Aufruf von f.close () gelangen? Deshalb ist die with-Anweisung nützlich.
Sie müssen die Datei nicht vor jedem Vorgang erneut öffnen. Sie können den gesamten Code in einen mit Block schreiben.
Ich habe drei mit Blöcken verwendet, um den Unterschied zwischen den drei Operationen hervorzuheben: Schreiben (Modus 'w'), Anhängen (Modus 'a'), Lesen (Modus 'r', Standardeinstellung).
quelle
readlines()[1]
Beispielcode schreiben sollte . In diesem Fall wissen Sie vielleicht, dass die Datei nur zwei Zeilen enthält, aber jemand anderes, der munter davon ausgeht, dass es sich um eine gute Lösung handelt, versucht es möglicherweise mit einer Datei mit Millionen Zeilen und erhält eine ziemlich böse Überraschung.readlines()
Rückgabe eines Iterators (keine Liste) zitieren? Nur eine Anmerkung: Sie können normalerweise keinen Iterator indizieren.range
Objekt unterstützt speziell die Indizierung, die in O (1) erfolgt.LOLCODE
Die Spezifikationen sind gelinde gesagt lückenhaft , aber ich habe mein Bestes gegeben. Lass das Downvoting beginnen! :) Ich finde es immer noch eine lustige Übung.
quelle
Gehirn *** k
quelle
COBOL
Da hat sonst niemand ......
quelle
Haskell
Wenn Sie nur eine Datei lesen / schreiben möchten:
quelle
IO a
, die eine spezielle Compiler-Unterstützung für Nebenwirkungen bieten. (Reinheit bleibt an anderer Stelle erhalten, da alles, was eine Nebenwirkung ausführt oder beobachtet, vom Typ istIO a
, sodass das Typsystem sicherstellt, dass der Rest Ihres Programms rein bleibt.)IO
es sich um eine Monade handelt, aber deshalb dürfen keine Nebenwirkungen auftreten. Als Monade können Sie diese zwingend aussehende Syntax schreiben: Sie stellt auch sicher (auch mit spezieller Sprachunterstützung), dass die Nebenwirkungen in einer vernünftigen Reihenfolge auftreten, sodass Sie nicht aus der Datei lesen, bevor Sie darauf schreiben usw. .D.
quelle
Rubin
quelle
File.open
mit einem Block wird die Datei geöffnet, an den Block übergeben und dann automatisch geschlossen.C #
File.ReadLines(path).ElementAt(1)
ist nur .NET 4.0, die Alternative besteht darinFile.ReadAllLines(path)[1]
, die gesamte Datei in ein Array zu analysieren.quelle
ANSI C.
quelle
Shell-Skript (UNIX)
Eigentlich
sed -n "2p"
druckt der Teil die zweite Zeile, aber die Frage fragt, ob die zweite Zeile in einer Variablen gespeichert und dann gedruckt werden soll, also ... :)quelle
sed
), hier: stackoverflow.com/questions/3538156/…LINE=`foo`
erfasst die Ausgabe vonfoo
in die VariableLINE
.x86 Assembler (NASM) unter Linux
Ich habe asm seit 7 Jahren nicht mehr berührt, also musste ich ein bisschen Google verwenden, um dies zusammen zu hacken, aber es funktioniert trotzdem;) Ich weiß, dass es nicht 100% korrekt ist, aber hey: D.
OK, es funktioniert nicht. Entschuldigung. Während es
world
am Ende druckt, druckt es es nicht aus der Datei, sondern aus derecx
in Zeile 27 festgelegten.Verwendete Referenzen: 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
quelle
JavaScript - node.js
Erstens viele verschachtelte Rückrufe.
Ein bisschen sauberer:
quelle
node.js
Plattform verwendet. Siehe nodejs.orgCommon Lisp
quelle
Power Shell
quelle
gc
stattcat
macht Sinn :-)get-alias
gab mircat
zuerst (ich benutze PowerShell nicht viel).Shell-Skript
Hier ist ein Shell - Skript nur gebautet Befehle, anstatt Berufung auf externe Befehle wie
sed
odertail
wie in früheren Antworten getan haben.Wenn Sie wichtige Shell-Skripte schreiben, ist es ratsam, so viele integrierte Funktionen wie möglich zu verwenden, da das Erstellen eines separaten Prozesses langsam sein kann. Nach einem kurzen Test auf meinem Computer ist die
sed
Lösung etwa 20-mal langsamer als die Verwendungread
. Wenn Siesed
einmal anrufen , wie in diesem Fall, spielt es keine große Rolle, da es schneller ausgeführt wird, als Sie bemerken können, aber wenn Sie es hunderte oder tausende Male ausführen, kann es addieren.Für diejenigen, die mit der Syntax nicht vertraut sind
{
und}
eine Liste von Befehlen in der aktuellen Shell-Umgebung ausführen (im Gegensatz zu(
und)
die eine Subshell erstellen; wir müssen in der aktuellen Shell-Umgebung arbeiten, damit wir den Wert der Variablen später verwenden können). . Wir müssen die Befehle zusammenfassen, damit beide mit demselben Eingabestream arbeiten, der durch Umleiten von erstellt wurdefileio.txt
. Wenn wir einfach laufen würdenread < fileio.txt; read input < fileio.txt
, würden wir nur die erste Zeile erhalten, da die Datei zwischen den beiden Befehlen geschlossen und wieder geöffnet würde. Aufgrund einer Eigenart der Shell-Syntax ({
und}
sind reservierte Wörter im Gegensatz zu Metazeichen) müssen wir das{
und trennen}
aus dem Rest der Befehle mit Leerzeichen und beenden Sie die Liste der Befehle mit a;
.Das
read
eingebaute Argument verwendet die Namen der Variablen, in die eingelesen werden soll. Es verbraucht eine Eingabezeile, unterbricht die Eingabe durch Leerzeichen (technisch gesehen unterbricht es sie gemäß dem Inhalt von$IFS
, wobei standardmäßig ein Leerzeichen verwendet wird, wobei ein Leerzeichen bedeutet, dass es in ein beliebiges Leerzeichen, eine Registerkarte oder eine neue Zeile aufgeteilt wird) jedes Wort den Variablennamen in der angegebenen Reihenfolge und ordnet den Rest der Zeile der letzten Variablen zu. Da wir nur eine Variable angeben, wird nur die gesamte Zeile in diese Variable eingefügt. Wir verwenden die$input
Variable wieder, da es uns egal ist, was in der ersten Zeile steht (wenn wir Bash verwenden, können wir einfach keinen Variablennamen angeben, aber um portabel zu sein, müssen Sie immer mindestens einen Namen angeben).Beachten Sie, dass Sie zwar wie ich hier Zeilen nacheinander lesen können, ein viel häufigeres Muster jedoch darin besteht, sie in eine while-Schleife zu packen:
quelle
Clojure
Oder gleichwertig mit dem Threading-Makro
->
(auch als Paren-Entferner bezeichnet):quelle
spit
ist wirklich der Name der Funktion zum Schreiben in eine Datei?F #
quelle
BASIC
Ich habe BASIC seit fast 10 Jahren nicht mehr verwendet, aber diese Frage gab mir einen Grund, mein Wissen schnell aufzufrischen. :) :)
quelle
Ziel c
quelle
Perl
quelle
perl -we 'for (q{ps aux |}){ open _; print <_>; }'
R:
quelle
PHP
quelle
?>
.: Framework.zend.com/manual/en/…Java
quelle
C ++
oder etwas weniger pedantisch,
quelle
<limits>
nur einschließen muss, um zu erkennen,ignore
dass die Zeilengröße nicht begrenzt ist.Gehen
quelle
os.O_RDWR | os.O_CREATE, 0666
Müll überhaupt für grundlegende Datei-E / A in Go erforderlich?Erlang
Wahrscheinlich nicht der idiomatischste Erlang, aber:
quelle
Emacs Lisp
Trotz allem, was manche Leute sagen, ist Emacs hauptsächlich ein Texteditor [1]. Während Emacs Lisp zur Lösung aller Arten von Problemen verwendet werden kann, ist es für die Anforderungen eines Texteditors optimiert. Da Texteditoren (offensichtlich) ganz bestimmte Anforderungen an den Umgang mit Dateien haben, wirkt sich dies auf die dateibezogenen Funktionen von Emacs Lisp aus.
Grundsätzlich bedeutet dies, dass Emacs Lisp keine Funktionen zum Öffnen und teilweisen Lesen einer Datei als Stream bietet. Ebenso können Sie keine Datei anhängen, ohne zuerst die gesamte Datei zu laden. Stattdessen wird die Datei vollständig [2] in einen Puffer [3] eingelesen, bearbeitet und dann erneut in einer Datei gespeichert.
Für Pflichtaufgaben, für die Sie Emacs Lisp verwenden würden, ist dies geeignet. Wenn Sie etwas tun möchten, bei dem nicht dieselben Funktionen bearbeitet werden müssen, können Sie diese verwenden.
Wenn Sie immer wieder an eine Datei anhängen möchten, ist dies mit einem enormen Overhead verbunden, der jedoch wie hier gezeigt möglich ist. In der Praxis nehmen Sie normalerweise manuell oder programmgesteuert Änderungen an einem Puffer vor, bevor Sie in eine Datei schreiben (kombinieren Sie einfach die ersten beiden S-Ausdrücke im folgenden Beispiel).
[1] Zumindest würde ich nicht so weit gehen, es als Betriebssystem zu bezeichnen. eine alternative Benutzeroberfläche ja, ein Betriebssystem nein.
[2] Sie können nur Teile einer Datei laden, dies kann jedoch nur byteweise angegeben werden.
[3] Ein Puffer ist sowohl ein Datentyp, der einer Zeichenfolge ähnlich ist, als auch das "Ding, das Sie beim Bearbeiten einer Datei sehen". Während der Bearbeitung wird ein Puffer in einem Fenster angezeigt, aber Puffer müssen nicht unbedingt für den Benutzer sichtbar sein.
Bearbeiten: Wenn Sie möchten, dass der Text in den Puffer eingefügt wird, müssen Sie ihn offensichtlich sichtbar machen und zwischen den Aktionen schlafen. Da Emacs den Bildschirm normalerweise nur beim Anzeigen auf Benutzereingaben erneut anzeigt (und das Schlafen nicht mit dem Warten auf Eingaben identisch ist), müssen Sie auch die erneute Anzeige erzwingen. Dies ist in diesem Beispiel erforderlich (verwenden Sie es anstelle des zweiten Geschlechts). in der Praxis musste ich "redisplay" nicht einmal verwenden - also ja, das ist hässlich, aber ...
quelle
Windows-Batchdateien - Version 2
Um diese letzte schreckliche Suchschleife zu erklären, wird davon ausgegangen, dass die Datei nur eine Hallo-Welt (Newline) enthält. Es wird also nur die erste Zeile übersprungen und nur die zweite wiedergegeben.
Änderungsprotokoll
2 - Opps, müssen die Anforderungen falsch verstanden haben oder sie haben sich an mir geändert. Liest jetzt die letzte Zeile aus der Datei
quelle
Scala:
Standardbibliothek verwenden:
Verwenden der Scala-ARM-Bibliothek von Josh Suereth :
Da viele Leute denselben Dateideskriptor zum Schreiben der beiden Zeichenfolgen verwendet haben, beziehe ich dies auch in meine Antwort ein.
Standardbibliothek verwenden:
Verwenden der Scala-ARM-Bibliothek von Josh Suereth :
quelle
getLines().toList()
solltegetLines().toSeq
das faul sein?Groovy
quelle