E / S de archivo en cada lenguaje de programación [cerrado]

127

Esta tiene que ser una pregunta común que todos los programadores tienen de vez en cuando. ¿Cómo leo una línea de un archivo de texto? Entonces la siguiente pregunta es siempre cómo la escribo.

Por supuesto, la mayoría de ustedes usan un marco de alto nivel en la programación diaria (que está bien usar en las respuestas), pero a veces es bueno saber cómo hacerlo también en un nivel bajo.

Yo mismo sé cómo hacerlo en C, C++y Objective-C, pero seguro que sería muy útil para ver cómo se hace en todos los lenguajes populares, aunque sólo sea para ayudarnos a tomar una mejor decisión sobre qué lenguaje para hacer nuestro archivo io. En particular, Creo que sería interesante ver cómo se hace en los lenguajes de manipulación de cadenas, como: y python, rubypor supuesto perl.

Así que imagino que aquí podemos crear un recurso comunitario que todos podamos destacar en nuestros perfiles y consultar cuando necesitemos hacer E / S de archivos en algún idioma nuevo. Sin mencionar la exposición a la que todos llegaremos a idiomas que no tratamos en el día a día.

Así es como debes responder:

  1. Cree un nuevo archivo de texto llamado " fileio.txt "
  2. Escriba la primera línea "hola" en el archivo de texto.
  3. Agregue la segunda línea "mundo" al archivo de texto.
  4. Lea la segunda línea "mundo" en una cadena de entrada.
  5. Imprima la cadena de entrada a la consola.

Aclaración:

  • Debe mostrar cómo hacerlo en un lenguaje de programación por respuesta solamente.
  • Suponga que el archivo de texto no existe de antemano
  • No necesita volver a abrir el archivo de texto después de escribir la primera línea

No hay límite particular en el idioma. C, C++, C#, Java, Objective-CSon todos grandes.

Si usted sabe cómo hacerlo en Prolog, Haskell, Fortran, Lisp, o Basic, por favor, adelante.

Brock Woolf
fuente
9
El problema con esto es que no aparecerá en las búsquedas de un idioma específico, ya que no está ni puede ser etiquetado con cada idioma.
ChrisF
21
No entiendo por qué esta pregunta está cerrada. ¿No es el propósito de este sitio ayudar a las personas a encontrar información? Si alguien sabe cómo hacer algo (como IO) en C y quiere aprender a hacer lo mismo en Python, esto podría ayudarlos al permitirles ver ambos lado a lado.
Slapout
18
Tampoco entiendo por qué esto está cerrado. Parece que es solo porque no incluye las palabras "... en la menor cantidad de caracteres ..." que es bastante tonto. El golf de código es un ejercicio divertido. ¿Pero es realmente útil hacer que todas las preguntas de rosetta-stone hayan ofuscado un pequeño código en todas las respuestas?
Spencer Nelson
12
No entiendo cómo encaja esto en un sitio de preguntas y respuestas: al menos con el código golf, hay un estándar algo objetivo para votar las respuestas: la respuesta más corta o más inteligente obtiene la mayor cantidad de votos. Con esto: ¿qué es, a cuántas personas les gusta Haskell? Preguntas como esta son como tratar de calzar todo tipo de contenido posible en un sistema diseñado para uno solo. ¿Qué tiene de malo el resto de Internet para manejar esto?
11
Por qué esto no funciona bien. No hay información sobre los pros y los contras de cada enfoque (¿qué idiomas admiten solo una forma?). No se discuten las compensaciones y los problemas profundos en cada idioma. Alcance limitado que implica que la necesidad de un bajiliion separa las preguntas "en todos los idiomas". Y, sobre todo, no hay moderación comunitaria de la calidad de cada respuesta. ¿Por qué no digo moderación cuando la gente vota por ellos? Porque se supone que solo hay una respuesta para cada idioma, y ​​las personas no leerán suficientes respuestas para ver múltiples alternativas en su campo.
dmckee --- ex-gatito moderador

