We / wy pliku w każdym języku programowania [zamknięte]

127

To musi być powszechne pytanie, które od czasu do czasu mają wszyscy programiści. Jak odczytać wiersz z pliku tekstowego? Wtedy następne pytanie zawsze brzmi: jak to odpisać.

Oczywiście większość z was korzysta z wysokiego poziomu frameworka w codziennym programowaniu (które są dobre w odpowiedziach), ale czasami miło jest wiedzieć, jak to zrobić na niskim poziomie.

Ja wiem, jak to zrobić w C, C++a Objective-C, ale na pewno będzie przydatna, aby zobaczyć jak to się robi we wszystkich popularnych językach, jeśli tylko pomoże nam uczynić lepszą decyzję o tym, co język robić nasz plik IO w. W szczególności Myślę, że to będzie interesujące zobaczyć, jak jej dokonać w ciągu językach manipulacyjnych, takich jak: python, rubyi oczywiście perl.

Więc myślę, że możemy tutaj stworzyć zasób społeczności , do którego wszyscy możemy oznaczyć nasze profile jako gwiazdkę i odwołać się, gdy musimy wykonać operacje we / wy pliku w jakimś nowym języku. Nie wspominając już o znajomości języków, z którymi nie mamy do czynienia na co dzień.

Oto, jak musisz odpowiedzieć:

  1. Utwórz nowy plik tekstowy o nazwie „ fileio.txt
  2. Wpisz pierwszą linię „hello” do pliku tekstowego.
  3. Dołącz drugą linię „world” do pliku tekstowego.
  4. Wczytaj drugą linię „world” do ciągu wejściowego.
  5. Wydrukuj ciąg wejściowy do konsoli.

Wyjaśnienie:

  • Powinieneś pokazać, jak to zrobić, tylko w jednym języku programowania na odpowiedź.
  • Załóżmy, że plik tekstowy nie istnieje wcześniej
  • Nie musisz ponownie otwierać pliku tekstowego po wpisaniu pierwszego wiersza

Brak ograniczeń dotyczących języka. C, C++, C#, Java, Objective-CSą świetne.

Jeśli wiesz, jak to zrobić w Prolog, Haskell, Fortran, Lisp, czy Basicto proszę śmiało.

Brock Woolf
źródło
9
Problem polega na tym, że nie pojawia się w wyszukiwaniach dla określonego języka, ponieważ nie jest i nie może być oznaczony każdym językiem.
ChrisF
21
Nie rozumiem, dlaczego to pytanie jest zamknięte. Czy celem tej witryny nie jest pomaganie ludziom w znajdowaniu informacji? Jeśli ktoś wie, jak zrobić coś (na przykład IO) w C i chce się nauczyć, jak zrobić to samo w Pythonie, może mu to pomóc, pozwalając mu widzieć oba elementy obok siebie.
Slapout
18
Nie rozumiem też, dlaczego to jest zamknięte. Wygląda na to, że dzieje się tak dlatego, że nie zawiera słów „… w najmniejszej liczbie znaków…”, co jest dość głupie. Code golf to zabawne ćwiczenie. Ale czy naprawdę przydatne jest, aby wszystkie pytania z kamienia Rosetty miały zaciemniony, mały kod we wszystkich odpowiedziach?
spencer nelson
12
Nie rozumiem, jak to pasuje do strony z pytaniami i odpowiedziami: przynajmniej w przypadku golfa z kodem istnieje dość obiektywny standard głosowania nad odpowiedziami: najkrótsza lub najmądrzejsza odpowiedź otrzymuje najwięcej głosów. A zatem: co to jest, ile osób lubi Haskella? Takie pytania są jak próba włożenia każdego możliwego rodzaju treści do systemu zaprojektowanego tylko dla jednego. Co jest nie tak z resztą Internetu w radzeniu sobie z tym?
11
Dlaczego to nie działa dobrze. Brak informacji o zaletach i wadach każdego podejścia (jakie języki obsługują tylko w jeden sposób?). Brak dyskusji na temat kompromisów i głębokich problemów w każdym języku. Ograniczony zakres, co oznacza, że ​​potrzeba bajiliionów oddzielnych pytań „w każdym języku”. A przede wszystkim nie ma społecznościowego moderowania jakości każdej odpowiedzi. Dlaczego nie mówię o umiaru, kiedy ludzie na nich głosują? Ponieważ przypuszczalnie ma być tylko jedna odpowiedź na każdy język, a ludzie nie przeczytają wystarczającej liczby odpowiedzi, aby zobaczyć wiele alternatyw w swojej dziedzinie.
dmckee --- kociak byłego moderatora

