File I / O in ogni linguaggio di programmazione [chiuso]


127

Questa deve essere una domanda comune che tutti i programmatori hanno di volta in volta. Come faccio a leggere una riga da un file di testo? Quindi la domanda successiva è sempre come lo riscrivo.

Naturalmente la maggior parte di voi usa un framework di alto livello nella programmazione quotidiana (che va bene usare nelle risposte) ma a volte è bello sapere come farlo anche a un livello basso.

Io stesso so come farlo C, C++e Objective-C, ma sarebbe sicuramente utile vedere come è fatto in tutte le lingue popolari, se non altro per aiutarci a prendere una decisione migliore su quale lingua fare il nostro file io. In particolare Penso che sarebbe interessante vedere come il suo fare nelle lingue manipolazione delle stringhe, come: python, rubye naturalmente perl.

Quindi immagino che qui possiamo creare una risorsa della comunità che tutti possiamo aggiungere ai nostri profili e fare riferimento a quando dobbiamo fare I / O dei file in una nuova lingua. Per non parlare dell'esposizione che arriveremo tutti a lingue che non trattiamo quotidianamente.

Ecco come devi rispondere:

  1. Crea un nuovo file di testo chiamato " fileio.txt "
  2. Scrivi la prima riga "ciao" nel file di testo.
  3. Aggiungi la seconda riga "mondo" al file di testo.
  4. Leggi la seconda riga "mondo" in una stringa di input.
  5. Stampa la stringa di input sulla console.

Una precisazione:

  • Dovresti mostrare come farlo in un solo linguaggio di programmazione per risposta.
  • Supponiamo che il file di testo non esista in anticipo
  • Non è necessario riaprire il file di testo dopo aver scritto la prima riga

Nessun limite particolare alla lingua. C, C++, C#, Java, Objective-CSono tutti ottimi.

Se sai come farlo in Prolog, Haskell, Fortran, Lisp, o Basicquindi si prega di andare avanti a destra.


9
Il problema è che non verrà visualizzato nelle ricerche di una lingua specifica in quanto non è, né può essere, etichettato con ogni lingua.
ChrisF

21
Non capisco perché questa domanda sia chiusa. Lo scopo di questo sito non è aiutare le persone a trovare informazioni? Se qualcuno sa come fare qualcosa (come IO) in C e vuole imparare a fare la stessa cosa in Python, questo potrebbe aiutarli permettendo loro di vedere entrambi fianco a fianco.
Schiaffo

18
Inoltre non capisco perché questo sia chiuso. Sembra che sia solo perché non include le parole "... nella minima quantità di personaggi ..." che è piuttosto sciocco. Il golf del codice è un esercizio divertente. Ma è davvero utile fare in modo che tutte le domande su rosetta siano offuscate, minuscolo codice in tutte le risposte?
Spencer Nelson,

12
Non capisco come questo si adatti a un sito di domande e risposte: almeno con il golf di codice, esiste uno standard in qualche modo oggettivo con cui votare le risposte: la risposta più breve o più intelligente ottiene il maggior numero di voti. Con questo: che cos'è, a quante persone piace Haskell? Domande come questa sono come provare a inserire ogni tipo di contenuto in un sistema progettato per uno solo. Cosa c'è di sbagliato nel resto di Internet per gestire questo?

11
Perché questo non funziona bene. Nessuna informazione sui pro e contro di ogni approccio (quali lingue supportano solo un modo?). Nessuna discussione sui compromessi e problemi profondi in ogni lingua. Ambito limitato che implica che la necessità di un bajiliion separa le domande "in ogni lingua". E soprattutto non c'è moderazione da parte della comunità della qualità di ogni risposta. Perché non dico moderazione quando le persone votano su di loro? Perché si suppone che ci sia una sola risposta per ogni lingua, e le persone non leggeranno abbastanza risposte per vedere più alternative nel loro campo.
dmckee --- ex gattino moderatore

Risposte:


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)

