Datei-E / A in jeder Programmiersprache [geschlossen]

127

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, rubyund 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:

  1. Erstellen Sie eine neue Textdatei mit dem Namen " fileio.txt ".
  2. Schreiben Sie die erste Zeile "Hallo" in die Textdatei.
  3. Hängen Sie die zweite Zeile "Welt" an die Textdatei an.
  4. Lesen Sie die zweite Zeile "Welt" in eine Eingabezeichenfolge.
  5. 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-CSind alle großartig.

Wenn Sie wissen , wie es zu tun in Prolog, Haskell, Fortran, Lisp, oder Basicdann bitte rechts weiter gehen.

Brock Woolf
quelle
9
Das Problem dabei ist, dass es bei der Suche nach einer bestimmten Sprache nicht angezeigt wird, da es nicht mit jeder Sprache markiert ist oder sein kann.
ChrisF
21
Ich verstehe nicht, warum diese Frage geschlossen ist. Ist der Zweck dieser Website nicht, Menschen zu helfen, Informationen zu finden? Wenn jemand weiß, wie man etwas (wie IO) in C macht, und lernen möchte, wie man dasselbe in Python macht, kann dies ihm helfen, indem er beide nebeneinander sehen kann.
Slapout
18
Ich verstehe auch nicht, warum dies geschlossen ist. Es scheint nur so, weil es nicht die Worte "... in der geringsten Anzahl von Zeichen ..." enthält, was ziemlich dumm ist. Code Golf ist eine lustige Übung. Aber ist es wirklich nützlich, alle Rosetta-Stein-Fragen zu verschleiern, winzigen Code in allen Antworten?
Spencer Nelson
12
Ich verstehe nicht, wie dies zu einer Q & A-Site passt: Zumindest bei Code Golf gibt es einen objektiven Standard, nach dem über Antworten abgestimmt werden kann: Die kürzeste oder klügste Antwort erhält die meisten Stimmen. Mit diesem: Was ist es, wie viele Leute mögen Haskell? Fragen wie diese sind wie der Versuch, jede mögliche Art von Inhalten in ein System zu integrieren, das nur für einen ausgelegt ist. Was ist los mit dem Rest des Internets, um damit umzugehen?
11
Warum das nicht gut funktioniert. Keine Informationen über die Vor- und Nachteile der einzelnen Ansätze (welche Sprachen unterstützen nur einen Weg?). Keine Diskussion über die Kompromisse und tiefgreifenden Probleme in jeder Sprache. Eingeschränkter Anwendungsbereich, der impliziert, dass die Notwendigkeit eines Bajiliions "in jeder Sprache" separate Fragen enthält. Und vor allem gibt es keine Community-Moderation der Qualität jeder Antwort. Warum sage ich keine Moderation, wenn Leute über sie abstimmen? Weil es nur eine Antwort für jede Sprache geben soll und die Leute nicht genug Antworten lesen, um mehrere Alternativen in ihrem Bereich zu sehen.
dmckee --- Ex-Moderator Kätzchen

Antworten:

48

Python 3

with open('fileio.txt', 'w') as f:
   f.write('hello')
with open('fileio.txt', 'a') as f:
   f.write('\nworld')
with open('fileio.txt') as f:
   s = f.readlines()[1]
print(s)

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.

    with open('fileio.txt', 'w+') as f:
        f.write('hello')
        f.write('\nworld')
        s = f.readlines()[1]
    print(s)
    

    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).

snakile
quelle
19
Ich denke wirklich nicht, dass jemand jemals 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.
Porculus
14
@Porculus mit readlines () gehen wir nicht alle Zeilen in der Datei durch. Dies ist Python 3. readlines () gibt einen Iterator (keine Liste) zurück. Daher werden nur die ersten beiden Zeilen der Datei gelesen. Dies ähnelt xreadlines () in Python 2 (das in Python 3 nicht vorhanden ist).
Snakile
7
@snakile: Könnten Sie bitte etwas zur Unterstützung der readlines()Rückgabe eines Iterators (keine Liste) zitieren? Nur eine Anmerkung: Sie können normalerweise keinen Iterator indizieren.
SilentGhost
8
@SilentGhost Ich zitiere "Dive in Python 3": "Die readlines () -Methode gibt jetzt einen Iterator zurück, ist also genauso effizient wie xreadlines () in Python 2". Suchen Sie diese Anweisung in: diveintopython3.org/porting-code-to-python-3-with-2to3.html . Zweitens können Sie in Python 3 einen Iterator indizieren. Geben Sie range (10) [4] in die Shell ein (range () gibt im Gegensatz zu Python 2, in dem range () eine Liste zurückgibt) auch einen Iterator in Python 3 zurück. Beachten Sie, dass der Bereich (N) [i] in O (i), nicht in O (1) und nicht in O (N) ausgeführt wird.
Snakile
5
@snakile: Ihre Kommentare sind auf mehreren Ebenen falsch. Zuerst gibt readlines eine Liste in Python 3 zurück (testen und sehen). Der angegebene Code liest also die gesamte Datei. Zweitens können Iteratoren in Python 2 oder 3 nicht indiziert werden. Das rangeObjekt unterstützt speziell die Indizierung, die in O (1) erfolgt.
Interjay
242

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.

