Essa deve ser uma pergunta comum que todos os programadores têm de tempos em tempos. Como leio uma linha de um arquivo de texto? Em seguida, a próxima pergunta é sempre como escrevê-la novamente.
É claro que a maioria de vocês usa uma estrutura de alto nível na programação diária (o que é bom para usar em respostas), mas às vezes é bom saber como fazê-lo em um nível baixo também.
Eu mesmo sei como fazê-lo C
, C++
e Objective-C
, mas com certeza seria útil ver como isso é feito em todos os idiomas populares, apenas para nos ajudar a tomar uma decisão melhor sobre em qual idioma executar nosso arquivo. Em particular Eu acho que seria interessante ver como isso é feito nas linguagens de manipulação de strings, como: e python
, é ruby
claro perl
.
Então, acho que aqui podemos criar um recurso da comunidade que todos podemos destacar em nossos perfis e nos referir a quando precisamos fazer E / S de arquivo em algum novo idioma. Sem mencionar a exposição que todos teremos em idiomas com os quais não lidamos no dia a dia.
É assim que você precisa responder:
- Crie um novo arquivo de texto chamado " fileio.txt "
- Escreva a primeira linha "olá" no arquivo de texto.
- Anexe a segunda linha "mundo" ao arquivo de texto.
- Leia a segunda linha "mundo" em uma sequência de entrada.
- Imprima a sequência de entrada no console.
Esclarecimento:
- Você deve mostrar como fazer isso em uma linguagem de programação apenas por resposta.
- Suponha que o arquivo de texto não exista anteriormente
- Você não precisa reabrir o arquivo de texto depois de escrever a primeira linha
Não há limite específico para o idioma.
C
, C++
, C#
, Java
, Objective-C
São todos grandes.
Se você sabe como fazê-lo em Prolog
, Haskell
, Fortran
, Lisp
, ou Basic
, por favor, vá em frente.
fonte
Respostas:
Python 3
Esclarecimentos
readlines () retorna uma lista de todas as linhas no arquivo. Portanto, a invocação de readlines () resulta na leitura de cada linha do arquivo. Nesse caso específico, é bom usar readlines () porque temos que ler o arquivo inteiro de qualquer maneira (queremos a última linha). Mas se nosso arquivo contém muitas linhas e queremos apenas imprimir a enésima linha, não é necessário ler o arquivo inteiro. Aqui estão algumas maneiras melhores de obter a enésima linha de um arquivo no Python: O que substitui o xreadlines () no Python 3? .
O que é isso com afirmação? A instrução with inicia um bloco de código no qual você pode usar a variável f como um objeto de fluxo retornado da chamada para open (). Quando o bloco with termina, o python chama f.close () automaticamente. Isso garante que o arquivo será fechado quando você sair do bloco com, não importa como ou quando você sair do bloco (mesmo que você o saia por uma exceção não tratada). Você poderia chamar f.close () explicitamente, mas e se o seu código criar uma exceção e você não chegar à chamada f.close ()? É por isso que a declaração with é útil.
Você não precisa reabrir o arquivo antes de cada operação. Você pode escrever o código inteiro dentro de um bloco.
Usei três com blocos para enfatizar a diferença entre as três operações: gravação (modo 'w'), acréscimo (modo 'a'), leitura (modo 'r', o padrão).
fonte
readlines()[1]
código de exemplo. Nesse caso, você pode saber que o arquivo tem apenas duas linhas, mas alguém assumindo alegremente que é uma boa solução pode testá-lo em um arquivo de um milhão de linhas e obter uma surpresa bastante desagradável.readlines()
retorno de um iterador (não uma lista) Apenas uma observação: você normalmente não pode indexar um iterador.range
objeto possui suporte especial para indexação, o que é feito em O (1).LOLCODE
As especificações são incompletas para dizer o mínimo, mas eu fiz o melhor que pude. Que comece a votação! :) Ainda acho um exercício divertido.
fonte
Cérebro *** k
fonte
COBOL
Desde que ninguém mais fez ......
fonte
Haskell
Se você quiser apenas ler / gravar um arquivo:
fonte
IO a
, que possui suporte especial do compilador para efeitos colaterais. (Pureza é preservada em outro lugar, porque qualquer coisa que executa ou observa um efeito colateral é do tipoIO a
, de modo que o sistema de tipo garante o resto de suas estadias programa puros.)IO
é uma mônada, mas não é por isso que é permitido causar efeitos colaterais. Ser uma mônada é o que permite escrever essa sintaxe de aparência imperativa: também garante (também com suporte especial a idiomas) que os efeitos colaterais ocorram em uma ordem sensata, para que você não leia o arquivo antes de escrever nele, etc. .D
fonte
Rubi
fonte
File.open
com um bloco, o arquivo é aberto, passado para o bloco e depois fechado automaticamente.C #
File.ReadLines(path).ElementAt(1)
é apenas .Net 4.0, a alternativa éFile.ReadAllLines(path)[1]
que analisa o arquivo inteiro em uma matriz.fonte
ANSI C
fonte
Script de shell (UNIX)
Na verdade, a
sed -n "2p"
peça imprime a segunda linha, mas a pergunta pede que a segunda linha seja armazenada em uma variável e depois impressa, então ... :)fonte
sed
), aqui: stackoverflow.com/questions/3538156/…LINE=`foo`
capta a saída defoo
na variávelLINE
.x86 Assembler (NASM) no Linux
Não toquei no ASM há 7 anos, então tive que usar o Google um pouco para hackear isso juntos, mas ainda assim funciona;) Eu sei que não é 100% correto, mas ei: D
OK, isso não funciona. desculpe por isso. embora seja impresso
world
no final, não o imprime do arquivo, mas doecx
que está definido na linha 27.Referências 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
fonte
JavaScript - node.js
Primeiro, muitos retornos de chamada aninhados.
Um pouco mais limpo:
fonte
node.js
plataforma. Veja nodejs.orgLisp comum
fonte
PowerShell
fonte
gc
vez decat
faz sentido :-)get-alias
me deucat
primeiro (não estou usando muito o PowerShell).Shell Script
Aqui está um script de shell usando apenas comandos internos, em vez de chamar comandos externos, como
sed
outail
como as respostas anteriores fizeram.Ao escrever scripts shell significativos, é aconselhável usar os recursos internos o máximo possível, pois a geração de um processo separado pode ser lenta; de um teste rápido na minha máquina, a
sed
solução é cerca de 20 vezes mais lenta que a utilizadaread
. Se você vai ligarsed
uma vez, como neste caso, isso realmente não importa muito, pois será executado mais rapidamente do que você pode notar, mas se você for executá-lo centenas ou milhares de vezes, poderá adicionar.Para aqueles que não estão familiarizados com a sintaxe
{
e}
execute uma lista de comandos no ambiente atual do shell (ao contrário de(
e)
que cria um subshell; precisamos estar operando no ambiente atual do shell, para que possamos usar o valor da variável posteriormente) . Precisamos agrupar os comandos para que ambos operem no mesmo fluxo de entrada, criado pelo redirecionamento defileio.txt
; se simplesmente rodássemosread < fileio.txt; read input < fileio.txt
, obteríamos a primeira linha, pois o arquivo seria fechado e reaberto entre os dois comandos. Devido a uma idiossincrasia da sintaxe do shell ({
e}
são palavras reservadas, em oposição aos metacaracteres), precisamos separar o{
e}
do restante dos comandos com espaços e encerre a lista de comandos com a;
.O
read
builtin usa como argumento os nomes das variáveis a serem lidas. Consome uma linha de entrada, quebra a entrada por espaço em branco (tecnicamente, quebra de acordo com o conteúdo de$IFS
, o padrão é um caractere de espaço, onde um caractere de espaço significa dividi-lo em qualquer espaço, tabulação ou nova linha), atribui cada palavra aos nomes de variáveis dados em ordem e atribui o restante da linha à última variável. Como estamos apenas fornecendo uma variável, apenas coloca toda a linha nessa variável. Reutilizamos a$input
variável, pois não nos importamos com o que está na primeira linha (se estivermos usando o Bash, não poderíamos fornecer um nome de variável, mas, para ser portátil, você sempre deve fornecer pelo menos um nome).Observe que, embora você possa ler linhas uma de cada vez, como eu faço aqui, um padrão muito mais comum seria envolvê-la em um loop while:
fonte
Clojure
Ou de forma equivalente, usando a macro de segmentação
->
(também conhecida como removedor de parênteses):fonte
spit
é realmente o nome da função de gravação em arquivo?F #
fonte
BASIC
Não uso o BASIC há quase 10 anos, mas essa pergunta me deu uma razão para aprimorar rapidamente meu conhecimento. :)
fonte
Objetivo-C
fonte
Perl
fonte
perl -we 'for (q{ps aux |}){ open _; print <_>; }'
R:
fonte
PHP
fonte
?>
: framework.zend.com/manual/en/…Java
fonte
C ++
ou um pouco menos pedanticamente,
fonte
<limits>
apenas para dizer queignore
não há um limite para o tamanho da linha.Ir
fonte
os.O_RDWR | os.O_CREATE, 0666
lixo é necessário para E / S básica de arquivo no Go?Erlang
Provavelmente não é o Erlang mais idiomático, mas:
fonte
Emacs Lisp
Apesar do que algumas pessoas dizem, o Emacs é principalmente um editor de texto [1]. Portanto, embora o Emacs Lisp possa ser usado para resolver todos os tipos de problemas, ele é otimizado para as necessidades de um editor de texto. Como os editores de texto (obviamente) têm necessidades bastante específicas quando se trata de como os arquivos são manipulados, isso afeta a funcionalidade relacionada ao arquivo que o Emacs Lisp oferece.
Basicamente, isso significa que o Emacs Lisp não oferece funções para abrir um arquivo como um fluxo e lê-lo parte por parte. Da mesma forma, você não pode anexar a um arquivo sem carregar o arquivo inteiro primeiro. Em vez disso, o arquivo é completamente [2] lido em um buffer [3], editado e salvo em um arquivo novamente.
Para tarefas obrigatórias, você usaria o Emacs Lisp, pois isso é adequado e, se você quiser fazer algo que não envolva a edição, as mesmas funções podem ser usadas.
Se você deseja anexar um arquivo repetidamente, isso vem com uma enorme sobrecarga, mas é possível como demonstrado aqui. Na prática, você normalmente termina de fazer alterações em um buffer, manual ou programaticamente, antes de gravar em um arquivo (basta combinar as duas primeiras expressões s no exemplo abaixo).
[1] Pelo menos eu não chegaria a chamá-lo de sistema operacional; uma interface alternativa sim, um SO não.
[2] Você pode carregar apenas partes de um arquivo, mas isso só pode ser especificado em bytes.
[3] Um buffer é tanto um tipo de dados semelhante a uma string quanto a "coisa que você vê ao editar um arquivo". Enquanto a edição de um buffer é exibida em uma janela, os buffers não precisam necessariamente estar visíveis para o usuário.
Editar: se você quiser ver o texto sendo inserido no buffer, obviamente precisará torná-lo visível e dormir entre as ações. Como o Emacs normalmente apenas exibe novamente a tela ao aguardar a entrada do usuário (e dormir não é o mesmo que aguardar pela entrada), você também precisa forçar a exibição novamente. Isso é necessário neste exemplo (use-o no lugar do segundo sexp); na prática, nunca tive que usar o `reexibir 'nem uma vez - então sim, isso é feio, mas ...
fonte
Arquivos de lote do Windows - versão 2
Para explicar o último loop de procura horrível, assume-se que existe apenas o mundo hello (newline) no arquivo. Então, apenas pula a primeira linha e repete apenas a segunda.
Changelog
2 - Opps, devem interpretar mal os requisitos ou eles mudaram para mim. Agora lê a última linha do arquivo
fonte
Scala:
Usando a biblioteca padrão:
Usando a Scala-ARM Library de Josh Suereth :
Como muitas pessoas usaram o mesmo descritor de arquivo para escrever as duas seqüências de caracteres, também estou incluindo essa maneira na minha resposta.
Usando a biblioteca padrão:
Usando a Scala-ARM Library de Josh Suereth :
fonte
getLines().toList()
deve ser ogetLines().toSeq
que é preguiçoso?Groovy
fonte