chiarimenti

  • readlines () restituisce un elenco di tutte le righe nel file. Pertanto, l'invocazione di readlines () comporta la lettura di ogni riga del file. In quel caso particolare è bene usare readlines () perché dobbiamo comunque leggere l'intero file (vogliamo la sua ultima riga). Ma se il nostro file contiene molte righe e vogliamo solo stampare la sua nona riga, non è necessario leggere l'intero file. Ecco alcuni modi migliori per ottenere l'ennesima riga di un file in Python: Cosa sostituisce xreadlines () in Python 3? .

  • Che cosa è questo con l'affermazione? L'istruzione with avvia un blocco di codice in cui è possibile utilizzare la variabile f come oggetto stream restituito dalla chiamata per open (). Quando termina il blocco with, python chiama automaticamente f.close (). Ciò garantisce che il file verrà chiuso quando si esce dal blocco with indipendentemente da come o quando si esce dal blocco (anche se lo si esce tramite un'eccezione non gestita). Potresti chiamare f.close () esplicitamente, ma cosa succede se il tuo codice genera un'eccezione e non arrivi alla chiamata f.close ()? Ecco perché l'istruzione with è utile.

  • Non è necessario riaprire il file prima di ogni operazione. Puoi scrivere l'intero codice all'interno di uno con un blocco.

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

    Ne ho usati tre con i blocchi per enfatizzare la differenza tra le tre operazioni: write (mode 'w'), append (mode 'a'), read (mode 'r', il default).


19
Non credo davvero che qualcuno dovrebbe mai scrivere readlines()[1]nel codice di esempio. In questo caso potresti sapere che il file ha solo due righe, ma qualcun altro, presumibilmente supponendo che sia una buona soluzione, potrebbe provarlo su un file da un milione di righe e ottenere una brutta sorpresa.
Porculus,

14
@Porculus con readlines () non esaminiamo tutte le righe del file. Questo è Python 3. readlines () restituisce un iteratore (non un elenco). Pertanto verranno lette solo le prime due righe del file. Questo è simile a xreadlines () in Python 2 (che non esiste in Python 3).
snakile,

7
@snakile: potresti per favore citare qualcosa a supporto dei readlines()resi un iteratore (non un elenco) Solo una nota: in genere non puoi indicizzare un iteratore.
SilentGhost,

8
@SilentGhost Sto citando "Dive into Python 3": "Il metodo readlines () ora restituisce un iteratore, quindi è altrettanto efficace di xreadlines () in Python 2". Cerca questa affermazione in: diveintopython3.org/porting-code-to-python-3-with-2to3.html . In secondo luogo, in Python 3 è possibile indicizzare un iteratore. Digitare range (10) [4] nella shell (range () restituisce anche un iteratore in Python 3 contrariamente a python 2 dove range () restituisce un elenco). Si noti che l'intervallo (N) [i] viene eseguito in O (i), non O (1) e non O (N).
snakile,

5
@snakile: i tuoi commenti sono sbagliati su più livelli. Innanzitutto, readlines restituisce un elenco in Python 3 (testarlo e vedere). Quindi il codice fornito leggerà l'intero file. In secondo luogo, gli iteratori non possono essere indicizzati in Python 2 o 3. L' rangeoggetto ha un supporto speciale per l'indicizzazione, che viene eseguito in O (1).
interjay,

242

LOLCODE

Le specifiche sono a dir poco imprecise, ma ho fatto il meglio che potevo. Che il downvoting abbia inizio! :) Lo trovo ancora un esercizio divertente.

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

28
Non credo che ci sia un'altra lingua là fuori per avere questa proprietà, letteralmente, per farmi ... lol.
Ionuț G. Stan,

85
È triste pensare che LOLCODE sia più leggibile di qualsiasi altra cosa abbia visto?
Gioele,

13
È interessante quanto ci si senta come un linguaggio naturale.
Abhinav Sarkar,

19
Dire che ti aspetti di essere sottoposto a downgrade è una garanzia per gli apprezzamenti di SO perché la psicologia inversa è un'azione riflessa per un programmatore.
Brock Woolf,