Odpowiedzi:

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)

Wyjaśnienia

  • readlines () zwraca listę wszystkich wierszy w pliku. Dlatego wywołanie readlines () powoduje wczytanie każdego wiersza pliku. W tym konkretnym przypadku dobrze jest użyć readlines (), ponieważ i tak musimy przeczytać cały plik (chcemy jego ostatniej linii). Ale jeśli nasz plik zawiera wiele wierszy, a chcemy po prostu wydrukować jego n-ty wiersz, nie ma potrzeby czytania całego pliku. Oto kilka lepszych sposobów na pobranie n-tej linii pliku w Pythonie: Co zastępuje xreadlines () w Pythonie 3? .

  • O co chodzi z tym stwierdzeniem? Instrukcja with uruchamia blok kodu, w którym można użyć zmiennej f jako obiektu strumienia zwróconego przez wywołanie metody open (). Kiedy kończy się blok with, Python automatycznie wywołuje f.close (). Gwarantuje to, że plik zostanie zamknięty, gdy wyjdziesz z bloku with, bez względu na to, jak lub kiedy wyjdziesz z bloku (nawet jeśli wyjdziesz z niego przez nieobsługiwany wyjątek). Możesz jawnie wywołać f.close (), ale co się stanie, jeśli twój kod zgłosi wyjątek i nie dostaniesz się do wywołania f.close ()? Dlatego przydatne jest wyrażenie with.

  • Nie musisz ponownie otwierać pliku przed każdą operacją. Możesz napisać cały kod wewnątrz jednego z blokiem.

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

    Użyłem trzech z blokami, aby podkreślić różnicę między trzema operacjami: zapis (tryb 'w'), dołączenie (tryb 'a'), odczyt (tryb 'r', domyślny).

węża
źródło
19
Naprawdę uważam, że nikt nie powinien pisać readlines()[1]w przykładowym kodzie. W tym przypadku możesz wiedzieć, że plik ma tylko dwie linie, ale ktoś inny beztrosko zakładając, że jest to dobre rozwiązanie, może wypróbować go na pliku zawierającym milion wierszy i otrzymać raczej nieprzyjemną niespodziankę.
Porculus
14
@Porculus z readlines () nie przechodzimy przez wszystkie linie w pliku. To jest python 3. readlines () zwraca iterator (nie listę). Dlatego odczytane zostaną tylko pierwsze dwie linie pliku. Jest to podobne do xreadlines () w pythonie 2 (który nie istnieje w pythonie 3).
snakile
7
@snakile: czy mógłbyś zacytować coś na poparcie readlines()zwraca iterator (nie listę) Tylko uwaga: zazwyczaj nie możesz zindeksować iteratora.
SilentGhost
8
@SilentGhost Cytuję „Dive into Python 3”: „Metoda readlines () zwraca teraz iterator, więc jest tak samo wydajna, jak xreadlines () w Pythonie 2”. Wyszukaj to stwierdzenie w: diveintopython3.org/porting-code-to-python-3-with-2to3.html . Po drugie, w Pythonie 3 możesz zindeksować iterator. Wpisanie range (10) [4] w powłoce (range () również zwraca iterator w Pythonie 3 w przeciwieństwie do Pythona 2, gdzie range () zwraca listę). Zauważ, że zakres (N) [i] jest wykonywany w O (i), a nie w O (1) i nie w O (N).
snakile
5
@snakile: Twoje komentarze są błędne na kilku poziomach. Po pierwsze readlines zwraca listę w Pythonie 3 (przetestuj ją i zobacz). Zatem podany kod odczyta cały plik. Po drugie, iteratory nie mogą być indeksowane w Pythonie 2 lub 3. rangeObiekt ma specjalną obsługę indeksowania, co jest wykonywane w O (1).
interjay
242

LOLCODE

Specyfikacje są co najmniej pobieżne, ale zrobiłem, co mogłem. Niech rozpocznie się głosowanie w dół! :) Nadal uważam to za zabawne ćwiczenie.

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
źródło
28
Nie sądzę, żeby istniał inny język, który miałby tę właściwość, która dosłownie sprawiłaby, że ... lol.
Ionuț G. Stan
85
Czy to smutne, że myślę, że LOLCODE jest bardziej czytelny niż cokolwiek innego, co widziałem?
Joel
13
To ciekawe, jak bardzo przypomina naturalny język.
Abhinav Sarkar
19
Mówienie, że spodziewasz się, że zostaniesz zlekceważony, jest gwarancją pozytywnych głosów w SO, ponieważ psychologia odwrotna jest działaniem odruchowym dla programisty.
Brock Woolf
13
PLZ? / AWSUM THX / O NOES jest po prostu wspaniały. Wydaje mi się to wszechmocne.
Calvin1602,
43