HAI
CAN HAS STDIO?
PLZ OPEN FILE "FILEIO.TXT" ITZ "TehFilez"?
    AWSUM THX
        BTW #There is no standard way to output to files yet...
        VISIBLE "Hello" ON TehFilez
        BTW #There isn't a standard way to append to files either...
        MOAR VISIBLE "World" ON TehFilez
        GIMMEH LINES TehLinez OUTTA TehFilez
        I HAS A SecondLine ITZ 1 IN MAH TehLinez
        VISIBLE SecondLine
    O NOES
        VISIBLE "OH NOES!!!"
KTHXBYE
Danita
quelle
28
Ich glaube nicht, dass es eine andere Sprache gibt, die diese Eigenschaft hat, um mich buchstäblich dazu zu bringen ... lol.
Ionuț G. Stan
85
Ist es traurig, dass ich denke, dass LOLCODE besser lesbar ist als alles andere, was ich gesehen habe?
Joel
13
Es ist interessant, wie sehr es sich wie eine natürliche Sprache anfühlt.
Abhinav Sarkar
19
Zu sagen, dass Sie eine Herabstufung erwarten, ist eine Garantie für Upvotes für SO, da die umgekehrte Psychologie eine Reflexaktion für einen Programmierer ist.
Brock Woolf
13
Die PLZ? / AWSUM THX / O NOES ist einfach großartig. Das kommt mir irgendwie allmächtig vor.
Calvin1602
43

Gehirn *** k

,------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-],------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]
Svisstack
quelle
26
Hast du ein '-' verpasst? ;)
Aiden Bell
2
Oh die Anstrengung. Wie lange hat das Schreiben gedauert?
Riduidel
Und Sie können das nicht auf mehrere Zeilen aufteilen? Beste Sprache aller Zeiten
TheIronKnuckle
42

COBOL

Da hat sonst niemand ......

IDENTIFICATION DIVISION.
PROGRAM-ID.  WriteDemo.
AUTHOR.  Mark Mullin.
* Hey, I don't even have a cobol compiler

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT StudentFile ASSIGN TO "STUDENTS.DAT"
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD TestFile.
01 TestData.
   02  LineNum        PIC X.
   02  LineText       PIC X(72).

PROCEDURE DIVISION.
Begin.
    OPEN OUTPUT TestFile
    DISPLAY "This language is still around."

    PERFORM GetFileDetails
    PERFORM UNTIL TestData = SPACES
       WRITE TestData 
       PERFORM GetStudentDetails
    END-PERFORM
    CLOSE TestFile
    STOP RUN.

GetFileDetails.
    DISPLAY "Enter - Line number, some text"
    DISPLAY "NXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    ACCEPT  TestData.
Mark Mullin
quelle
2
Dies sollte nicht weniger als 1 Million Mal für pure Großartigkeit +1
Brock Woolf
1
+1 für "Diese Sprache gibt es noch." = D
fehlender Faktor
3
Seien Sie vorsichtig, wenn Sie dies zu Hause versuchen. Ihr Cobol-Compiler mag diese modernen Zeilen mit variabler Länge möglicherweise nicht ...
Stephan Eggermont
Ja, das bringt einige rostige alte Erinnerungen zurück. Ich glaube nicht, dass es die Anforderungen erfüllt ...
EvilTeach
Ich schreibe gerade Code in AcuCOBOL! Wo ist übrigens der "I" -Teil von "I / O"?
Buggabill
39

Haskell

main :: IO ()
main = let filePath = "fileio.txt" in
       do writeFile filePath "hello"
          appendFile filePath "\nworld"
          fileLines <- readFile filePath
          let secondLine = (lines fileLines) !! 1
          putStrLn secondLine

Wenn Sie nur eine Datei lesen / schreiben möchten:

main :: IO ()
main = readFile "somefile.txt" >>= writeFile "someotherfile.txt" 
Ionuț G. Stan
quelle
7
Ahh der 'allmächtige' Haskell. Vielen Dank für Ihren Beitrag :)
Brock Woolf
3
@Andreas Rejbrand Ich bin mir fast sicher, dass er ein "
Sein" vergessen hat
4
Es gibt eine Reihe anderer Ansätze für grundlegende E / A in Haskell, die in Haskell nützlich / wichtig werden, sobald Sie bestimmte Arten von Apps ausführen. Mit den Text- und Bytestring-Paketen für cabal / hackage können Sie mit verschiedenen Codierungen umgehen, und verschiedene Pakete im Iteratee-Stil wie iteratee und enumerate stellen eine "bekannteste Abstraktion" für inkrementelle io dar. Wichtig sind auch das Parsen von Bibliotheken wie parsec und das inkrementelle Testen nur der attoparsec-Bibliothek. Haskeller haben einen sehr gründlichen Ansatz gewählt, um die Auswahl des Designs zu untersuchen. Nicht lebensfähige Beispiele sind Lazy Io und Fortsetzungen
Carter Tazio Schonwald
4
Yuji: Im Grunde genommen durch Betrug. Haskell ist eine reine Funktionssprache, mit Ausnahme aller Arten 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 ist IO a, sodass das Typsystem sicherstellt, dass der Rest Ihres Programms rein bleibt.)
Sam Stokes
4
Es kommt also vor, dass IOes 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. .
Sam Stokes
35