13
Il PLZ? / AWSUM THX / O NOES è semplicemente fantastico. Questo mi sembra un po 'onnipotente.
Calvin1602,

43

Cervello *** k

,------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-],------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]

26
Ti sei perso un '-'? ;)
Aiden Bell,

2
Oh lo sforzo. Solo per la cronaca, quanto tempo ci è voluto per scrivere?
Riduidel,

E non puoi dividerlo su più righe? La miglior lingua di sempre
TheIronKnuckle

42

COBOL

Dal momento che nessun altro ha fatto ......

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.

2
Questo dovrebbe essere votato non meno di 1 milione di volte per pura bellezza +1
Brock Woolf

1
+1 per "Questa lingua è ancora in circolazione." = D
missingfaktor

3
Fai attenzione quando provi questo a casa. Il tuo compilatore cobol potrebbe non apprezzare queste moderne linee a lunghezza variabile ...
Stephan Eggermont,

Ya, questo riporta alcuni vecchi ricordi arrugginiti. Non penso che soddisfi i requisiti ...
EvilTeach

Sto scrivendo il codice in AcuCOBOL in questo momento! A proposito, dov'è la parte "io" di "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

Se vuoi solo leggere / scrivere un file:

main :: IO ()
main = readFile "somefile.txt" >>= writeFile "someotherfile.txt" 

7
Ah, l'onnipotente Haskell. Grazie per il tuo contributo :)
Brock Woolf,

3
@Andreas Rejbrand Sono quasi sicuro che abbia dimenticato un 'essere'
Federico Klez Culloca,

4
Esistono numerosi altri approcci all'I / O di base in Haskell che diventano utili / importanti in Haskell quando esegui determinati tipi di app. I pacchetti di testo e bytestring su cabal / hackage ti consentono di gestire varie codifiche e vari pacchetti di stile iterato come iteratee ed enumerate rappresentano una "astrazione più nota" per fare io incrementale. Importanti sono anche l'analisi delle librerie come parsec e la modifica incrementale solo della libreria attoparsec. Gli Haskeller hanno adottato un approccio molto approfondito all'esplorazione delle scelte di design. Esempi non vitali includono io pigro e continuazioni
Carter Tazio Schonwald,

4
Yuji: fondamentalmente, ingannando. Haskell è un linguaggio funzionale puro, ad eccezione di qualsiasi cosa di tipo IO a, che ha un supporto compilatore speciale per gli effetti collaterali. (La purezza è preservata altrove perché tutto ciò che esegue o osserva un effetto collaterale è di tipo IO a, quindi il sistema dei tipi assicura che il resto del programma rimanga puro.)
Sam Stokes

4
Accade così che IOsia una monade, ma non è per questo che è permesso fare effetti collaterali. Essere una monade è ciò che ti permette di scrivere quella sintassi dall'aspetto imperativo: assicura anche (anche con un supporto linguistico speciale) che gli effetti collaterali si verifichino in un ordine ragionevole, quindi non leggi dal file prima di scriverlo, ecc. .
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);
}

10
+1, molto più bello e leggibile della versione C ++! Sogno un giorno in cui D sostituisce completamente C e C ++. :-)
missingfaktor

10
Bello. Forse dovrei imparare D un giorno.
helpermethod,

34

Rubino

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

2
+1 Bello, ma per essere rigoroso, non inserire l'input in una variabile prima di scriverlo sulla console.
Lasse Espeholt,

3
@lasseespeholt, hai ragione. L'ho riparato.
Wayne Conrad,

5
Nessun motivo per scrivere in maiuscolo nome e pronunciare "PERCORSO". Di 'solo' percorso '.
OTZ,

2
@otz È una costante. Avrebbe potuto chiamarlo "Path", una costante in Ruby deve solo iniziare con una lettera maiuscola.
Sirupsen,