Mózg *** k

,------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-],------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]
Svisstack
źródło
26
Czy przegapiłeś „-”? ;)
Aiden Bell
2
Och, wysiłek. Tak dla przypomnienia, ile czasu zajęło pisanie?
Riduidel
I nie możesz tego podzielić na wiele linii? Najlepszy język wszechczasów
TheIronKnuckle
42

COBOL

Ponieważ nikt inny tego nie zrobił ......

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
źródło
2
To powinno być głosowanie się nie mniej niż 1 milion razy na czystej grozy +1
Brock Woolf
1
+1 dla „Ten język wciąż istnieje”. = D
missingfaktor
3
Zachowaj ostrożność, próbując tego w domu. Twój kompilator Cobol może nie lubić tych nowoczesnych linii o zmiennej długości ...
Stephan Eggermont
Tak, to przywraca stare, zardzewiałe wspomnienia. Myślę, że nie spełnia wymagań ...
EvilTeach
Piszę teraz kod w AcuCOBOL! Nawiasem mówiąc, gdzie jest część „I” w „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

Jeśli chcesz tylko czytać / zapisywać plik:

main :: IO ()
main = readFile "somefile.txt" >>= writeFile "someotherfile.txt" 
Ionuț G. Stan
źródło
7
Ach, „Wszechmogący” Haskell. Dziękuję za wkład :)
Brock Woolf
3
@Andreas Rejbrand Jestem prawie pewien, że zapomniał o `` być ''
Federico klez Culloca
4
Istnieje wiele innych podejść do podstawowych operacji we / wy w Haskell, które stają się przydatne / ważne w Haskell, gdy wykonujesz określone typy aplikacji. Pakiety tekstowe i bajtowe w Cabal / Hackage pozwalają ci radzić sobie z różnymi kodowaniami, a różne pakiety w stylu iteratee, takie jak iteratee i enumerate, reprezentują „najbardziej znaną abstrakcję” do wykonywania przyrostowych operacji we / wy. Ważne jest również analizowanie bibliotek, takich jak parsec, oraz przyrostowe testowanie bajtów tylko attoparsec lib. Haskellers podchodzili bardzo dokładnie do badania wyborów projektowych io. Przykłady nieopłacalne obejmują leniwe io i kontynuacje
Carter Tazio Schonwald
4
Yuji: w zasadzie przez oszukiwanie. Haskell to czysty język funkcjonalny, z wyjątkiem wszystkich typów IO a, który ma specjalne wsparcie kompilatora dla efektów ubocznych. (Czystość jest zachowana w innym miejscu, ponieważ wszystko, co wywołuje lub obserwuje efekt uboczny, jest typu IO a, więc system typów zapewnia, że ​​reszta programu pozostanie czysta.)
Sam Stokes
4
Tak się składa, że IOjest to monada, ale nie dlatego wolno robić efekty uboczne. Bycie monadą jest tym, co pozwala napisać tę imperatywną składnię: zapewnia również (również przy obsłudze języków specjalnych) efekty uboczne występujące w rozsądnej kolejności, więc nie czyta się z pliku przed zapisaniem, itp. .
Sam Stokes
35

re

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);
}
Bernarda
źródło
10
+1, o wiele piękniejsza i bardziej czytelna niż wersja C ++! Marzę o dniu, w którym D całkowicie zastąpi C i C ++. :-)
missingfaktor
10
Ładny. Może powinienem się kiedyś nauczyć D.
helpermethod
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
źródło
2
+1 Dobrze, ale żeby być ścisłym, nie umieszcza się danych wejściowych w zmiennej przed zapisaniem jej na konsoli.
Lasse Espeholt
3
@lasseespeholt, masz rację. Naprawiłem to.
Wayne Conrad
5
Nie ma powodu, aby pisać wielką literą nazwę zmiennej i mówić „ŚCIEŻKA”. Po prostu powiedz „ścieżka”.
OTZ
2
@otz To stała. Mógłby jednak nazwać to „Ścieżką”, stała w Rubim musi po prostu zaczynać się wielką literą.
Sirupsen
1
@Thomas Ahle: podczas używania File.openz blokiem plik jest otwierany, przekazywany do bloku, a następnie automatycznie zamykany.
Matchu
33