D.

module d_io;

import std.stdio;


void main()
{
    auto f = File("fileio.txt", "w");
    f.writeln("hello");
    f.writeln("world");

    f.open("fileio.txt", "r");
    f.readln;
    auto s = f.readln;
    writeln(s);
}
Bernard
quelle
10
+1, so viel schöner und lesbarer als die C ++ - Version! Ich träume von einem Tag, an dem D C und C ++ vollständig ersetzt. :-)
fehlender Faktor
10
Nett. Vielleicht sollte ich eines Tages D lernen.
Hilfsmethode
34

Rubin

PATH = 'fileio.txt'
File.open(PATH, 'w') { |file| file.puts "hello" }
File.open(PATH, 'a') { |file| file.puts "world" }
puts line = File.readlines(PATH).last
Wayne Conrad
quelle
2
+1 Schön, aber um genau zu sein, setzen Sie die Eingabe nicht in eine Variable, bevor Sie sie in die Konsole schreiben.
Lasse Espeholt
3
@lasseespeholt, du hast recht. Ich habe es repariert.
Wayne Conrad
5
Kein Grund, varname in Großbuchstaben zu schreiben und 'PATH' zu sagen. Sagen Sie einfach "Pfad".
OTZ
2
@otz Es ist eine Konstante. Er hätte es aber "Pfad" nennen können, eine Konstante in Ruby muss nur mit einem Großbuchstaben beginnen.
Sirupsen
1
@ Thomas Ahle: Bei Verwendung File.openmit einem Block wird die Datei geöffnet, an den Block übergeben und dann automatisch geschlossen.
Matchu
33

C #

string path = "fileio.txt";
File.WriteAllLines(path, new[] { "hello"}); //Will end it with Environment.NewLine
File.AppendAllText(path, "world");

string secondLine = File.ReadLines(path).ElementAt(1);
Console.WriteLine(secondLine);

File.ReadLines(path).ElementAt(1)ist nur .NET 4.0, die Alternative besteht darin File.ReadAllLines(path)[1], die gesamte Datei in ein Array zu analysieren.

Lasse Espeholt
quelle
1
es ist ziemlich kurz in C #.
Brock Woolf
13
HINWEIS: File.ReadLines ist spezifisch für .NET 4
kirk.burleson
5
Was für eine unangenehm aussehende Syntax C # hat
Aiden Bell
3
@Aiden Bell: relativ zu welcher Sprache?
Zfedoran
2
@Aiden Bell - Diese Antwort versucht kurz und bündig zu sein. Es gibt viele "schöne" Möglichkeiten, dasselbe in C # zu erreichen. Weitere realistische Beispiele finden Sie unter dotnetperls.com/file-handling .
Dan Diplo
29

ANSI C.

#include <stdio.h>
#include <stdlib.h>

int /*ARGSUSED*/
main(char *argv[0], int argc) {
   FILE *file;
   char buf[128];

   if (!(file = fopen("fileio.txt", "w")) {
      perror("couldn't open for writing fileio.txt");
      exit(1);
   }

   fprintf(file, "hello");
   fclose(file);

   if (!(file = fopen("fileio.txt", "a")) {
      perror("couldn't opened for appening fileio.txt");
      exit(1);
   }

   fprintf(file, "\nworld");
   fclose(file);

   if (!(file = fopen("fileio.txt", "r")) {
      perror("couldn't open for reading fileio.txt");
      exit(1);
   }

   fgets(buf, sizeof(buf), file);
   fgets(buf, sizeof(buf), file);

   fclose(file);

   puts(buf);

   return 0;
}
Maister
quelle
Gute Antwort. Vielen Dank für Ihren Beitrag +1
Brock Woolf
Warum rufst du fgets () zweimal auf?
Kirk.burleson
2
Weil die zweite Zeile diejenige ist, die wir auf stdout drucken möchten
JeremyP
1
#include <stdio.h> int main (void) {FILE file; char buf [128]; file = fopen ("fileio.txt", "w"); if (! file) gehe zu error; fputs ("Hallo \ n", Datei); fflush (Datei); fputs ("world \ n", Datei); fclose (Datei); file = fopen ("fileio.txt", "r"); if (! file) gehe zu error; fgets (buf, sizeof (buf), file); / überspringe 'hallo' / fgets (buf, sizeof (buf), file); / get 'word' * / fclose (Datei); fputs (buf, stdout); return 0; Fehler: fputs ("Datei konnte nicht geöffnet werden \ n", stderr); return 1; }
FelipeC
Schöne saubere Codierung (viele anständige Fehlerprüfungen) im ursprünglichen C-Post (was die Länge etwas ausbläst).
Xagyg
29

Shell-Skript (UNIX)

#!/bin/sh
echo "hello" > fileio.txt
echo "world" >> fileio.txt
LINE=`sed -ne2p fileio.txt`
echo $LINE

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 ... :)

robertbasic
quelle
9
Ich weiß nicht warum, aber ich liebe das :)
Federico klez Culloca
Natürlich zählt es. Schöne Antwort und vielen Dank für Ihren Beitrag +1
Brock Woolf
Warum nicht den Standard an / dev / null senden?
Gumbo
Es gibt eine etwas einfachere und schnellere Version, die nur Shell-Builtins verwendet (im Gegensatz zum Verzichten auf einen separaten Prozess zum Aufrufen sed), hier: stackoverflow.com/questions/3538156/…
Brian Campbell
@ Gumbo, wie würdest du dann die zweite Zeile bekommen? LINE=`foo`erfasst die Ausgabe von fooin die Variable LINE.
Strager
27

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 worldam Ende druckt, druckt es es nicht aus der Datei, sondern aus der ecxin Zeile 27 festgelegten.

section .data
hello db 'hello',10
helloLen equ $-hello
world db 'world',10
worldLen equ $-world
helloFile db 'hello.txt'

section .text
global _start

_start:
mov eax,8
mov ebx,helloFile
mov ecx,00644Q
int 80h

mov ebx,eax

mov eax,4
mov ecx, hello
mov edx, helloLen
int 80h

mov eax,4
mov ecx, world
mov edx, worldLen
int 80h

mov eax,6
int 80h

mov eax,5
mov ebx,helloFile
int 80h

mov eax,3
int 80h

mov eax,4
mov ebx,1
int 80h

xor ebx,ebx
mov eax,1
int 80h

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

robertbasic
quelle
Wirst du es korrigieren, damit es zu 100% funktioniert? Wenn nicht, löschen Sie es, damit eine funktionierende Version ihren Platz einnehmen kann.
Kirk.burleson
4
Was irgendwie lustig ist, ist, dass das Beispiel in C, das eine höhere Sprache sein soll, ungefähr so ​​lang ist wie dieses ... =)
Jani Hartikainen
1
@Jani: Aber zumindest ist es etwas einfacher zu verstehen.
sbi
Dachte, es war zuerst für DOS :)
mlvljr
21