Respuestas:

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)

Aclaraciones

  • readlines () devuelve una lista de todas las líneas en el archivo. Por lo tanto, la invocación de readlines () da como resultado la lectura de todas y cada una de las líneas del archivo. En ese caso particular, está bien usar readlines () porque tenemos que leer todo el archivo de todos modos (queremos su última línea). Pero si nuestro archivo contiene muchas líneas y solo queremos imprimir su enésima línea, no es necesario leer el archivo completo. Aquí hay algunas formas mejores de obtener la enésima línea de un archivo en Python: ¿Qué sustituye a xreadlines () en Python 3? .

  • ¿Qué es esto con la declaración? La instrucción with comienza un bloque de código donde puede usar la variable f como un objeto de flujo devuelto por la llamada a open (). Cuando finaliza el bloque with, python llama a f.close () automáticamente. Esto garantiza que el archivo se cerrará cuando salga del bloque with sin importar cómo o cuándo salga del bloque (incluso si lo sale a través de una excepción no controlada). Puede llamar a f.close () explícitamente, pero ¿qué sucede si su código genera una excepción y no accede a la llamada f.close ()? Es por eso que la declaración with es útil.

  • No necesita volver a abrir el archivo antes de cada operación. Puede escribir todo el código dentro de uno con bloque.

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

    Usé tres con bloques para enfatizar la diferencia entre las tres operaciones: escribir (modo 'w'), agregar (modo 'a'), leer (modo 'r', el valor predeterminado).

snakile
fuente
19
Realmente no creo que nadie deba escribir readlines()[1]código de ejemplo. En este caso, es posible que sepa que el archivo solo tiene dos líneas, pero alguien más, asumiendo alegremente que es una buena solución, podría probarlo en un archivo de un millón de líneas y obtener una sorpresa bastante desagradable.
Porculus
14
@ Porculus con líneas de lectura () no pasamos por todas las líneas del archivo. Esto es python 3. readlines () devuelve un iterador (no una lista). Por lo tanto, solo se leerán las dos primeras líneas del archivo. Esto es similar a xreadlines () en python 2 (que no existe en python 3).
snakile
77
@snakile: ¿podría citar algo que respalde los readlines()retornos de un iterador (no una lista)? Solo una nota: generalmente no puede indexar un iterador.
SilentGhost
8
@SilentGhost Estoy citando "Sumérgete en Python 3": "El método readlines () ahora devuelve un iterador, por lo que es tan eficiente como xreadlines () en Python 2". Busque esta declaración en: diveintopython3.org/porting-code-to-python-3-with-2to3.html . En segundo lugar, en Python 3 puede indexar un iterador. Escriba range (10) [4] en el shell (range () también devuelve un iterador en Python 3 en contraposición a python 2, donde range () devuelve una lista). Tenga en cuenta que el rango (N) [i] se realiza en O (i), no en O (1) y no en O (N).
snakile
55
@snakile: sus comentarios son incorrectos en varios niveles. Primero, readlines devuelve una lista en Python 3 (pruébelo y vea). Entonces el código dado leerá todo el archivo. En segundo lugar, los iteradores no pueden indexarse ​​en Python 2 o 3. El rangeobjeto tiene un soporte especial para la indexación, que se realiza en O (1).
Interjay
242

LOLCODE

Las especificaciones son incompletas, por decir lo menos, pero hice lo mejor que pude. ¡Que comience el downvoting! :) Todavía me parece un ejercicio divertido.

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
fuente
28
No creo que haya otro idioma para tener esta propiedad que, literalmente, me haga ... jajaja.
Ionuț G. Stan
85
¿Es triste que creo que LOLCODE es más legible que cualquier otra cosa que haya visto?
Joel
13
Es interesante lo que se siente como un lenguaje natural.
Abhinav Sarkar
19
Decir que esperas que te voten negativamente es una garantía de votos positivos en SO porque la psicología inversa es una acción refleja para un programador.
Brock Woolf
13
El PLZ? / AWSUM THX / O NOES es simplemente genial. Esto me parece un poco todopoderoso.
Calvin1602
43