DO#

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)to tylko .Net 4.0, alternatywą jest File.ReadAllLines(path)[1]parsowanie całego pliku w tablicę.

Lasse Espeholt
źródło
1
jest dość krótki w C #. dzięki za wkład
Brock Woolf
13
UWAGA: File.ReadLines jest specyficzne dla .NET 4
kirk.burleson
5
Co za nieprzyjemnie wyglądająca składnia C #
Aiden Bell
3
@Aiden Bell: w stosunku do jakiego języka?
zfedoran
2
@Aiden Bell - ta odpowiedź stara się być zwięzła, a nie czytelna. Jest wiele „fajnych” sposobów osiągnięcia tego samego w C #. Więcej realistycznych przykładów można znaleźć na stronie 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
źródło
Niezła odpowiedź. Dziękujemy za udzielenie +1
Brock Woolf
Dlaczego dwukrotnie wywołujesz fgets ()?
kirk.burleson
2
Ponieważ druga linia to ta, którą chcemy wydrukować na standardowe wyjście
JeremyP
1
#include <stdio.h> int main (void) {PLIK plik; char buf [128]; file = fopen ("fileio.txt", "w"); if (! plik) błąd goto; fputs ("witaj \ n", plik); fflush (plik); fputs ("świat \ n", plik); fclose (plik); file = fopen ("fileio.txt", "r"); if (! plik) błąd goto; fgets (buf, sizeof (buf), plik); / pomiń 'cześć' / fgets (buf, sizeof (buf), plik); / get 'słowo' * / fclose (plik); fputs (buf, stdout); return 0; błąd: fputs ("Nie można otworzyć pliku \ n", stderr); powrót 1; }
FelipeC
Ładne, czyste kodowanie (dużo przyzwoitego sprawdzania błędów) w oryginalnym poście C (co nieco wydmuchuje długość).
xagyg
29

Skrypt powłoki (UNIX)

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

Właściwie sed -n "2p"część drukuje drugą linię, ale pytanie prosi o zapisanie drugiej linii w zmiennej, a następnie wydrukowanie, więc ... :)

robertbasic
źródło
9
Nie wiem dlaczego, ale uwielbiam to :)
Federico klez Culloca
Oczywiście to się liczy. Miła odpowiedź i dzięki za udzielenie +1
Brock Woolf
Dlaczego nie wysłać standardu do / dev / null?
Gumbo
Istnieje nieco prostsza i szybsza wersja, wykorzystująca tylko funkcje wbudowane powłoki (w przeciwieństwie do wydzielania oddzielnego procesu do wywołania sed), tutaj: stackoverflow.com/questions/3538156/ ...
Brian Campbell
@Gumbo, w takim razie jak uzyskałbyś drugą linię? LINE=`foo`przechwytuje dane wyjściowe foodo zmiennej LINE.
strager
27

x86 Assembler (NASM) w systemie Linux

Nie tknąłem asm od 7 lat, więc musiałem trochę użyć google, żeby to razem zhakować, ale nadal działa;) Wiem, że to nie jest w 100% poprawne, ale hej: D

OK, to nie działa. przepraszam za to. chociaż drukuje worldna końcu, nie drukuje go z pliku, ale z tego, ecxktóry jest ustawiony w linii 27.

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

Wykorzystane źródła: 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
źródło
Czy zamierzasz to poprawić, aby działało w 100%? Jeśli nie, usuń go, aby działająca wersja mogła go zastąpić.
kirk.burleson
4
Zabawne jest to, że przykład w C, który ma być językiem wyższego poziomu, jest tak długi, jak ten ... =)
Jani Hartikainen
1
@Jani: Ale przynajmniej jest to trochę łatwiejsze do zrozumienia.
sbi
Na początku myślałem, że to dla DOSa :)
mlvljr
21

JavaScript - node.js

Po pierwsze, wiele zagnieżdżonych wywołań zwrotnych.

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]);
                });
            });
        });
    });
});

Trochę czystsze:

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
źródło
@Ionut: Dziękuję za wiele wkładów +1
Brock Woolf
4
@Dave, to nie jest JS znaleziony w przeglądarkach. Mam na myśli, składniowo i semantycznie, to ten sam JS, tylko standardowa biblioteka jest inna. Użyłem standardowego biblioteki node.jsplatformy. Zobacz nodejs.org
Ionuț G. Stan
5
Ten kod woła o kontynuację. Słyszę jego łzy.
Matt
2
Czy to nie zabawne, że liczba wierszy jest prawie taka sama, jak w rozwiązaniu ASM na dole?
kizzx2
1
@Matt tak, kontynuacje lub monady też by tu pomogły.
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
źródło
1
dla języka o nazwie „seplenienie” powinno być dużo więcej liter „s” :)
iwasrobbed
18