JavaScript - node.js

Erstens viele verschachtelte Rückrufe.

var fs   = require("fs");
var sys  = require("sys");
var path = "fileio.txt";

fs.writeFile(path, "hello", function (error) {
    fs.open(path, "a", 0666, function (error, file) {
        fs.write(file, "\nworld", null, "utf-8", function () {
            fs.close(file, function (error) {
                fs.readFile(path, "utf-8", function (error, data) {
                    var lines = data.split("\n");
                    sys.puts(lines[1]);
                });
            });
        });
    });
});

Ein bisschen sauberer:

var writeString = function (string, nextAction) {
    fs.writeFile(path, string, nextAction);
};

var appendString = function (string, nextAction) {
    return function (error, file) {
        fs.open(path, "a", 0666, function (error, file) {
            fs.write(file, string, null, "utf-8", function () {
                fs.close(file, nextAction);
            });
        });
    };
};

var readLine = function (index, nextAction) {
    return function (error) {
        fs.readFile(path, "utf-8", function (error, data) {
            var lines = data.split("\n");
            nextAction(lines[index]);
        });
    };
};

var writeToConsole = function (line) {
    sys.puts(line);
};

writeString("hello", appendString("\nworld", readLine(1, writeToConsole)));
Ionuț G. Stan
quelle
@ Ionut: Danke für Ihre vielen Beiträge +1
Brock Woolf
4
@ Dave, es ist nicht das JS, das in den Browsern gefunden wird. Ich meine, syntaktisch und semantisch ist es das gleiche JS, nur die Standardbibliothek ist anders. Ich habe die stdlib der node.jsPlattform verwendet. Siehe nodejs.org
Ionuț G. Stan
5
Dieser Code schreit nach Fortsetzungen. Ich kann seine Tränen hören.
Matt
2
Ist es nicht lustig, dass die Anzahl der Zeilen fast mit der der ASM-Lösung im Erdgeschoss übereinstimmt?
kizzx2
1
@Matt ja, Fortsetzungen oder Monaden würden auch hier helfen.
Martijn
21

Common Lisp

(defun main ()
  (with-open-file (s "fileio.txt" :direction :output :if-exists :supersede)
    (format s "hello"))
  (with-open-file (s "fileio.txt" :direction :io :if-exists :append)
    (format s "~%world")
    (file-position s 0)
    (loop repeat 2 for line = (read-line s nil nil) finally (print line))))
twopoint718
quelle
1
Für eine Sprache namens "lisp" sollten viel mehr "s" Buchstaben beteiligt sein :)
iwasrobbed
18

Power Shell

sc fileio.txt 'hello'
ac fileio.txt 'world'
$line = (gc fileio.txt)[1]
$line
Lasse Espeholt
quelle
3
Das ist schön und sauber. Yays Powershell.
Jay Bazuzi
Ich stimme Ihrer Logik bezüglich des Zitierens zu. Der Grund, warum ich sie entfernt habe, war, dass ich festgestellt habe, dass dieses Skript eigentlich ganz oben ist, weil es kompakt ist, also wollte ich es mir noch kleiner machen - aber wir lassen es klar sein :). Und die Verwendung von gcstatt catmacht Sinn :-) get-aliasgab mir catzuerst (ich benutze PowerShell nicht viel).
Lasse Espeholt
4
Verdammt, gibt es etwas kürzeres?
0fnt
18