1
@Thomas Ahle: quando si utilizza File.opencon un blocco, il file viene aperto, passato al blocco e quindi chiuso automaticamente.
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)è solo .Net 4.0, l'alternativa è File.ReadAllLines(path)[1]che analizza l'intero file in un array.


1
è piuttosto breve in C #. grazie per il contributo
Brock Woolf,

13
NOTA: File.ReadLines è specifico per .NET 4
kirk.burleson il

5
Che sintassi dall'aspetto spiacevole ha C #
Aiden Bell,

3
@Aiden Bell: rispetto a quale lingua?
zfedoran,

2
@Aiden Bell - Questa risposta sta cercando di essere concisa e leggibile. Ci sono molti modi "carini" per ottenere la stessa cosa in C #. Vedi dotnetperls.com/file-handling per esempi più realistici.
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;
}

Bella risposta. Grazie per aver contribuito con +1
Brock Woolf,

Perché chiamate fgets () due volte?
kirk.burleson,

2
Perché la seconda riga è quella che vogliamo stampare su stdout
JeremyP,

1
#include <stdio.h> int main (void) { file FILE ; char buf [128]; file = fopen ("fileio.txt", "w"); if (! file) goto error; fputs ("ciao \ n", file); fflush (file); fputs ("world \ n", file); fclose (file); file = fopen ("fileio.txt", "r"); if (! file) goto error; fgets (buf, sizeof (buf), file); / skip 'hello' / fgets (buf, sizeof (buf), file); / get 'word' * / fclose (file); fputs (buf, stdout); ritorna 0; errore: fputs ("Impossibile aprire il file \ n", stderr); ritorno 1; }
FelipeC

Bella codifica pulita (un sacco di controllo dell'errore decente) nel post C originale (che in qualche modo spegne la lunghezza).
Xagyg,

29

Shell Script (UNIX)

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

In realtà la sed -n "2p"parte stampa la seconda riga, ma la domanda richiede che la seconda riga sia memorizzata in una variabile e quindi stampata, quindi ... :)


9
Non so perché, ma adoro questo :)
Federico Klez Culloca,

Certo che conta. Bella risposta e grazie per aver contribuito con +1
Brock Woolf,

Perché non inviare lo standard a / dev / null?
Gumbo,

Esiste una versione un po 'più semplice e veloce, che utilizza solo i builtin della shell (invece di rinviare un processo separato per invocare sed), qui: stackoverflow.com/questions/3538156/…
Brian Campbell,

@Gumbo, allora come otterresti la seconda linea? LINE=`foo`cattura l'output di foonella variabile LINE.
Strager

27

x86 Assembler (NASM) su Linux

Non lo tocco da 7 anni, quindi ho dovuto usare un po 'Google per hackerarlo insieme, ma funziona ancora;) So che non è corretto al 100%, ma ehi: D

OK, non funziona. scusa per questo. mentre stampa worldalla fine, non lo stampa dal file, ma dal ecxquale è impostato sulla riga 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

Riferimenti utilizzati: 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


Lo correggerai in modo che funzioni al 100%? In caso contrario, eliminalo in modo che una versione funzionante possa prendere il suo posto.
kirk.burleson,

4
La cosa divertente è che l'esempio in C, che dovrebbe essere un linguaggio di livello superiore, è lungo quanto questo ... =)
Jani Hartikainen,

1
@Jani: Ma almeno è un po 'più facile da capire.
sbi,


21

JavaScript - node.js

Innanzitutto, molti callback nidificati.

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

Un po 'più pulito:

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

@Ionut: grazie per i tuoi numerosi contributi +1
Brock Woolf,

4
@Dave, non è il JS trovato nei browser. Voglio dire, sintatticamente e semanticamente, è lo stesso JS, solo la libreria standard è diversa. Ho usato lo stdlib della node.jspiattaforma. Vedi nodejs.org
Ionuț G. Stan il

5
Questo codice sta chiedendo continuazioni. Posso sentire le sue lacrime.
Matt,

2
Non è divertente il numero di righe che corrisponde quasi a quello della soluzione ASM al piano di sotto?
kizzx2,