PowerShell

sc fileio.txt 'hello'
ac fileio.txt 'world'
$line = (gc fileio.txt)[1]
$line
Lasse Espeholt
źródło
3
To jest ładne i czyste. Yay powershell.
Jay Bazuzi
Zgadzam się z twoją logiką cytowania. Powodem, dla którego je usunąłem, było to, że zdałem sobie sprawę, że ten skrypt jest w rzeczywistości na szczycie, ponieważ jest kompaktowy, więc chciałem, aby był jeszcze mniejszy - ale pozwoliliśmy, aby było to jasne :). I użycie gczamiast zamiast catma sens :-) get-aliasdał mi catpierwszy (nie używam dużo PowerShell).
Lasse Espeholt
4
Cholera, czy jest coś krótszego ??
0fnt
18

Skrypt powłoki

Oto skrypt powłoki używający tylko poleceń wbudowanych, zamiast wywoływać polecenia zewnętrzne, takie jak sedlub tailtak, jak robiły to poprzednie odpowiedzi.

#!/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

Podczas pisania znaczących skryptów powłoki zaleca się używanie w jak największym stopniu wbudowanych, ponieważ tworzenie oddzielnego procesu może być powolne; z szybkiego testu na moim komputerze, sedrozwiązanie jest około 20 razy wolniejsze niż przy użyciu read. Jeśli zamierzasz zadzwonić sedraz, jak w tym przypadku, nie ma to większego znaczenia, ponieważ wykona to szybciej, niż możesz to zauważyć, ale jeśli zamierzasz wykonać to setki lub tysiące razy, może zsumować.

Dla tych, którzy nie są zaznajomieni ze składnią {i } wykonują listę poleceń w bieżącym środowisku powłoki (w przeciwieństwie do (i )które tworzą podpowłokę; musimy działać w bieżącym środowisku powłoki, abyśmy mogli później użyć wartości zmiennej) . Musimy pogrupować polecenia razem, aby oba działały na tym samym strumieniu wejściowym, utworzonym przez przekierowanie z fileio.txt; gdybyśmy po prostu uruchomili read < fileio.txt; read input < fileio.txt, otrzymalibyśmy po prostu pierwszą linię, ponieważ plik zostałby zamknięty i ponownie otwarty między dwoma poleceniami. Ze względu na specyfikę składni powłoki ( {i }są to słowa zastrzeżone, w przeciwieństwie do metaznaków), musimy oddzielić {i}od pozostałych poleceń spacjami i zakończ listę poleceń za pomocą ;.

readWbudowane bierze jako argument nazwy zmiennych do odczytu w. Zużywa wiersz danych wejściowych, dzieli dane wejściowe na białe znaki (technicznie rzecz biorąc, dzieli je zgodnie z zawartością $IFS, która domyślnie jest znakiem spacji, gdzie znak spacji oznacza podzielenie go na dowolną spację, tabulator lub nową linię), przypisuje każde słowo do nazw zmiennych podanych w kolejności, a pozostałą część wiersza przypisuje ostatniej zmiennej. Ponieważ dostarczamy tylko jedną zmienną, po prostu umieszcza cały wiersz w tej zmiennej. Używamy tej $inputzmiennej ponownie , ponieważ nie obchodzi nas, co znajduje się w pierwszym wierszu (jeśli używamy Bash, nie możemy po prostu podać nazwy zmiennej, ale aby była przenośna, zawsze musisz podać co najmniej jedną nazwę).

Zauważ, że chociaż możesz czytać wiersze pojedynczo, tak jak ja tutaj, znacznie bardziej powszechnym wzorcem byłoby zawinięcie go w pętlę while:

while read foo bar baz
do
  process $foo $bar $baz
done < input.txt
Brian Campbell
źródło
3
Bardzo dobrze. Dowiedziałem się czegoś (choć chwilowo).
Potatoswatter
Dziękuję za twój wkład Brian.
Brock Woolf
Całkowicie chory! W dobry sposób :-)
helpermethod
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)))))

Lub równoważnie, używając makra wątków ->(znanego również jako narzędzie do usuwania nawiasów):