Cerebro *** k

,------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-],------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]
Svisstack
fuente
26
¿Te perdiste un '-'? ;)
Aiden Bell
2
Oh el esfuerzo Solo para que conste, ¿cuánto tiempo tardó en escribir?
Riduidel
¿Y no puedes dividir eso en varias líneas? El mejor idioma
TheIronKnuckle
42

COBOL

Como nadie más lo hizo ...

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
fuente
2
Esto debería ser votado no menos de 1 millón de veces por pura genialidad +1
Brock Woolf
1
+1 para "Este idioma todavía existe". = D
missingfaktor
3
Tenga cuidado al intentar esto en casa. Su compilador de cobol podría no gustarle estas líneas modernas de longitud variable ...
Stephan Eggermont
Sí, esto me trae algunos viejos recuerdos oxidados. Aunque no creo que cumpla con los requisitos ...
EvilTeach
¡Estoy escribiendo código en AcuCOBOL ahora mismo! Por cierto, ¿dónde está la parte "I" de "I / O"?
Buggabill el
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

Si solo quiere leer / escribir un archivo:

main :: IO ()
main = readFile "somefile.txt" >>= writeFile "someotherfile.txt" 
Ionuț G. Stan
fuente
77
Ahh el 'Todopoderoso' Haskell. Gracias por su contribución :)
Brock Woolf
3
@Andreas Rejbrand Estoy casi seguro de que olvidó un 'ser'
Federico klez Culloca
44
Hay una serie de otros enfoques para la E / S básica en Haskell que se vuelven útiles / importantes en Haskell una vez que está haciendo ciertos tipos de aplicaciones. Los paquetes de texto y de cadena de bytes en cabal / hackage le permiten manejar varias codificaciones, y varios paquetes de estilo iteratee como iteratee y enumerate representan una "abstracción más conocida" para hacer io incremental. También es importante analizar libs como parsec y la cadena de bytes incremental solo attoparsec lib. Haskellers ha adoptado un enfoque muy exhaustivo para explorar las opciones de diseño de io. Ejemplos inviables incluyen perezoso io y continuaciones
Carter Tazio Schonwald
44
Yuji: básicamente, haciendo trampa. Haskell es un lenguaje funcional puro, a excepción de cualquier cosa de tipo IO a, que tiene soporte especial de compilación para efectos secundarios. (La pureza se conserva en otro lugar porque todo lo que realiza u observa un efecto secundario es de tipo IO a, por lo que el sistema de tipos garantiza que el resto de su programa se mantenga puro.)
Sam Stokes
44
Sucede que IOes una mónada, pero no es por eso que está permitido hacer efectos secundarios. Ser una mónada es lo que le permite escribir esa sintaxis de aspecto imperativo: también se asegura (también con un soporte de lenguaje especial) de que los efectos secundarios ocurran en un orden razonable, por lo que no debe leer el archivo antes de escribirlo, etc. .
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);
}
Bernardo
fuente
10
+1, ¡Mucho más hermoso y legible que la versión C ++! Sueño con un día en que D reemplace completamente a C y C ++. :-)
missingfaktor
10
Agradable. Tal vez debería aprender D algún día.
helpermethod
34

Rubí

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
fuente
2
+1 Agradable, pero para ser estrictos, no pones la entrada en una variable antes de escribirla en la consola.
Lasse Espeholt
3
@lasseespeholt, tienes razón. Lo arreglé.
Wayne Conrad el
55
No hay razón para poner en mayúsculas el nombre de var y decir 'RUTA'. Solo di 'camino'.
OTZ
2
@otz Es una constante. Sin embargo, podría haberlo llamado 'Ruta', una constante en Ruby solo tiene que comenzar con una letra mayúscula.
Sirupsen el
1
@ Thomas Ahle: cuando se usa File.opencon un bloque, el archivo se abre, se pasa al bloque y luego se cierra automáticamente.
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)es .Net 4.0 solamente, la alternativa es File.ReadAllLines(path)[1]analizar el archivo completo en una matriz.