1
@Matt sì, le continuazioni o le monadi aiuterebbero anche qui.
Martijn,

21

Lisp comune

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

1
per una lingua chiamata "lisp" ci dovrebbero essere molte più lettere "s" coinvolte :)
iwasrobbed

18

PowerShell

sc fileio.txt 'hello'
ac fileio.txt 'world'
$line = (gc fileio.txt)[1]
$line

3
Questo è bello e pulito. Yay Powershell.
Jay Bazuzi,

Sono d'accordo con la tua logica riguardo al preventivo. La ragione per cui li ho rimossi è che mi sono reso conto che questo script è in cima per essere compatto, quindi lo volevo per me ancora più piccolo - ma lo lasciamo chiaro :). E l'uso di gcinvece di catha un senso :-) get-aliasmi ha dato catprima (non uso molto PowerShell).
Lasse Espeholt,

4
Accidenti, c'è qualcosa di più corto ??
0

18

Shell Script

Ecco uno script di shell che utilizza solo comandi integrati, anziché invocare comandi esterni come sedo tailcome hanno fatto le risposte precedenti.

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

Quando si scrivono script di shell significativi, è consigliabile utilizzare i builtin il più possibile, poiché la generazione di un processo separato può essere lenta; da un rapido test sulla mia macchina, la sedsoluzione è circa 20 volte più lenta dell'uso read. Se hai intenzione di chiamare seduna volta, come in questo caso, non ha molta importanza, poiché verrà eseguito più rapidamente di quanto tu possa notare, ma se lo eseguirai centinaia o migliaia di volte, può addizionare.

Per coloro che non hanno familiarità con la sintassi {ed } eseguono un elenco di comandi nell'attuale ambiente shell (al contrario di (e )che creano una subshell; dobbiamo operare nell'ambiente shell corrente, in modo da poter utilizzare il valore della variabile in un secondo momento) . Dobbiamo raggruppare i comandi in modo che entrambi operino sullo stesso flusso di input, creato reindirizzando da fileio.txt; se avessimo semplicemente eseguito read < fileio.txt; read input < fileio.txt, avremmo semplicemente la prima riga, poiché il file sarebbe chiuso e riaperto tra i due comandi. A causa di una idiosincrasia della sintassi della shell ( {e }sono parole riservate, al contrario dei metacaratteri), dobbiamo separare {e}dal resto dei comandi con spazi e termina l'elenco dei comandi con a ;.

Il readbuiltin prende come argomento i nomi delle variabili da leggere. Consuma una riga di input, interrompe l'input per spazio bianco (tecnicamente, lo interrompe in base al contenuto di $IFS, che per impostazione predefinita è un carattere di spazio, dove un carattere di spazio significa dividerlo su uno qualsiasi di spazio, scheda o newline), assegna ogni parola ai nomi delle variabili indicati in ordine e assegna il resto della riga all'ultima variabile. Dato che stiamo fornendo solo una variabile, inserisce l'intera riga in quella variabile. Riutilizziamo la $inputvariabile, dal momento che non ci interessa cosa c'è nella prima riga (se stiamo usando Bash non potremmo semplicemente fornire un nome di variabile, ma per essere portabili, devi sempre fornire almeno un nome).

Nota che mentre puoi leggere le righe una alla volta, come faccio qui, uno schema molto più comune sarebbe quello di avvolgerlo in un ciclo while:

while read foo bar baz
do
  process $foo $bar $baz
done < input.txt

3
Molto bella. Ho imparato qualcosa (anche se temporaneamente).
Potatoswatter il

Grazie per il tuo contributo Brian.
Brock Woolf,

Totalmente malato! In senso buono :-)
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)))))

O in modo equivalente, usando la macro threading ->(nota anche come rimozione del paren):

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

1
WTF, negli ultimi 50 anni quasi nessuno ha mai detto che Lisp / Scheme si sgretolano!
Ionuț G. Stan,

11
Aspetta, spitè davvero il nome della funzione di scrittura su file?
Sam Stokes,