(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
źródło
1
WTF, przez ostatnie 50 lat prawie nikt nie powiedział, że Lisp / Scheme rządzi!
Ionuț G. Stan
11
Czekaj, czy spitto naprawdę nazwa funkcji zapisu do pliku?
Sam Stokes
4
Clojure zdecydowanie nie daje czadu!
kirk.burleson
1
@ [Sam Stokes] W rdzeniu jest funkcja o nazwie slurp, która wczytuje cały plik do łańcucha i zwraca go. plucie robi dokładnie odwrotnie. W czym problem? Istnieją inne funkcje, takie jak sekwencja liniowa, które wykonują podobne rzeczy na różne sposoby.
Rayne
4
@ kirk.burleson z pewnością działa bardziej niż Java. :)
Rayne
17

FA#

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
źródło
1
FA#. Ładny. Dziękuję za Twój wkład.
Brock Woolf
16

PODSTAWOWY

Nie używałem BASICa od prawie 10 lat, ale to pytanie dało mi powód do szybkiego odświeżenia wiedzy. :)

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$
Casablanka
źródło
To niesamowite, że po 10 latach nadal możesz to zrobić! Brawo i dziękuję za Twój wkład.
Brock Woolf,
Oczywiście nie zrobiłem tego z głowy: kilka minut zajęło mi sprawdzenie niektórych rzeczy.
casablanca
Tak, oczywiście. Wciąż dobrze zrobione.
Brock Woolf
Czy nie potrzebujesz numerów linii w najbardziej klasycznej wersji BASICa ???
Yuji
@Yuji: W „najbardziej klasycznej wersji” tak, ale nie sądzę, aby jakakolwiek wersja od wczesnych lat 90. ich wymagała.
casablanca
16

Cel 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
źródło
17
Nigdy nie lubiłem Objective-C. Składnia wydaje się po prostu tak obca, gdy pochodzi z języka takiego jak Java.
Faisal Abid
5
Sekretem Objective-C jest to, że Xcode wykonuje całe uzupełnianie kodu za Ciebie. Nie musisz pamiętać długich nazw metod. Z pewnością sprawiają, że twój kod jest znacznie bardziej czytelny
Brock Woolf,
7
I pomyślałem, że składnia c ++ już wyglądała najgorzej.
Toad
6
Cel-C wygląda źle tylko dlatego, że podświetlenie składni Stackoverflow nie jest poprawnie kolorowane.
Brock Woolf
4
Nie mogę uwierzyć, że to tak daleko na liście! Również ludzie z Java komentujący, że Objective-C jest brzydki, czy widzieliście, ile linii zajęło napisanie tego samego pliku? Kiedyś byłem entuzjastą Javy, ale myślę, że Objective-C wkradł się do mojego serca.
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
źródło
15
a co z leksykalnymi uchwytami plików, otwarte 3 argumenty?
MkV
6
W przypadku przepełnienia stosu nie należy nigdy używać nieleksykalnych uchwytów plików. W praktyce rzadko są one potrzebne, a początkującym nie powinno się nigdy pokazywać, że w ogóle istnieją.
Ether
4
To samo dotyczy dwóch otwartych argumentów: nigdy nie powinieneś używać go na przepełnieniu stosu i prawdopodobnie nie w praktyce.
rpkelly
2
Używam 3-argumentowych otwartych i leksykalnych uchwytów plików tak bardzo, że praktycznie uważam to za błąd składniowy, gdy to widzę. I tak powinno być. / me rozważa napisanie modułu, aby tak było.
Kent Fredric
2
„Nawet jednoargumentowe otwarte ma swoje zastosowania”, ma swoje zastosowania, tak, ale czułem się nadużywany w dniu, w którym dowiedziałem się, jak to działa, i za każdym razem, gdy widzę kogoś, kto uważa, że ​​tego potrzebuje, stwierdzę: „Z pewnością jest inny sposób”. perl -we 'for (q{ps aux |}){ open _; print <_>; }'
Kent Fredric
15

R:

cat ("cześć \ n", file = "fileio.txt")
cat ("świat \ n", plik = "fileio.txt", append = TRUE)
line2 = readLines ("fileio.txt", n = 2) [2]
kot (wiersz 2)
David F.
źródło
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
źródło
To wspaniale. Dzięki za wkład.
Brock Woolf
20
Alternatywnie możesz wziąć implementację C i dodać znaki dolara.
Kendall Hopkins
@strager Nie mam pojęcia. Są ludzie, którzy nie wiedzą, że jest optyczny i że bez niego jest lepiej.
Ionuț G. Stan
6
Na wszelki wypadek, gdyby ktoś był ciekawy, powodem, dla którego opuścił tag zamykający, jest to, że jeśli go umieścisz i pozostawisz na końcu spację, ryzykujesz wyświetleniem błędu „nagłówki już wysłane”.
Bill H
?>
Numer
15