Lasse Espeholt
fuente
1
es bastante corto en C #. gracias por contribuir
Brock Woolf
13
NOTA: File.ReadLines es específico de .NET 4
kirk.burleson el
55
Qué sintaxis de aspecto desagradable tiene C #
Aiden Bell
3
@Aiden Bell: ¿en relación con qué idioma?
zfedoran
2
@Aiden Bell: esta respuesta está tratando de ser sucinta sobre legible. Hay muchas formas "agradables" de lograr lo mismo en C #. Visite dotnetperls.com/file-handling para obtener ejemplos más realistas.
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
fuente
Buena respuesta. Gracias por contribuir +1
Brock Woolf
¿Por qué llamas a fgets () dos veces?
kirk.burleson
2
Porque la segunda línea es la que queremos imprimir en stdout
JeremyP
1
#include <stdio.h> int main (void) { archivo FILE ; char buf [128]; archivo = fopen ("fileio.txt", "w"); if (! file) goto error; fputs ("hola \ n", archivo); fflush (archivo); fputs ("mundo \ n", archivo); fclose (archivo); archivo = fopen ("fileio.txt", "r"); if (! file) goto error; fgets (buf, sizeof (buf), archivo); / skip 'hola' / fgets (buf, sizeof (buf), archivo); / get 'word' * / fclose (archivo); fputs (buf, stdout); devuelve 0; error: fputs ("No se pudo abrir el archivo \ n", stderr); retorno 1; }
FelipeC
Buena codificación limpia (muchas comprobaciones de errores decentes) en la publicación original de C (que socava un poco la longitud).
xagyg
29

Shell Script (UNIX)

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

En realidad, la sed -n "2p"parte imprime la segunda línea, pero la pregunta solicita que la segunda línea se almacene en una variable y luego se imprima, así que ... :)

robertbasic
fuente
9
No sé por qué, pero me encanta esto :)
Federico klez Culloca
Por supuesto que cuenta. Buena respuesta y gracias por contribuir +1
Brock Woolf
¿Por qué no enviar el estándar a / dev / null?
Gumbo
Hay una versión algo más simple y más rápida, que usa solo componentes integrados de shell (en lugar de bifurcar un proceso separado para invocar sed), aquí: stackoverflow.com/questions/3538156/…
Brian Campbell
@Gumbo, ¿cómo conseguirías la segunda línea? LINE=`foo`captura la salida de fooen la variable LINE.
extraño
27

Ensamblador x86 (NASM) en Linux

No he tocado asm en 7 años, así que tuve que usar Google un poco para hackear esto juntos, pero aun así, funciona;) Sé que no es 100% correcto, pero bueno: D

OK, no funciona lo siento por esto si bien se imprime worldal final, no lo imprime desde el archivo, sino desde el ecxque se establece en la línea 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

Referencias utilizadas: 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
fuente
¿Vas a corregirlo para que funcione al 100%? Si no, elimínelo para que una versión que funcione pueda ocupar su lugar.
kirk.burleson
44
Lo que es divertido es que el ejemplo en C, que se supone que es un lenguaje de nivel superior, es tan largo como este ... =)
Jani Hartikainen
1
@ Jani: Pero al menos es algo más fácil de entender.
sbi
Pensé que era para DOS al principio :)
mlvljr
21

JavaScript - node.js

Primero, muchas devoluciones de llamadas anidadas.

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 poco más limpio:

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
fuente
@Ionut: Gracias por sus muchas contribuciones +1
Brock Woolf
44
@Dave, no es el JS encontrado en los navegadores. Quiero decir, sintáctica y semánticamente, es el mismo JS, solo que la biblioteca estándar es diferente. Usé el stdlib de la node.jsplataforma. Ver nodejs.org
Ionuț G. Stan
55
Este código está pidiendo continuas. Puedo escuchar sus lágrimas.
Matt
2
¿No es curioso que el número de líneas casi coincida con el de la solución ASM de abajo?
kizzx2
1
@ Matt, sí, las continuaciones o mónadas también ayudarían aquí.
Martijn
21