Shell-Skript

Hier ist ein Shell - Skript nur gebautet Befehle, anstatt Berufung auf externe Befehle wie sedoder tailwie in früheren Antworten getan haben.

#!/bin/sh

echo hello > fileio.txt             # Print "hello" to fileio.txt
echo world >> fileio.txt            # Print "world" to fileio.txt, appending
                                    # to what is already there
{ read input; read input; } < fileio.txt  
                                    # Read the first two lines of fileio.txt,
                                    # storing the second in $input
echo $input                         # Print the contents of $input

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 sedLösung etwa 20-mal langsamer als die Verwendung read. Wenn Sie sedeinmal 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 wurde fileio.txt. Wenn wir einfach laufen würden read < 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 readeingebaute 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 $inputVariable 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:

while read foo bar baz
do
  process $foo $bar $baz
done < input.txt
Brian Campbell
quelle
3
Sehr schön. Ich habe etwas gelernt (wenn auch vorübergehend).
Potatoswatter
Danke für deinen Beitrag Brian.
Brock Woolf
Total krank! Auf eine gute Weise :-)
Hilfsmethode
18

Clojure

(use '[clojure.java.io :only (reader)])

(let [file-name "fileio.txt"]
  (spit file-name "hello")
  (spit file-name "\nworld" :append true)
  (println (second (line-seq (reader file-name)))))

Oder gleichwertig mit dem Threading-Makro ->(auch als Paren-Entferner bezeichnet):

(use '[clojure.java.io :only (reader)])

(let [file-name "fileio.txt"] 
  (spit file-name "hello") 
  (spit file-name "\nworld" :append true) 
  (-> file-name reader line-seq second println))
Abhinav Sarkar
quelle
1
WTF, in den letzten 50 Jahren hat fast niemand gesagt, dass Lisp / Scheme rockt!
Ionuț G. Stan
11
Warten Sie, spitist wirklich der Name der Funktion zum Schreiben in eine Datei?
Sam Stokes
4
Clojure rockt definitiv nicht!
Kirk.burleson
1
@ [Sam Stokes] Im Kern gibt es eine Funktion namens slurp, die eine gesamte Datei in einen String einliest und zurückgibt. Spucke macht genau das Gegenteil. Was ist das Problem? Es gibt andere Funktionen wie line-seq, die ähnliche Dinge auf unterschiedliche Weise ausführen.
Rayne
4
@ kirk.burleson Rockt sicherlich mehr als Java. :)
Rayne
17

F #

let path = "fileio.txt"
File.WriteAllText(path, "hello")
File.AppendAllText(path, "\nworld")

let secondLine = File.ReadLines path |> Seq.nth 1
printfn "%s" secondLine
Lasse Espeholt
quelle
1
F #. Nett. Vielen Dank für Ihren Beitrag.
Brock Woolf
16

BASIC

Ich habe BASIC seit fast 10 Jahren nicht mehr verwendet, aber diese Frage gab mir einen Grund, mein Wissen schnell aufzufrischen. :) :)

OPEN "fileio.txt" FOR OUTPUT AS 1
PRINT #1, "hello"
PRINT #1, "world"
CLOSE 1

OPEN "fileio.txt" FOR INPUT AS 1
LINE INPUT #1, A$
LINE INPUT #1, A$
CLOSE 1

PRINT A$
casablanca
quelle
Es ist erstaunlich, dass Sie dies nach 10 Jahren immer noch tun können!. Gut gemacht und vielen Dank für Ihren Beitrag.
Brock Woolf
Ich habe es natürlich nicht auf den Kopf gestellt: Ich habe ein paar Minuten gebraucht, um ein paar Sachen nachzuschlagen.
Casablanca
Ja natürlich. Immer noch gut gemacht.
Brock Woolf
Benötigen Sie keine Zeilennummern in der klassischsten Version von BASIC?
Yuji
@ Yuji: In der "klassischsten Version", ja, aber ich glaube, keine Version seit den frühen 90ern hat sie benötigt.
Casablanca
16

Ziel c

NSFileHandle *fh = [NSFileHandle fileHandleForUpdatingAtPath:@"fileio.txt"];

[[NSFileManager defaultManager] createFileAtPath:@"fileio.txt" contents:nil attributes:nil];

[fh writeData:[@"hello" dataUsingEncoding:NSUTF8StringEncoding]];
[fh writeData:[@"\nworld" dataUsingEncoding:NSUTF8StringEncoding]];

NSArray *linesInFile = [[[NSString stringWithContentsOfFile:@"fileio.txt" 
                                             encoding:NSUTF8StringEncoding 
                                                error:nil] stringByStandardizingPath] 
                          componentsSeparatedByString:@"\n"];