4
Clojure sicuramente non scuote!
kirk.burleson,

1
@ [Sam Stokes] C'è una funzione nel core chiamata slurp che legge un intero file in una stringa e lo restituisce. lo sputo fa l'esatto contrario. Qual è il problema? Ci sono altre funzioni, come line-seq, che fanno cose simili in modi diversi.
Rayne,

4
@ kirk.burleson Rocks più di Java, certamente. :)
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

1
F #. Bello. Grazie per il tuo contributo
Brock Woolf,

16

DI BASE

Non uso BASIC da quasi 10 anni, ma questa domanda mi ha dato un motivo per ripulire rapidamente le mie conoscenze. :)

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$

È incredibile che tu possa ancora farlo dopo 10 anni !. Ben fatto e grazie per il tuo contributo.
Brock Woolf,

Ovviamente non l'ho fatto dalla cima della mia testa: ci sono voluti alcuni minuti per cercare alcune cose.
Casablanca,

Si, certo. Ancora ben fatto
Brock Woolf,

Non hai bisogno dei numeri di riga nella versione più classica di BASIC ???
Yuji,

@Yuji: nella "versione più classica", sì, ma non credo che nessuna versione dai primi anni '90 li abbia richiesti.
Casablanca,

16

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

17
Non mi è mai piaciuto Objective-C. La sintassi sembra così estranea quando proviene da una lingua come Java.
Faisal Abid,

5
Il segreto di Objective-C è che Xcode esegue tutto il completamento del codice per te. Non devi ricordare i nomi lunghi del metodo. Certamente rendono il tuo codice molto più leggibile però
Brock Woolf

7
E ho pensato che la sintassi c ++ fosse già la peggiore.
Rospo,

6
Objective-C ha un aspetto negativo solo perché l'evidenziatore della sintassi Stackoverflow non viene colorato correttamente.
Brock Woolf,

4
Non riesco a credere che questo sia così in fondo alla lista! Anche i ragazzi Java che commentano che Objective-C è brutto, hai visto quante righe ci sono volute per scrivere lo stesso file? Ero un appassionato di Java, ma penso che Objective-C si sia insinuato nel mio cuore.
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];

15
che dire dei filehandle lessicali, 3 argomenti aperti?
MKV

6
I filehandle non lessicali non devono mai essere utilizzati su Stack Overflow. Raramente ce n'è bisogno in pratica e ai principianti non dovrebbe mai essere dimostrato che esistano.
Ether

4
Lo stesso vale per due argomenti aperti: non dovresti mai usarlo su Stack Overflow e probabilmente non in pratica.
rpkelly,

2
Uso così tanto i filehandle 3-arg open e lessical che praticamente lo considero un errore di sintassi quando lo vedo. E così dovrebbe essere. / io medito di scrivere un modulo per renderlo tale.
Kent Fredric,

2
"Anche unary open ha i suoi usi", ha i suoi usi, sì, ma mi sono sentito abusato il giorno in cui ho capito come funziona e andrò "Sicuramente c'è un altro modo" ogni volta che vedo qualcuno che pensa di averne bisogno. perl -we 'for (q{ps aux |}){ open _; print <_>; }'
Kent Fredric,

15

R:

cat ("ciao \ n", file = "fileio.txt")
cat ("world \ n", file = "fileio.txt", append = TRUE)
line2 = readLines ("fileio.txt", n = 2) [2]
cat (line2)

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

È fantastico. Grazie per il contributo
Brock Woolf,

20
In alternativa, potresti prendere l'implementazione C e aggiungere segni di dollaro.
Kendall Hopkins,

@strager Non ne ho idea. Ci sono persone che non sanno che è optinale e che in realtà è meglio senza di essa.
Ionuț G. Stan,

6
Nel caso in cui qualcuno sia curioso, la ragione per cui ha lasciato il tag di chiusura è perché se lo includi e lasci uno spazio bianco finale, rischi di ottenere un errore "intestazioni già inviate".
Bill H,