Lisp común

(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
fuente
1
para un lenguaje llamado "ceceo" no debería ser mucho más "S" cartas involucrados :)
iwasrobbed
18

Potencia Shell

sc fileio.txt 'hello'
ac fileio.txt 'world'
$line = (gc fileio.txt)[1]
$line
Lasse Espeholt
fuente
3
Esto es bonito y limpio. Yay PowerShell.
Jay Bazuzi
Estoy de acuerdo con tu lógica sobre las citas. La razón por la que los eliminé fue porque me di cuenta de que este script está en la parte superior por ser compacto, por lo que quería que fuera aún más pequeño, pero dejamos que quede claro :). Y el uso de en gclugar de cattiene sentido :-) get-aliasme dio catprimero (no estoy usando mucho PowerShell).
Lasse Espeholt
44
Maldición, ¿hay algo más corto?
0fnt
18

Shell Script

Aquí hay un script de shell que usa solo comandos integrados, en lugar de invocar comandos externos como sedo tailcomo lo han hecho respuestas anteriores.

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

Cuando se escriben scripts de shell importantes, es aconsejable usar builtins tanto como sea posible, ya que generar un proceso separado puede ser lento; de una prueba rápida en mi máquina, la sedsolución es aproximadamente 20 veces más lenta que usarla read. Si va a llamar seduna vez, como en este caso, realmente no importa mucho, ya que se ejecutará más rápido de lo que puede notar, pero si lo va a ejecutar cientos o miles de veces, puede agregar.

Para aquellos que no están familiarizados con la sintaxis {y } ejecutan una lista de comandos en el entorno de shell actual (a diferencia de (y )que crean un subshell; necesitamos operar en el entorno de shell actual, para que podamos usar el valor de la variable más adelante) . Necesitamos agrupar los comandos para que ambos operen en la misma secuencia de entrada, creada al redirigir desde fileio.txt; si simplemente ejecutamos read < fileio.txt; read input < fileio.txt, obtendríamos la primera línea, ya que el archivo se cerraría y volvería a abrirse entre los dos comandos. Debido a una idiosincrasia de sintaxis de shell ( {y }son palabras reservadas, a diferencia de los metacaracteres), necesitamos separar el {y}del resto de los comandos con espacios, y terminar la lista de comandos con a ;.

El readincorporado toma como argumento los nombres de las variables para leer. Consume una línea de entrada, divide la entrada por espacios en blanco (técnicamente, la divide de acuerdo con el contenido de $IFS, que por defecto es un carácter de espacio, donde un carácter de espacio significa dividirlo en cualquiera de los espacios, tabulaciones o líneas nuevas), asigna cada palabra a los nombres de variables dados en orden, y asigna el resto de la línea a la última variable. Como solo estamos suministrando una variable, simplemente coloca la línea completa en esa variable. Reutilizamos la $inputvariable, ya que no nos importa lo que está en la primera línea (si estamos usando Bash, simplemente no podríamos proporcionar un nombre de variable, pero para ser portátil, siempre debe proporcionar al menos un nombre).

Tenga en cuenta que si bien puede leer las líneas de una en una, como hago aquí, un patrón mucho más común sería envolverlo en un ciclo while:

while read foo bar baz
do
  process $foo $bar $baz
done < input.txt
Brian Campbell
fuente
3
Muy agradable. Aprendí algo (aunque sea temporalmente).
Potatoswatter
Gracias por tu contribución Brian.
Brock Woolf
Totalmente enfermo! En el buen sentido :-)
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, de manera equivalente, utilizando la macro de subprocesos ->(también conocida como removedor de par):