NSLog(@"%@", [linesInFile objectAtIndex:1]);
Brock Woolf
quelle
17
Ich habe Objective-C noch nie gemocht. Die Syntax scheint einfach so fremd zu sein, wenn man aus einer Sprache wie Java kommt.
Faisal Abid
5
Das Geheimnis von Objective-C ist, dass Xcode die gesamte Code-Vervollständigung für Sie erledigt. Sie müssen sich nicht an die langen Methodennamen erinnern. Sie machen Ihren Code sicherlich viel lesbarer
Brock Woolf
7
Und ich dachte, die C ++ - Syntax sah schon am schlechtesten aus.
Kröte
6
Objective-C sieht nur schlecht aus, weil der Textmarker für die Stackoverflow-Syntax nicht richtig gefärbt wird.
Brock Woolf
4
Ich kann nicht glauben, dass dies so weit unten auf der Liste steht! Auch die Java-Leute, die kommentierten, dass Objective-C hässlich ist, haben Sie gesehen, wie viele Zeilen benötigt wurden, um dieselbe Datei zu schreiben? Früher war ich ein Java-Enthusiast, aber ich denke, Objective-C hat sich in mein Herz eingeschlichen.
Kyle
16

Perl

#!/usr/bin/env perl

use 5.10.0;
use utf8;
use strict;
use autodie;
use warnings qw<  FATAL all     >;
use open     qw< :std  :utf8    >;

use English  qw< -no_match_vars >;

# and the last shall be first
END { close(STDOUT) }

my $filename = "fileio.txt";
my($handle, @lines);

$INPUT_RECORD_SEPARATOR = $OUTPUT_RECORD_SEPARATOR = "\n";

open($handle, ">",  $filename);
print $handle "hello";
close($handle);

open($handle, ">>", $filename);
print $handle "world";
close($handle);

open($handle, "<",  $filename);
chomp(@lines = <$handle>);
close($handle);

print STDOUT $lines[1];
Vivin Paliath
quelle
15
Was ist mit lexikalischen Dateihandles, 3 Argumente offen?
MkV
6
Nicht lexikalische Dateihandles sollten niemals für Stack Overflow verwendet werden. In der Praxis besteht selten Bedarf an ihnen, und Anfängern sollte niemals gezeigt werden, dass sie überhaupt existieren.
Ether
4
Gleiches gilt für zwei offene Argumente: Sie sollten es niemals für Stack Overflow verwenden und wahrscheinlich auch nicht in der Praxis.
rpkelly
2
Ich verwende offene und lexikalische Dateihandles mit 3 Argumenten so oft, dass ich es praktisch als Syntaxfehler betrachte, wenn ich es sehe. Und so sollte es auch sein. Ich denke darüber nach, ein Modul zu schreiben, um es so zu machen.
Kent Fredric
2
"Sogar unary open hat seinen Nutzen", es hat seinen Nutzen, ja, aber ich fühlte mich an dem Tag, an dem ich herausgefunden habe, wie das funktioniert, missbraucht und werde jedes Mal "Sicher gibt es einen anderen Weg" sagen, wenn ich jemanden sehe, der glaubt, dass er es braucht. perl -we 'for (q{ps aux |}){ open _; print <_>; }'
Kent Fredric
15

R:

cat ("Hallo \ n", file = "fileio.txt")
cat ("world \ n", file = "fileio.txt", append = TRUE)
line2 = readLines ("fileio.txt", n = 2) [2]
Katze (Zeile 2)
David F.
quelle
15

PHP

<?php

$filePath = "fileio.txt";

file_put_contents($filePath, "hello");
file_put_contents($filePath, "\nworld", FILE_APPEND);

$lines = file($filePath);

echo $lines[1];

// closing PHP tags are bad practice in PHP-only files, don't use them
Ionuț G. Stan
quelle
Das ist großartig. Danke für den Beitrag.
Brock Woolf
20
Alternativ können Sie die C-Implementierung übernehmen und Dollarzeichen hinzufügen.
Kendall Hopkins
@strager Ich habe keine Ahnung. Es gibt Leute, die nicht wissen, dass es optimal ist und dass es ohne es tatsächlich besser ist.
Ionuț G. Stan
6
Nur für den Fall, dass jemand neugierig ist, ist der Grund, warum er das schließende Tag weggelassen hat, der, dass Sie den Fehler "Header bereits gesendet" erhalten, wenn Sie es einschließen und nachgestellte Leerzeichen lassen.
Bill H
Referenz für Nr ?>.: Framework.zend.com/manual/en/…
cdmckay
15

Java

import java.io.*;
import java.util.*;

