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
, ruby
por 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:
- Cree un nuevo archivo de texto llamado " fileio.txt "
- Escriba la primera línea "hola" en el archivo de texto.
- Agregue la segunda línea "mundo" al archivo de texto.
- Lea la segunda línea "mundo" en una cadena de entrada.
- 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-C
Son todos grandes.
Si usted sabe cómo hacerlo en Prolog
, Haskell
, Fortran
, Lisp
, o Basic
, por favor, adelante.
fuente
Respuestas:
Python 3
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.
Usé tres con bloques para enfatizar la diferencia entre las tres operaciones: escribir (modo 'w'), agregar (modo 'a'), leer (modo 'r', el valor predeterminado).
fuente
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.readlines()
retornos de un iterador (no una lista)? Solo una nota: generalmente no puede indexar un iterador.range
objeto tiene un soporte especial para la indexación, que se realiza en O (1).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.
fuente
Cerebro *** k
fuente
COBOL
Como nadie más lo hizo ...
fuente
Haskell
Si solo quiere leer / escribir un archivo:
fuente
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 tipoIO a
, por lo que el sistema de tipos garantiza que el resto de su programa se mantenga puro.)IO
es 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. .re
fuente
Rubí
fuente
File.open
con un bloque, el archivo se abre, se pasa al bloque y luego se cierra automáticamente.C#
File.ReadLines(path).ElementAt(1)
es .Net 4.0 solamente, la alternativa esFile.ReadAllLines(path)[1]
analizar el archivo completo en una matriz.fuente
ANSI C
fuente
Shell Script (UNIX)
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 ... :)fuente
sed
), aquí: stackoverflow.com/questions/3538156/…LINE=`foo`
captura la salida defoo
en la variableLINE
.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
world
al final, no lo imprime desde el archivo, sino desde elecx
que se establece en la línea 27.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
fuente
JavaScript - node.js
Primero, muchas devoluciones de llamadas anidadas.
Un poco más limpio:
fuente
node.js
plataforma. Ver nodejs.orgLisp común
fuente
Potencia Shell
fuente
gc
lugar decat
tiene sentido :-)get-alias
me diocat
primero (no estoy usando mucho PowerShell).Shell Script
Aquí hay un script de shell que usa solo comandos integrados, en lugar de invocar comandos externos como
sed
otail
como lo han hecho respuestas anteriores.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
sed
solución es aproximadamente 20 veces más lenta que usarlaread
. Si va a llamarsed
una 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 desdefileio.txt
; si simplemente ejecutamosread < 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
read
incorporado 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$input
variable, 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:
fuente
Clojure
O, de manera equivalente, utilizando la macro de subprocesos
->
(también conocida como removedor de par):fuente
spit
es realmente el nombre de la función de escritura en archivo?F#
fuente
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. :)
fuente
C objetivo
fuente
Perl
fuente
perl -we 'for (q{ps aux |}){ open _; print <_>; }'
R:
fuente
PHP
fuente
?>
: framework.zend.com/manual/en/…Java
fuente
C ++
o algo menos pedante,
fuente
<limits>
solo para decir queignore
no hay un límite para el tamaño de la línea.Vamos
fuente
os.O_RDWR | os.O_CREATE, 0666
basura incluso necesaria para E / S de archivos básicos en Go?Erlang
Probablemente no sea el Erlang más idiomático, pero:
fuente
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).
[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 ...
fuente
Archivos por lotes de Windows - Versión # 2
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
fuente
Scala:
Usando la biblioteca estándar:
Usando la biblioteca Scala-ARM de Josh Suereth :
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:
Usando la biblioteca Scala-ARM de Josh Suereth :
fuente
getLines().toList()
debería sergetLines().toSeq
flojo?Maravilloso
fuente