Jawa

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
źródło
36
@Brock: Obecnie Java nie działa wolno. Tylko gadatliwe, ale nie wolno. Prosimy nie robić takich komentarzy; boli nas, ludzi JVM. : „|
missingfaktor
9
Ktokolwiek powiedział, że Java jest powolna, jest albo ślepym jej nienawidzącym, albo żyje pod kamieniem. Java może być tak szybka, jeśli nie szybsza niż C, z niezależnością platformy do rozruchu.
NullUserException,
4
@Missing Faktor: A więc?
Jerry Coffin
19
szybkość wykonywania jest najbardziej opóźnioną formą zawodów, jakie mają programiści. Zawsze chodzi o wybranie odpowiedniego narzędzia do zadania, wybranie przypadkowej metryki, takiej jak szybkość wykonania, i przypisanie jej dużej ilości ważności jest po prostu głupie, zwłaszcza że szybkość wykonywania nie jest strasznie ważna dla większości zadań, o ile jest jest wystarczająco szybki (który java jest do prawie wszystkiego)
Matt Briggs
11
„okablowanie sprzętowe jest szybsze niż kod maszynowy”, „kod maszynowy jest szybszy niż asm”, „asm jest szybszy niż C”, „C jest szybszy niż Java”, „bla bla bla”… Czy masz choćby jedną wskazówkę, ile pośrednia jest już między kodem maszynowym a procesorem? mikrokod, optymalizator predykcyjny, pamięci podręczne instrukcji / danych, dekoder itp., nie wspominając o niedeterminizmie spowodowanym dynamiczną alokacją w C / ASM. Java i inne bezpieczne języki to jeszcze jeden mały krok pośredni, to nic wielkiego. Możesz pozostać w swojej pierwotnej formie na zawsze lub ewoluować razem z nami.
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';
}

lub nieco mniej pedantycznie,

#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;
}
wody ziemniaczanej
źródło
1
Świetny! Dziękujemy za udzielenie +1
Brock Woolf,
14
Zapomniałem, jak brzydka może być składnia C ++.
Toad
Jest to okropne w porównaniu z tym, jak wygląda większość kodu C ++. Głównym problemem jest brak odpowiednich stałych zdefiniowanych w bibliotece standardowej, ale nie składnia. Zdumiewa mnie, że muszę uwzględnić, <limits>aby powiedzieć, ignoreże nie ma ograniczeń co do rozmiaru linii.
Potatoswatter
8
@Hans: Czy chciałbyś to wyjaśnić? Osobiście uważam, że I / O należy raczej do biblioteki niż do języka, a wszystkie języki, w których programuję, robią to w ten sposób (C, C ++, Java, Python itp.)
Chinmay Kanchi,
2
Teraz wiem, dlaczego Linus mówi, że C ++ jest brzydki. (bez obrazy)
kizzx2
13

Udać się

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
źródło
23
Aiden Bell
Czy te os.O_RDWR | os.O_CREATE, 0666śmieci są nawet potrzebne do podstawowego wejścia / wyjścia plików w Go?
Joey Adams
1
A może należałoby zmienić jego nazwę na „Stop”
xagyg
16
To raczej zdumiewające, że biorąc pod uwagę 30 lat ewolucji i projektowania języka, wciąż udało im się wynaleźć nowy język, który jest równie trudny do napisania kodu sprawdzającego błędy, jak C. Nawet mniej rozwlekły w Javie!
DK.
5
Wow ... Go wydaje się tak bardzo Porażka z tym przykładem
Alessandro Stamatto
12

Erlang

Chyba nie najbardziej idiomatyczny Erlang, ale:

#!/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
źródło
12

Emacs Lisp

Pomimo tego, co niektórzy mówią, Emacs jest głównie edytorem tekstu [1]. Więc chociaż Emacs Lisp może być używany do rozwiązywania wszelkiego rodzaju problemów, jest on zoptymalizowany pod kątem potrzeb edytora tekstu. Ponieważ edytory tekstu (oczywiście) mają dość specyficzne potrzeby, jeśli chodzi o sposób obsługi plików, wpływa to na to, jakie funkcje związane z plikami oferuje Emacs Lisp.

Zasadniczo oznacza to, że Emacs Lisp nie oferuje funkcji do otwierania pliku jako strumienia i czytania go część po części. Podobnie nie możesz dołączyć do pliku bez uprzedniego załadowania całego pliku. Zamiast tego plik jest w całości [2] wczytywany do bufora [3], edytowany i ponownie zapisywany do pliku.