Riferimento per no ?>: framework.zend.com/manual/en/…
cdmckay

15

Giava

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

36
@Brock: oggigiorno Java non è lento. Semplicemente prolisso, ma non lento. Si prega di non fare tali commenti; ci fa male alla gente di JVM. : '|
missingfaktor il

9
Chiunque abbia detto che Java è lento o è un odiatore cieco di Java o vive sotto una roccia. Java può essere veloce quanto, se non più veloce di C, con l'avvio indipendente dalla piattaforma.
NullUserException

4
@ Miss Faktor: E così?
Jerry Coffin,

19
la velocità di esecuzione è la forma più ritardata di concorsi di pipì che i programmatori hanno. Si tratta sempre di scegliere lo strumento giusto per il lavoro, scegliere una metrica casuale come la velocità di esecuzione e assegnare un sacco di importanza ad esso è semplicemente sciocco, soprattutto perché la velocità di esecuzione non è orribilmente importante per la stragrande maggioranza dei compiti, purché è abbastanza veloce (che Java è per quasi tutto)
Matt Briggs

11
"il cablaggio è più veloce del codice macchina", "il codice macchina è più veloce di asm", "asm è più veloce di C", "C è più veloce di Java", "blah blah blah" ... Hai anche un indizio di quanto il riferimento indiretto è già tra codice macchina e CPU? microcodice, ottimizzatore predittivo, cache di istruzioni / dati, decodificatore, ecc., per non parlare del non determinismo causato dall'allocazione dinamica in C / asm. Java e altri linguaggi sicuri sono solo un altro piccolo passo di riferimento indiretto, non è un grosso problema. Puoi rimanere nella tua forma primitiva per sempre o evolvere con noi.
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';
}

o un po 'meno pedanticamente,

#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;
}

1
Grande! Grazie per aver contribuito con +1
Brock Woolf,

14
Ho dimenticato quanto possa essere brutta la sintassi del c ++.
Rospo,

Questo è atroce rispetto a come appare la maggior parte del codice C ++. Il problema principale è la mancanza di costanti appropriate definite nella libreria standard, tuttavia, non sintassi. Mi sorprende che devo includere <limits>solo per dire che ignorenon c'è un limite alla dimensione della linea.
Potatoswatter,

8
@Hans: Vuoi chiarire questo? Personalmente, penso che l'I / O appartenga a una libreria piuttosto che alla lingua, e tutte le lingue che programma in quel modo (C, C ++, Java, Python, ecc.)
Chinmay Kanchi,

2
Ora so perché Linus dice che C ++ è brutto. (senza offesa)
kizzx2,

13

Partire

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

23
Questa lingua dovrebbe essere ribattezzata "type"
Aiden Bell il

Quella os.O_RDWR | os.O_CREATE, 0666spazzatura è necessaria anche per l'I / O dei file di base in Go?
Joey Adams,

1
O forse dovrebbe essere rinominato "Stop"
xagyg

16
È piuttosto sorprendente che, dopo 30 anni di evoluzione e design del linguaggio, siano ancora riusciti a inventare un nuovo linguaggio che è difficile scrivere codice per il controllo degli errori come C. Anche Java è meno prolisso!
DK.

5
Wow ... Go sembra fallire così tanto con questo esempio
Alessandro Stamatto,

12

Erlang

Probabilmente non il più idiomatico Erlang, ma:

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

12

Emacs Lisp

Nonostante ciò che alcuni dicono che Emacs è principalmente un editor di testo [1]. Quindi, mentre Emacs Lisp può essere utilizzato per risolvere tutti i tipi di problemi, è ottimizzato per le esigenze di un editor di testo. Poiché gli editor di testo (ovviamente) hanno esigenze piuttosto specifiche quando si tratta di come i file vengono gestiti, ciò influisce sulla funzionalità relativa ai file offerta da Emacs Lisp.