(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
fuente
1
¡WTF, durante los últimos 50 años casi nadie dijo que Lisp / Scheme es genial!
Ionuț G. Stan
11
Espera, ¿ spites realmente el nombre de la función de escritura en archivo?
Sam Stokes
44
¡Clojure definitivamente no se balancea!
kirk.burleson
1
@ [Sam Stokes] Hay una función en el núcleo llamada slurp que lee un archivo completo en una cadena y lo devuelve. escupir hace exactamente lo contrario. ¿Cual es el problema? Hay otras funciones, como line-seq, que hacen cosas similares de diferentes maneras.
Rayne
44
@ kirk.burleson Rocas más que Java, sin duda. :)
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
fuente
1
F#. Agradable. Gracias por tu aporte.
Brock Woolf
16

BÁSICO

No he usado BASIC en casi 10 años, pero esta pregunta me dio una razón para repasar rápidamente mi conocimiento. :)

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
fuente
¡Es increíble que aún puedas hacer esto después de 10 años! Bien hecho y gracias por tu contribución.
Brock Woolf
Por supuesto, no lo hice fuera de mi cabeza: me tomó unos minutos buscar algunas cosas.
casablanca
Sí, por supuesto. Aún bien hecho.
Brock Woolf
¿No necesitas números de línea en la versión más clásica de BASIC ???
Yuji
@ Yuji: En la "versión más clásica", sí, pero no creo que ninguna versión desde principios de los 90 los haya requerido.
casablanca
16

C objetivo

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
fuente
17
Nunca me ha gustado Objective-C. La sintaxis parece tan extraña cuando proviene de un lenguaje como Java.
Faisal Abid
55
El secreto de Objective-C es que Xcode hace todo el código por usted. No tiene que recordar los nombres largos de los métodos. Sin embargo
Brock Woolf
77
Y pensé que la sintaxis de c ++ ya se veía peor.
Sapo
66
Objective-C solo se ve mal porque el resaltador de sintaxis de Stackoverflow no se colorea correctamente.
Brock Woolf
44
¡No puedo creer que esto esté tan abajo en la lista! También los chicos de Java comentando que Objective-C es feo, ¿viste cuántas líneas se necesitaron para escribir el mismo archivo? Solía ​​ser un entusiasta de Java, pero creo que Objective-C se ha infiltrado en mi corazón.
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
fuente
15
¿Qué pasa con los archivos léxicos, 3 argumentos abiertos?
MkV
66
Los manejadores de archivos no léxicos nunca deben usarse en Stack Overflow. Rara vez hay una necesidad de ellos en la práctica, y los principiantes nunca deben demostrar que incluso existen.
Éter
44
Lo mismo ocurre con dos argumentos abiertos: nunca debe usarlo en Stack Overflow, y probablemente no en la práctica.
rpkelly
2
Uso archivos de 3 argumentos abiertos y léxicos tanto que prácticamente lo considero un error de sintaxis cuando lo veo. Y así debería ser. / me considera escribir un módulo para hacerlo así.
Kent Fredric el
2
"Incluso el abierto unario tiene sus usos", tiene sus usos, sí, pero me sentí abusado el día que descubrí cómo funciona, y diré "Seguramente hay otra forma" cada vez que veo a alguien que cree que lo necesitan. perl -we 'for (q{ps aux |}){ open _; print <_>; }'
Kent Fredric
15

R:

cat ("hola \ n", archivo = "fileio.txt")
cat ("world \ n", file = "fileio.txt", append = TRUE)
line2 = readLines ("fileio.txt", n = 2) [2]
gato (línea2)
David F
fuente
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
fuente
Eso es genial. Gracias por el aporte.
Brock Woolf el
20
Alternativamente, puede tomar la implementación C y agregar signos de dólar.
Kendall Hopkins el
@strager No tengo idea. Hay personas que no saben que es optinal y que en realidad es mejor sin él.
Ionuț G. Stan
66
En caso de que alguien tenga curiosidad, la razón por la que dejó la etiqueta de cierre es porque si la incluye y deja un espacio en blanco al final, corre el riesgo de recibir un error de "encabezados ya enviados".
Bill H
Referencia para no ?>: 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
fuente
36
@Brock: Actualmente, Java no es lento. Solo detallado, pero no lento. Por favor no hagas tales comentarios; nos duele la gente de JVM. : '|
missingfaktor
9
Quien dijo que Java es lento es un enemigo ciego de Java o vive debajo de una roca. Java puede ser tan rápido, si no más rápido que C, con independencia de plataforma para arrancar.
NullUserException
44
@ Miss Faktor: ¿Y qué?
Jerry Coffin
19
La velocidad de ejecución es la forma más retrasada de concursos de meadas que tienen los programadores. Siempre se trata de elegir la herramienta adecuada para el trabajo, elegir una métrica aleatoria como la velocidad de ejecución y asignar montones de importancia es simplemente una tontería, especialmente porque la velocidad de ejecución no es terriblemente importante para la gran mayoría de las tareas, siempre y cuando es lo suficientemente rápido (que Java es para casi todo)
Matt Briggs
11
"el cableado es más rápido que el código de máquina", "el código de máquina es más rápido que asm", "asm es más rápido que C", "C es más rápido que Java", "bla, bla, bla" ... ¿Tiene una pista de cuánto ¿Ya existe indirección entre el código de máquina y la CPU? microcódigo, optimizador predictivo, cachés de instrucciones / datos, decodificador, etc., sin mencionar el no determinismo causado por la asignación dinámica en C / asm. Java y otros lenguajes seguros son solo un pequeño paso más de indirección, no es gran cosa. Puede permanecer en su forma primitiva para siempre o evolucionar con nosotros.
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 algo menos pedante,

#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
fuente
1
¡Excelente! Gracias por contribuir +1
Brock Woolf
14
Olvidé lo fea que puede ser la sintaxis de c ++.
Sapo
Esto es atroz en comparación con el aspecto de la mayoría de los códigos C ++. Sin embargo, el problema principal es la falta de constantes apropiadas definidas en la biblioteca estándar, no la sintaxis. Me sorprende que tenga que incluir <limits>solo para decir que ignoreno hay un límite para el tamaño de la línea.
Potatoswatter
8
@Hans: ¿Te gustaría aclarar eso? Personalmente, creo que I / O pertenece a una biblioteca en lugar de al lenguaje, y todos los lenguajes en los que
programo
2
Ahora sé por qué Linus dice que C ++ es feo. (sin ofender)
kizzx2
13

Vamos

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
fuente
23
Este idioma debe renombrarse "tipo"
Aiden Bell
¿Es esa os.O_RDWR | os.O_CREATE, 0666basura incluso necesaria para E / S de archivos básicos en Go?
Joey Adams
1
O tal vez debería cambiarse de nombre "Stop"
xagyg
16
Es bastante sorprendente que, después de 30 años de evolución y diseño del lenguaje, hayan logrado inventar un nuevo lenguaje que sea tan difícil de escribir en el código de verificación de errores como C. ¡Incluso Java es menos detallado!
DK.
55
Wow ... Ir parece mucho Fallar con este ejemplo
Alessandro Stamatto
12

Erlang

Probablemente no sea el Erlang más idiomático, pero:

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

Emacs Lisp

A pesar de lo que algunas personas dicen, Emacs es principalmente un editor de texto [1]. Entonces, aunque Emacs Lisp se puede utilizar para resolver todo tipo de problemas, está optimizado para las necesidades de un editor de texto. Dado que los editores de texto (obviamente) tienen necesidades bastante específicas cuando se trata de cómo se manejan los archivos, esto afecta la funcionalidad relacionada con los archivos que ofrece Emacs Lisp.

Básicamente, esto significa que Emacs Lisp no ofrece funciones para abrir un archivo como secuencia y leerlo parte por parte. Del mismo modo, no puede agregar a un archivo sin cargar primero todo el archivo. En cambio, el archivo se lee completamente [2] en un búfer [3], se edita y luego se guarda nuevamente en un archivo.