class Test {
  public static void  main(String[] args) throws IOException {
    String path = "fileio.txt";
    File file = new File(path);

    //Creates New File...
    try (FileOutputStream fout = new FileOutputStream(file)) {
      fout.write("hello\n".getBytes());
    }

    //Appends To New File...
    try (FileOutputStream fout2 = new FileOutputStream(file,true)) {
      fout2.write("world\n".getBytes());
    }

    //Reading the File...
    try (BufferedReader fin = new BufferedReader(new FileReader(file))) {
      fin.readLine();
      System.out.println(fin.readLine());
    }       
  }
}
st0le
quelle
36
@Brock: Heutzutage ist Java nicht langsam. Nur ausführlich, aber nicht langsam. Bitte machen Sie keine solchen Kommentare; tut uns JVM-Leuten weh. : '|
fehlender Faktor
9
Wer sagt, Java sei langsam, ist entweder ein blinder Java-Hasser oder lebt unter einem Felsen. Java kann so schnell wie, wenn nicht sogar schneller als C sein, mit Plattformunabhängigkeit zum Booten.
NullUserException
4
@ Missing Faktor: Und so?
Jerry Coffin
19
Die Ausführungsgeschwindigkeit ist die am meisten verzögerte Form von Pisswettbewerben, die Programmierer haben. Es geht immer darum, das richtige Werkzeug für den Job auszuwählen, eine zufällige Metrik wie die Ausführungsgeschwindigkeit auszuwählen und wichtige Haufen zuzuweisen, ist einfach albern, zumal die Ausführungsgeschwindigkeit für die überwiegende Mehrheit der Aufgaben nicht so wichtig ist, solange sie es ist ist schnell genug (was Java für fast alles ist)
Matt Briggs
11
"Festverdrahtung ist schneller als Maschinencode", "Maschinencode ist schneller als asm", "asm ist schneller als C", "C ist schneller als Java", "bla bla bla" ... Haben Sie überhaupt eine Ahnung, wie viel Indirektion ist schon zwischen Maschinencode und CPU? Mikrocode, Predictive Optimizer, Befehls- / Daten-Caches, Decoder usw., ganz zu schweigen vom Nichtdeterminismus, der durch die dynamische Zuordnung in C / asm verursacht wird. Java und andere sichere Sprachen sind nur ein weiterer kleiner Schritt der Indirektion, es ist keine große Sache. Sie können entweder für immer in Ihrer primitiven Form bleiben oder sich mit uns weiterentwickeln.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
14

C ++

#include <limits>
#include <string>
#include <fstream>
#include <iostream>

int main() {
    std::fstream file( "fileio.txt",
        std::ios::in | std::ios::out | std::ios::trunc  );
    file.exceptions( std::ios::failbit );   

    file << "hello\n" // << std::endl, not \n, if writing includes flushing
         << "world\n";

    file.seekg( 0 )
        .ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
    std::string input_string;
    std::getline( file, input_string );

    std::cout << input_string << '\n';
}

oder etwas weniger pedantisch,

#include <string>
#include <fstream>
#include <iostream>
using namespace std;

int main() {
    fstream file( "fileio.txt", ios::in | ios::out | ios::trunc  );
    file.exceptions( ios::failbit );   

    file << "hello" << endl
         << "world" << endl;

    file.seekg( 0 ).ignore( 10000, '\n' );
    string input_string;
    getline( file, input_string );

    cout << input_string << endl;
}
Potatoswatter
quelle
1
Toll! Vielen Dank für Ihren Beitrag +1
Brock Woolf
14
Ich habe vergessen, wie hässlich die Syntax von c ++ sein kann.
Kröte
Dies ist grausam im Vergleich zu dem, wie der meiste C ++ - Code aussieht. Das Hauptproblem ist das Fehlen geeigneter Konstanten, die in der Standardbibliothek definiert sind, jedoch nicht die Syntax. Es haut mich um, dass ich <limits>nur einschließen muss, um zu erkennen, ignoredass die Zeilengröße nicht begrenzt ist.
Potatoswatter
8
@ Hans: Möchtest du das klarstellen? Ich persönlich denke , I / O gehört in einer Bibliothek statt in der Sprache und alle Sprachen , die ich programmieren tun es auf diese Weise (C, C ++, Java, Python, etc.)
Chinmay Kanchi
2
Jetzt weiß ich, warum Linus sagt, C ++ sei hässlich. (nichts für ungut)
kizzx2
13

Gehen

package main

import (
  "os"
  "bufio"
  "log"
)

func main() {
  file, err := os.Open("fileio.txt", os.O_RDWR | os.O_CREATE, 0666)
  if err != nil {
    log.Exit(err)
  }
  defer file.Close()

  _, err = file.Write([]byte("hello\n"))
  if err != nil {
    log.Exit(err)
  }

  _, err = file.Write([]byte("world\n"))
  if err != nil {
    log.Exit(err)
  }

  // seek to the beginning 
  _, err = file.Seek(0,0)
  if err != nil {
    log.Exit(err)
  }

  bfile := bufio.NewReader(file)
  _, err = bfile.ReadBytes('\n')
  if err != nil {
    log.Exit(err)
  }

  line, err := bfile.ReadBytes('\n')
  if err != nil {
    log.Exit(err)
  }

  os.Stdout.Write(line)
}
Eclark
quelle
23
Diese Sprache sollte in "Typ" umbenannt werden
Aiden Bell
Ist dieser os.O_RDWR | os.O_CREATE, 0666Müll überhaupt für grundlegende Datei-E / A in Go erforderlich?
Joey Adams
1
Oder vielleicht sollte es in "Stop" umbenannt werden
xagyg
16
Es ist ziemlich erstaunlich, dass es ihnen nach 30 Jahren Evolution und Sprachdesign immer noch gelungen ist, eine neue Sprache zu erfinden, in die Fehlerprüfcode genauso schwer zu schreiben ist wie in C. Selbst Java ist weniger ausführlich!
DK.
5
Wow ... Go scheint so viel zu scheitern mit diesem Beispiel
Alessandro Stamatto
12