Fondamentalmente questo significa che Emacs Lisp non offre funzioni per aprire un file come flusso e leggerlo parte per parte. Allo stesso modo non è possibile aggiungere a un file senza prima caricare l'intero file. Invece il file viene completamente [2] letto in un buffer [3], modificato e quindi salvato nuovamente in un file.

Per le attività indispensabili utilizzare Emacs Lisp per questo è adatto e se si desidera fare qualcosa che non comporta la modifica, è possibile utilizzare le stesse funzioni.

Se si desidera aggiungere più volte un file, questo comporta un enorme sovraccarico, ma è possibile, come dimostrato qui. In pratica normalmente si finisce di apportare modifiche a un buffer manualmente o a livello di programmazione prima di scrivere su un file (basta combinare le prime due espressioni s nell'esempio seguente).

(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] Almeno non andrei al punto di chiamarlo un sistema operativo; un'interfaccia utente alternativa sì, un sistema operativo no.

[2] Puoi caricare solo parti di un file, ma questo può essere specificato solo per byte.

[3] Un buffer è sia un tipo di dati in qualche modo simile a una stringa, sia la "cosa che vedi durante la modifica di un file". Durante la modifica di un buffer viene visualizzato in una finestra ma i buffer non devono necessariamente essere visibili all'utente.

Modifica: se vuoi vedere il testo che viene inserito nel buffer, ovviamente devi renderlo visibile e dormire tra le azioni. Poiché Emacs normalmente rivisualizza lo schermo solo in attesa dell'input dell'utente (e dormire non è la stessa cosa in attesa dell'input), è necessario forzare la visualizzazione. Questo è necessario in questo esempio (usalo al posto del secondo sexp); in pratica non ho mai dovuto usare il "ridisplay" nemmeno una volta, quindi sì, è brutto ma ...

(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"))

1
bene grazie. È possibile migliorarlo così vedo davvero un "fantasma" che apre il file e lo digita, come una macro di qualche tipo?
zedoo,

11

File batch di Windows - Versione n. 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

Per spiegare quell'ultimo orribile ciclo di ricerca, si presume che ci sia solo ciao (newline) mondo nel file. Quindi salta solo la prima riga ed echo solo la seconda.

changelog

  • 2 - Opps, devono aver letto male i requisiti o sono cambiati su di me. Ora legge l'ultima riga dal file


pulito. grazie per il tuo contributo.
Brock Woolf,

Comprendo il passaggio 4) come lettura dal file creato.
devio,

@devio - I requisiti devono essere cambiati o ho appena letto male ... Comunque vedrò se esiste una soluzione del genere
TheLQ

11

Scala:

Utilizzando la libreria standard:

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)

Utilizzando la libreria Scala-ARM di 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)      


Poiché molte persone hanno usato lo stesso descrittore di file per scrivere le due stringhe, includo anche questo nella mia risposta.

Utilizzando la libreria standard:

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)

Utilizzando la libreria Scala-ARM di 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)

Penso che questo sarebbe più bello con flush () invece di close () ... nessuna nuova istanza di FileWriter.
Radtoo,

2
@Radtoo: ho dovuto mostrare l'operazione di aggiunta. Ecco perché l'ho fatto in questo modo.
missingfaktor il

@Radtoo: dopo aver esaminato le altre risposte in questa discussione, ho finalmente deciso di includerlo nella mia risposta. Controllalo. (Non ho rimosso il codice originale.)
missingfaktor il

@Missing Faktor, getLines().toList()dovrebbe essere getLines().toSeqchi è pigro?
Elazar Leibovich,

@Elazar: buon suggerimento. Grazie. :)
missingfaktor

11

Groovy

new File("fileio.txt").with { 
    write  "hello\n"
    append "world\n"   
    println secondLine = readLines()[1]
}

grazie per il contributo.
Brock Woolf,

3
Stai tradendo la parte "world \ n". Non è accodato, sta solo scrivendo nello stesso descrittore di file.
OTZ,

Il terzo chiarimento nel post originale recita "Non è necessario riaprire il file di testo dopo aver scritto la prima riga"
Wayne Keenan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.