Do zadań typu „must” użyłbyś Emacs Lisp, ponieważ jest to odpowiednie, a jeśli chcesz zrobić coś, co nie wymaga edycji, możesz użyć tych samych funkcji.

Jeśli chcesz ciągle dołączać do pliku, wiąże się to z ogromnym narzutem, ale jest to możliwe, jak pokazano tutaj. W praktyce zwykle kończysz wprowadzanie zmian w buforze, ręcznie lub programowo, przed zapisaniem do pliku (po prostu połącz pierwsze dwa wyrażenia s w poniższym przykładzie).

(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] Przynajmniej nie posunąłbym się do nazywania go systemem operacyjnym; alternatywny interfejs użytkownika tak, system operacyjny nie.

[2] Możesz załadować tylko części pliku, ale można to określić tylko bajtowo.

[3] Bufor jest zarówno typem danych w pewnym sensie podobnym do łańcucha, jak i „rzeczą, którą widzisz podczas edycji pliku”. Podczas edycji bufor jest wyświetlany w oknie, ale bufory niekoniecznie muszą być widoczne dla użytkownika.

Edycja: Jeśli chcesz zobaczyć tekst wstawiany do bufora, musisz oczywiście uczynić go widocznym i spać między akcjami. Ponieważ Emacs normalnie wyświetla ponownie ekran tylko podczas oczekiwania na wejście użytkownika (a spanie to nie to samo, co oczekiwanie na wejście), musisz także wymusić ponowne wyświetlenie. Jest to konieczne w tym przykładzie (użyj go zamiast drugiego seksu); w praktyce ani razu nie musiałem używać `` redisplay '' - więc tak, to jest brzydkie, ale ...

(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"))
stępu
źródło
1
fajnie dzięki. Czy można to ulepszyć, aby rzeczywiście zobaczyć „ducha” otwierającego plik i piszącego do niego, jak jakieś makro?
zedoo
11

Pliki wsadowe systemu Windows - wersja nr 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

Aby wyjaśnić to ostatnie okropne wyszukiwanie pętli, zakłada się, że w pliku jest tylko świat hello (nowa linia). Więc po prostu pomija pierwszą linię i odbija tylko drugą.

Changelog

  • 2 - Ups, musiałem źle odczytać wymagania lub zmieniły się na mnie. Teraz czyta ostatnią linię z pliku

TheLQ
źródło
schludny. dziękuję za twój wkład.
Brock Woolf,
Krok 4) rozumiem jako odczyt z utworzonego pliku.
devio
@devio - Wymagania musiały się zmienić lub po prostu je źle odczytałem ... W każdym razie zobaczę, czy takie rozwiązanie w ogóle istnieje
TheLQ
11

Scala:

Korzystanie z biblioteki standardowej:

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)

Korzystanie z biblioteki Scala-ARM Josha Sueretha :

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)      


Ponieważ wiele osób używa tego samego deskryptora pliku do zapisania dwóch ciągów, uwzględniam to również w mojej odpowiedzi.

Korzystanie z biblioteki standardowej:

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)

Korzystanie z biblioteki Scala-ARM Josha Sueretha :

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)
missingfaktor
źródło
Myślę, że wyglądałoby to ładniej z flush () zamiast close () ... bez ponownego tworzenia instancji FileWriter.
Radtoo
2
@Radtoo: Musiałem pokazać operację dołączania. Dlatego zrobiłem to w ten sposób.
missingfaktor
@Radtoo: Po przejrzeniu innych odpowiedzi w tym wątku, w końcu zdecydowałem, że zawarłem je w mojej odpowiedzi. Sprawdź to. (Nie usunąłem jednak oryginalnego kodu.)
missingfaktor
@Missing Faktor, który getLines().toList()powinien być getLines().toSeqleniwy?
Elazar Leibovich
@Elazar: Dobra sugestia. Dzięki. :)
missingfaktor
11

Groovy

new File("fileio.txt").with { 
    write  "hello\n"
    append "world\n"   
    println secondLine = readLines()[1]
}
Wayne Keenan
źródło
dzięki za wkład.
Brock Woolf
3
Oszukujesz w części „świat \ n”. To nie jest dołączanie, po prostu zapisuje do tego samego deskryptora pliku.
OTZ
Trzecie wyjaśnienie w oryginalnym poście brzmi: „Nie trzeba ponownie otwierać pliku tekstowego po napisaniu pierwszej linii”
Wayne Keenan