Erlang

Wahrscheinlich nicht der idiomatischste Erlang, aber:

#!/usr/bin/env escript

main(_Args) ->
  Filename = "fileio.txt",
  ok = file:write_file(Filename, "hello\n", [write]),
  ok = file:write_file(Filename, "world\n", [append]),
  {ok, File} = file:open(Filename, [read]),
  {ok, _FirstLine} = file:read_line(File),
  {ok, SecondLine} = file:read_line(File),
  ok = file:close(File),
  io:format(SecondLine).
Clofresh
quelle
12

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).

(with-temp-file "file"
  (insert "hello\n"))

(with-temp-file "file"
  (insert-file-contents "file")
  (goto-char (point-max))
  (insert "world\n"))

(with-temp-buffer
  (insert-file-contents "file")
  (next-line)
  (message "%s" (buffer-substring (point) (line-end-position))))

[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 ...

(with-current-buffer (generate-new-buffer "*demo*")
  (pop-to-buffer (current-buffer))
  (redisplay)
  (sleep-for 1)
  (insert-file-contents "file")
  (redisplay)
  (sleep-for 1)
  (goto-char (point-max))
  (redisplay)
  (sleep-for 1)
  (insert "world\n")
  (redisplay)
  (sleep-for 1)
  (write-file "file"))
Tarsius
quelle
1
nett, danke. Ist es möglich, dies zu verbessern, sodass ich tatsächlich einen "Geist" sehe, der die Datei öffnet und darauf tippt, wie ein Makro?
Zedoo
11

Windows-Batchdateien - Version 2

@echo off
echo hello > fileio.txt
echo world  >> fileio.txt
set /P answer=Insert: 
echo %answer%  >> fileio.txt
for /f "skip=1 tokens=*" %%A in (fileio.txt) do echo %%A

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

TheLQ
quelle
ordentlich. Vielen Dank für Ihren Beitrag.
Brock Woolf
Ich verstehe Schritt 4) als Lesen aus der erstellten Datei.
Devio
@devio - Die Anforderungen müssen sich geändert haben oder ich habe sie nur falsch verstanden ... Wie auch immer, ich werde sehen, ob es überhaupt eine solche Lösung gibt
TheLQ
11

Scala:

Standardbibliothek verwenden:

val path = "fileio.txt"
val fout = new FileWriter(path)
fout write "hello\n"
fout.close()
val fout0 = new FileWriter(path, true)
fout0 write "world\n"
fout0.close() 
val str = Source.fromFile(path).getLines.toSeq(1)
println(str)

Verwenden der Scala-ARM-Bibliothek von Josh Suereth :

val path = "fileio.txt"
for(fout <- managed(new FileWriter(path))) 
  fout write "hello\n"
for(fout <- managed(new FileWriter(path, true))) 
  fout write "world\n"
val str = Source.fromFile(path).getLines.toSeq(1)
println(str)      


Da viele Leute denselben Dateideskriptor zum Schreiben der beiden Zeichenfolgen verwendet haben, beziehe ich dies auch in meine Antwort ein.

Standardbibliothek verwenden:

val path = "fileio.txt"
val fout = new FileWriter(path)
fout write "hello\n"
fout write "world\n"
fout.close()
val str = Source.fromFile(path).getLines.toSeq(1)
println(str)

Verwenden der Scala-ARM-Bibliothek von Josh Suereth :

val path = "fileio.txt"
for(fout <- managed(new FileWriter(path))){
  fout write "hello\n"
  fout write "world\n"
}
val str = Source.fromFile(path).getLines.toSeq(1)
println(str)
fehlender Faktor
quelle
Ich denke, das würde mit flush () besser aussehen als mit close () ... keine erneute Instanziierung des FileWriter.
Radtoo
2
@Radtoo: Musste die Append-Operation zeigen. Deshalb habe ich es so gemacht.
fehlender Faktor
@Radtoo: Nachdem ich mir andere Antworten in diesem Thread angesehen hatte, entschied ich mich schließlich, diesen Weg in meine Antwort aufzunehmen. Prüfen Sie. (Ich habe den Originalcode jedoch nicht entfernt.)
Fehlender Faktor
@ Missing Faktor, getLines().toList()sollte getLines().toSeqdas faul sein?
Elazar Leibovich
@ Elzar: Guter Vorschlag. Vielen Dank. :)
fehlender Faktor
11

Groovy

new File("fileio.txt").with { 
    write  "hello\n"
    append "world\n"   
    println secondLine = readLines()[1]
}
Wayne Keenan
quelle
Vielen Dank für Ihren Beitrag.
Brock Woolf
3
Sie betrügen den Teil "Welt \ n". Es wird nicht angehängt, sondern nur in denselben Dateideskriptor geschrieben.
OTZ
Die dritte Klarstellung im ursprünglichen Beitrag besagt: "Sie müssen die Textdatei nach dem Schreiben der ersten Zeile nicht erneut öffnen"
Wayne Keenan