Para las tareas obligatorias, usaría Emacs Lisp para esto es adecuado y si desea hacer algo que no implique la edición, se pueden usar las mismas funciones.

Si desea agregar a un archivo una y otra vez, esto viene con una sobrecarga enorme, pero es posible como se demuestra aquí. En la práctica, normalmente termina de hacer cambios en un búfer, ya sea de forma manual o programática, antes de escribir en un archivo (solo combine las dos primeras expresiones s en el ejemplo a continuación).

(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] Al menos no iría tan lejos como llamarlo un sistema operativo; una interfaz de usuario alternativa sí, un sistema operativo no.

[2] Puede cargar solo partes de un archivo, pero esto solo puede especificarse en bytes.

[3] Un búfer es a la vez un tipo de datos similar a una cadena, así como "lo que ves al editar un archivo". Mientras se edita un búfer se muestra en una ventana, pero los búferes no necesariamente tienen que ser visibles para el usuario.

Editar: si desea ver el texto insertado en el búfer, obviamente debe hacerlo visible y dormir entre acciones. Debido a que Emacs normalmente solo vuelve a mostrar la pantalla cuando espera la entrada del usuario (y dormir no es lo mismo que esperar la entrada), también debe forzar la nueva visualización. Esto es necesario en este ejemplo (úselo en lugar del segundo sexp); en la práctica nunca tuve que usar 'redisplay' ni siquiera una vez, así que sí, esto es feo pero ...

(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
fuente
1
genial gracias. ¿Es posible mejorar esto para que realmente vea un 'fantasma' abriendo el archivo y escribiendo en él, como una macro de algún tipo?
zedoo
11

Archivos por lotes de Windows - Versió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

Para explicar ese último ciclo de búsqueda horrible, se supone que solo hay un mundo hola (nueva línea) en el archivo. Por lo tanto, solo se salta la primera línea y se repite solo la segunda.

Registro de cambios

  • 2 - Opps, debe haber leído mal los requisitos o me han cambiado. Ahora lee la última línea del archivo

TheLQ
fuente
ordenado. Gracias por tu aporte.
Brock Woolf
Entiendo el paso 4) como leer del archivo creado.
devio
@devio: los requisitos deben haber cambiado o simplemente los leí mal ... De todos modos, veré si tal solución existe
TheLQ
11

Scala:

Usando la biblioteca estándar:

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)

Usando la biblioteca Scala-ARM de 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)      


Como muchas personas han usado el mismo descriptor de archivo para escribir las dos cadenas, también incluyo esa manera en mi respuesta.

Usando la biblioteca estándar:

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)

Usando la biblioteca Scala-ARM de 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)
99%
fuente
Creo que esto se vería mejor con flush () en lugar de close () ... sin volver a crear instancias de FileWriter.
Radtoo
2
@Radtoo: Tenía que mostrar la operación de agregar. Por eso lo hice de esta manera.
missingfaktor
@Radtoo: Después de mirar otras respuestas en este hilo, finalmente decidí incluir esa manera en mi respuesta. Revisalo. (Sin embargo, no he eliminado el código original.)
missingfaktor
@ Missing Faktor, ¿ getLines().toList()debería ser getLines().toSeqflojo?
Elazar Leibovich
@Elazar: Buena sugerencia. Gracias. :)
missingfaktor
11

Maravilloso

new File("fileio.txt").with { 
    write  "hello\n"
    append "world\n"   
    println secondLine = readLines()[1]
}
Wayne Keenan
fuente
gracias por contribuir
Brock Woolf
3
Estás haciendo trampa en la parte "mundo \ n". No es anexa, solo está escribiendo en el mismo descriptor de archivo.
OTZ
La tercera aclaración en la publicación original dice "No es necesario volver a abrir el archivo de texto después de escribir la primera línea"
Wayne Keenan