Arquivo E / S em todas as linguagens de programação [fechado]

127

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, é rubyclaro 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:

  1. Crie um novo arquivo de texto chamado " fileio.txt "
  2. Escreva a primeira linha "olá" no arquivo de texto.
  3. Anexe a segunda linha "mundo" ao arquivo de texto.
  4. Leia a segunda linha "mundo" em uma sequência de entrada.
  5. 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-CSão todos grandes.

Se você sabe como fazê-lo em Prolog, Haskell, Fortran, Lisp, ou Basic, por favor, vá em frente.

Brock Woolf
fonte
9
O problema é que ele não aparece nas pesquisas de um idioma específico, pois não é, nem pode ser, marcado com todos os idiomas.
ChrisF
21
Não entendo por que essa pergunta está encerrada. O objetivo deste site não é ajudar as pessoas a encontrar informações? Se alguém souber fazer algo (como IO) em C e quiser aprender a fazer o mesmo no Python, isso poderá ajudá-lo, permitindo que eles vejam os dois lado a lado.
Slapout
18
Também não entendo por que isso está fechado. Parece que é apenas porque não inclui as palavras "... na menor quantidade de caracteres ...", o que é bem bobo. O código de golfe é um exercício divertido. Mas é realmente útil fazer com que todas as perguntas sobre pedra de roseta tenham ofuscado um pequeno código em todas as respostas?
Spencer nelson
12
Não entendo como isso se encaixa em um site de perguntas e respostas: pelo menos no código de golfe, há um padrão um tanto objetivo para votar nas respostas: a resposta mais curta ou mais inteligente recebe mais votos. Com isso: o que é, quantas pessoas gostam de Haskell? Perguntas como essa são como tentar encaixar todo tipo de conteúdo possível em um sistema projetado para apenas um. O que há de errado com o resto da internet para lidar com isso?
11
Por que isso não funciona bem. Nenhuma informação sobre os prós e contras de cada abordagem (que idiomas suportam apenas uma maneira?). Nenhuma discussão sobre as compensações e questões profundas em cada idioma. Escopo limitado, o que implica que a necessidade de um bajiliion separa as perguntas "em todos os idiomas". E acima de tudo, não há moderação da comunidade na qualidade de cada resposta. Por que não digo moderação quando as pessoas estão votando nelas? Porque é suposto haver apenas uma resposta para cada idioma, e as pessoas não leem respostas suficientes para ver várias alternativas em seu campo.
dmckee --- gatinho ex-moderador

Respostas:

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)

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.

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

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

snakile
fonte
19
Eu realmente acho que ninguém deveria escrever um 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.
Porculus
14
@Porculus com readlines (), não passamos por todas as linhas do arquivo. Este é o python 3. readlines () retorna um iterador (não uma lista). Portanto, apenas as duas primeiras linhas do arquivo serão lidas. Isso é semelhante ao xreadlines () no python 2 (que não existe no python 3).
snakile
7
@snakile: você poderia citar algo que apóie o readlines()retorno de um iterador (não uma lista) Apenas uma observação: você normalmente não pode indexar um iterador.
SilentGhost
8
@SilentGhost Estou citando "Dive into Python 3": "O método readlines () agora retorna um iterador, portanto é tão eficiente quanto o xreadlines () estava no Python 2". Pesquise esta declaração em: diveintopython3.org/porting-code-to-python-3-with-2to3.html . Segundo, no python 3, você pode indexar um iterador. Digite range (10) [4] no shell (range () também retorna um iterador no Python 3, ao contrário do python 2, em que range () retorna uma lista). Observe que o intervalo (N) [i] é feito em O (i), não em O (1) e não em O (N).
precisa saber é o seguinte
5
@snakile: Seus comentários estão errados em vários níveis. Primeiro, o readlines retorna uma lista no Python 3 (teste e veja). Portanto, o código fornecido irá ler o arquivo inteiro. Segundo, os iteradores não podem ser indexados no Python 2 ou 3. O rangeobjeto possui suporte especial para indexação, o que é feito em O (1).
interjay
242

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.

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
fonte
28
Eu não acho que exista outra linguagem para ter essa propriedade, literalmente, para me fazer ... lol.
Ionuț G. Stan
85
É triste pensar que LOLCODE é mais legível do que qualquer outra coisa que eu já vi?
Joel
13
É interessante o quanto parece uma linguagem natural.
Abhinav Sarkar
19
Dizer que você espera receber votos negativos é uma garantia para votos positivos no SO, porque a psicologia reversa é uma ação reflexa para um programador.
Brock Woolf
13
O PLZ? / AWSUM THX / O NOES é simplesmente fantástico. Isso parece meio poderoso para mim.
Calvin1602
43

Cérebro *** k

,------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-],------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]
Svisstack
fonte
26
Você perdeu um '-'? ;)
Aiden Bell
2
Oh, o esforço. Só para constar, quanto tempo levou para escrever?
Riduidel 24/08
E você não pode dividir isso em várias linhas? Melhor idioma de todos os tempos
TheIronKnuckle 25/11
42

COBOL

Desde que ninguém mais fez ......

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
fonte
2
Este deve ser votado até há menos de 1 milhão de vezes para o awesomeness pura +1
Brock Woolf
1
+1 em "Este idioma ainda existe". = D
missingfaktor
3
Tenha cuidado ao tentar fazer isso em casa. Seu compilador COBOL pode não gostar destas linhas de comprimento variável modernos ...
Stephan Eggermont
Sim, isso traz de volta algumas lembranças enferrujadas. Eu não acho que ele atende aos requisitos embora ...
EvilTeach
Estou escrevendo código no AcuCOBOL agora mesmo! A propósito, onde está a parte "I" de "E / S?"
Buggabill 23/08/10
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 você quiser apenas ler / gravar um arquivo:

main :: IO ()
main = readFile "somefile.txt" >>= writeFile "someotherfile.txt" 
Ionuț G. Stan
fonte
7
Ahh, o 'Todo-Poderoso' Haskell. Obrigado pela sua contribuição :)
Brock Woolf
3
@Andreas Rejbrand Estou quase certo de que ele se esqueceu de um 'ser'
Federico klez Culloca
4
Existem várias outras abordagens de E / S básica no Haskell que se tornam úteis / importantes no Haskell quando você faz certos tipos de aplicativos. Os pacotes de texto e bytestring no cabal / hackage permitem lidar com várias codificações, e vários pacotes no estilo iteratee, como iteratee e enumerate, representam uma "abstração mais conhecida" para executar io incremental. Também são importantes a análise de bibliotecas como o parsec e a cadeia de bytes incremental apenas para a attoparsec lib. Os haskellers adotaram uma abordagem muito completa para explorar as opções de design de io. Exemplos não viáveis incluem io preguiçoso e continuações
Carter Tazio Schonwald
4
Yuji: basicamente, trapaceando. Haskell é uma linguagem funcional pura, exceto para qualquer coisa do tipo 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 tipo IO a, de modo que o sistema de tipo garante o resto de suas estadias programa puros.)
Sam Stokes
4
Acontece que 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. .
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);
}
Bernard
fonte
10
+1, muito mais bonito e legível do que a versão C ++! Sonho com um dia em que D substitua completamente C e C ++. :-)
missingfaktor
10
Agradável. Talvez eu deva aprender D algum dia.
precisa saber é o seguinte
34

Rubi

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
fonte
2
+1 Legal, mas para ser rigoroso, você não coloca a entrada em uma variável antes de gravá-la no console.
Lasse Espeholt
3
@lasseespeholt, você está certo. Eu consertei isso.
Wayne Conrad
5
Não há razão para colocar o nome da variável em maiúsculas e dizer 'PATH'. Apenas diga 'caminho'.
OTZ
2
@otz É uma constante. Ele poderia ter chamado de 'Caminho', porém, uma constante em Ruby só precisa começar com uma letra maiúscula.
Sirupsen
1
@ Thomas Ahle: ao usar File.opencom um bloco, o arquivo é aberto, passado para o bloco e depois fechado automaticamente.
Matchu 23/08/10
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)é apenas .Net 4.0, a alternativa é File.ReadAllLines(path)[1]que analisa o arquivo inteiro em uma matriz.

Lasse Espeholt
fonte
1
é bastante curto em c #. obrigado por contribuir
Brock Woolf
13
NOTA: File.ReadLines é específico para o .NET 4
kirk.burleson
5
Que sintaxe de aparência desagradável em C # #
Aiden Bell
3
@ Aiden Bell: em relação a qual idioma?
Zfedoran
2
@ Aiden Bell - Esta resposta está tentando ser sucinta sobre legível. Existem muitas maneiras "legais" de conseguir a mesma coisa em C #. Veja dotnetperls.com/file-handling para exemplos mais 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
fonte
Boa resposta. Obrigado por contribuir com +1
Brock Woolf
Por que você chama fgets () duas vezes?
precisa saber é o seguinte
2
Porque a segunda linha é a que queremos imprimir para stdout
JeremyP
1
#include <stdio.h> int main (vazio) { arquivo FILE ; char buf [128]; file = fopen ("fileio.txt", "w"); if (! file) goto erro; fputs ("olá \ n", arquivo); fflush (arquivo); fputs ("mundo \ n", arquivo); fclose (arquivo); file = fopen ("fileio.txt", "r"); if (! file) goto erro; fgets (buf, sizeof (buf), arquivo); / skip 'olá' / fgets (buf, sizeof (buf), arquivo); / get 'word' * / fclose (arquivo); saídas (buf, stdout); retornar 0; error: fputs ("Não foi possível abrir o arquivo \ n", stderr); retornar 1; }
FelipeC 24/08/10
Boa codificação limpa (muita verificação decente de erros) no post C original (que diminui um pouco o comprimento).
Xagyg
29

Script de shell (UNIX)

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

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 ... :)

robertbasic
fonte
9
Eu não sei porque, mas eu amo este :)
Federico klez Culloca
Claro que conta. Boa resposta e obrigado por contribuir com +1
Brock Woolf
Por que não enviar o padrão para / dev / null?
Gumbo
Há uma versão um pouco mais simples e mais rápida, usando apenas shell embutidos (em vez de iniciar um processo separado para invocação sed), aqui: stackoverflow.com/questions/3538156/…
Brian Campbell
@ Gumbo, então como você obteria a segunda linha? LINE=`foo`capta a saída de foona variável LINE.
strager
27

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 worldno final, não o imprime do arquivo, mas do ecxque está definido na linha 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

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

robertbasic
fonte
Você vai corrigi-lo para que funcione 100%? Caso contrário, exclua-o para que uma versão de trabalho possa ser substituída.
precisa saber é o seguinte
4
O que é engraçado é que o exemplo em C, que é suposto ser uma linguagem de nível superior, dura tanto quanto esta ... =) #
311 Jani Hartikainen
1
@Jani: Mas pelo menos é um pouco mais fácil de entender.
Sbi 19/09
Pensei que era para DOS no primeiro :)
mlvljr
21

JavaScript - node.js

Primeiro, muitos retornos de chamada aninhados.

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

Um pouco mais limpo:

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
fonte
@Ionut: Obrigado por suas muitas contribuições. +1
Brock Woolf
4
@ Dave, não é o JS encontrado nos navegadores. Quero dizer, sintática e semanticamente, é o mesmo JS, apenas a biblioteca padrão é diferente. Eu usei o stdlib da node.jsplataforma. Veja nodejs.org
Ionuț G. Stan
5
Este código está clamando por continuações. Eu posso ouvir suas lágrimas.
22810 Matt
2
Não é engraçado o número de linhas estar quase igual ao da solução ASM no andar de baixo?
precisa saber é o seguinte
1
@ Matt sim, continuações ou mônadas também ajudariam aqui.
Martijn
21

Lisp comum

(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
fonte
1
para uma linguagem chamada "língua presa" deve haver muito mais "S" letras envolvido :)
iwasrobbed
18

PowerShell

sc fileio.txt 'hello'
ac fileio.txt 'world'
$line = (gc fileio.txt)[1]
$line
Lasse Espeholt
fonte
3
Isso é bom e limpo. Yay PowerShell.
Jay Bazuzi
Eu concordo com sua lógica sobre citar. A razão pela qual os removi foi que percebi que esse script estava realmente no topo por ser compacto, então eu o queria ainda menor - mas deixamos claro :). E o uso de em gcvez de catfaz sentido :-) get-aliasme deu catprimeiro (não estou usando muito o PowerShell).
Lasse Espeholt
4
Porra, há algo mais curto?
precisa saber é o seguinte
18

Shell Script

Aqui está um script de shell usando apenas comandos internos, em vez de chamar comandos externos, como sedou tailcomo as respostas anteriores fizeram.

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

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 sedsolução é cerca de 20 vezes mais lenta que a utilizada read. 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 de fileio.txt; se simplesmente rodássemos read < 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 readbuiltin 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 $inputvariá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:

while read foo bar baz
do
  process $foo $bar $baz
done < input.txt
Brian Campbell
fonte
3
Muito agradável. Eu aprendi alguma coisa (embora temporariamente).
Potatoswatter
Obrigado pela sua contribuição Brian.
Brock Woolf
Totalmente doente! Em uma boa maneira :-)
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)))))

Ou de forma equivalente, usando a macro de segmentação ->(também conhecida como removedor de parênteses):

(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
fonte
1
WTF, nos últimos 50 anos quase ninguém disse que o Lisp / Scheme é demais!
Ionuț G. Stan
11
Aguarde, spité realmente o nome da função de gravação em arquivo?
Sam Stokes
4
Clojure definitivamente não é demais!
precisa saber é o seguinte
1
@ [Sam Stokes] Existe uma função no núcleo chamada slurp que lê um arquivo inteiro em uma string e a retorna. cuspir faz exatamente o oposto. Qual é o problema? Existem outras funções, como line-seq, que fazem coisas semelhantes de maneiras diferentes.
Rayne
4
@ kirk.burleson É mais do que 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
Lasse Espeholt
fonte
1
F #. Agradável. Obrigado pela sua contribuição.
Brock Woolf
16

BASIC

Não uso o BASIC há quase 10 anos, mas essa pergunta me deu uma razão para aprimorar rapidamente meu conhecimento. :)

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
fonte
É incrível que você ainda possa fazer isso depois de 10 anos! Bem feito e obrigado pela sua contribuição.
Brock Woolf
É claro que não fiz isso da cabeça: levei alguns minutos para procurar algumas coisas.
casablanca 21/08
Sim claro. Ainda bem feito.
Brock Woolf
Você não precisa de números de linha na versão mais clássica do BASIC ???
Yuji
@Yuji: Na "versão mais clássica", sim, mas acho que nenhuma versão desde o início dos anos 90 os exigiu.
Casablanca
16

Objetivo-C

NSFileHandle *fh = [NSFileHandle fileHandleForUpdatingAtPath:@"fileio.txt"];

[[NSFileManager defaultManager] createFileAtPath:@"fileio.txt" contents:nil attributes:nil];

[fh writeData:[@"hello" dataUsingEncoding:NSUTF8StringEncoding]];
[fh writeData:[@"\nworld" dataUsingEncoding:NSUTF8StringEncoding]];

NSArray *linesInFile = [[[NSString stringWithContentsOfFile:@"fileio.txt" 
                                             encoding:NSUTF8StringEncoding 
                                                error:nil] stringByStandardizingPath] 
                          componentsSeparatedByString:@"\n"];

NSLog(@"%@", [linesInFile objectAtIndex:1]);
Brock Woolf
fonte
17
Eu nunca gostei de Objective-C. A sintaxe parece tão estranha quando proveniente de uma linguagem como Java.
Faisal Abid
5
O segredo do Objective-C é que o Xcode faz todo o preenchimento de código para você. Você não precisa se lembrar dos nomes longos dos métodos. Certamente, porém, eles tornam seu código muito mais legível
Brock Woolf
7
E eu pensei que a sintaxe c ++ já parecia a pior.
Toad
6
O Objective-C só parece ruim porque o marcador de sintaxe Stackoverflow não fica colorido corretamente.
Brock Woolf
4
Não acredito que isso esteja tão longe na lista! Também os caras do Java comentando que o Objective-C é feio, você viu quantas linhas foram necessárias para escrever o mesmo arquivo? Eu costumava ser um entusiasta de Java, mas acho que o Objective-C entrou no meu coração.
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
fonte
15
e quanto aos manipuladores de arquivos lexicais, 3 argumentos em aberto?
MkV 21/08/10
6
Manipuladores de arquivo não lexicais nunca devem ser usados ​​no Stack Overflow. Raramente há uma necessidade deles na prática, e nunca se deve demonstrar aos iniciantes que eles existem.
Éter
4
O mesmo vale para dois argumentos em aberto: você nunca deve usá-lo no Stack Overflow, e provavelmente não na prática.
Rpkelly
2
Eu uso muito arquivos de arquivo lógicos e abertos de 3 arg. Eu praticamente considero um erro de sintaxe quando o vejo. E assim deve ser. / eu pensa em escrever um módulo para fazê-lo.
Kent Fredric
2
"Mesmo a abertura unária tem seus usos", tem seus usos, sim, mas me senti abusada no dia em que descobri como isso funciona, e vou dizer "Certamente há outra maneira" toda vez que vejo alguém que acha que precisa. perl -we 'for (q{ps aux |}){ open _; print <_>; }'
21710 Kent Kentric
15

R:

cat ("olá \ n", arquivo = "fileio.txt")
cat ("mundo \ n", arquivo = "fileio.txt", anexado = VERDADEIRO)
line2 = readLines ("fileio.txt", n = 2) [2]
gato (linha2)
David F
fonte
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
fonte
Isso é ótimo. Obrigado pela contribuição.
Brock Woolf
20
Como alternativa, você pode usar a implementação C e adicionar cifrões.
Kendall Hopkins
@ strager não faço ideia. Há pessoas que não sabem que é ideal e que é realmente melhor sem ele.
Ionuț G. Stan
6
Caso alguém esteja curioso, a razão pela qual ele deixou de lado a tag de fechamento é porque, se você incluí-la e deixar algum espaço em branco, corre o risco de receber um erro de 'cabeçalhos já enviados'.
Bill H
Referência 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
fonte
36
@Brock: Hoje em dia o Java não é lento. Apenas detalhado, mas não lento. Por favor, não faça esses comentários; nos machuca pessoas da JVM. : '|
precisa saber é o seguinte
9
Quem disse que o Java é lento é um odiador do Java ou vive sob uma rocha. Java pode ser tão rápido quanto, se não mais rápido que C, com independência de plataforma para inicializar.
NullUserException
4
@ Missing Faktor: E então?
Jerry Coffin
19
velocidade de execução é a forma mais retardada dos concursos de mijar que os programadores têm. É sempre uma questão de escolher a ferramenta certa para o trabalho, escolher uma métrica aleatória como velocidade de execução e atribuir montes de importância a ela, é bobagem, especialmente porque a velocidade de execução não é terrivelmente importante para a grande maioria das tarefas, desde que seja é rápido o suficiente (que java é para quase tudo)
Matt Briggs
11
"o cabeamento é mais rápido que o código da máquina", "o código da máquina é mais rápido que o asm", "o asm é mais rápido que o C", "o C é mais rápido que o Java", "blá blá blá" ... Você tem uma idéia de quanto Indireção já existe entre o código da máquina e a CPU? microcódigo, otimizador preditivo, caches de instruções / dados, decodificador, etc., sem mencionar o não determinismo causado pela alocação dinâmica em C / asm. Java e outras linguagens seguras são apenas mais um pequeno passo de indireção, não é grande coisa. Você pode permanecer em sua forma primitiva para sempre ou evoluir conosco.
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';
}

ou um pouco menos 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;
}
Potatoswatter
fonte
1
Ótimo! Obrigado por contribuir com +1
Brock Woolf
14
Eu esqueci o quão feia a sintaxe do c ++ pode ser.
Toad
Isso é atroz se comparado à aparência da maioria dos códigos C ++. O principal problema é a falta de constantes apropriadas definidas na biblioteca padrão, mas não a sintaxe. Me surpreende que eu precise incluir <limits>apenas para dizer que ignorenão um limite para o tamanho da linha.
Potatoswatter
8
@ Hans: Gostaria de esclarecer isso? Pessoalmente, eu acho que eu / O pertence em uma biblioteca, em vez de na língua, e todas as línguas que eu programar em fazê-lo dessa maneira (C, C ++, Java, Python, etc.)
Chinmay Kanchi
2
Agora eu sei por que Linus diz que C ++ é feio. (sem ofensas)
kizzx2 23/08
13

Ir

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
fonte
23
Esse idioma deve ser renomeado como "type"
Aiden Bell
Esse os.O_RDWR | os.O_CREATE, 0666lixo é necessário para E / S básica de arquivo no Go?
Joey Adams
1
Ou talvez ele deve ser renomeado "Stop"
xagyg
16
É incrível que, com 30 anos de evolução e design de linguagem, eles ainda tenham conseguido inventar uma nova linguagem tão difícil de escrever código de verificação de erros quanto C. Mesmo o Java é menos detalhado!
DK.
5
Uau ... Ir parece demais Falha neste exemplo #
Alessandro Stamatto
12

Erlang

Provavelmente não é o Erlang mais idiomático, mas:

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

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

(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] 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 ...

(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
fonte
1
agradecimentos agradáveis. É possível melhorar isso para que eu realmente veja um 'fantasma' abrindo o arquivo e digitando nele, como uma macro de algum tipo?
Zedoo 22/08/10
11

Arquivos de lote do Windows - versão 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 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

TheLQ
fonte
arrumado. obrigado pela sua contribuição.
Brock Woolf
Entendo a etapa 4) como a leitura do arquivo criado.
devio 21/08/10
@devio - Os requisitos devem ter mudado ou eu só descaracterizou-los ... De qualquer forma eu vou ver se tal solução existe mesmo
TheLQ
11

Scala:

Usando a biblioteca padrão:

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 a Scala-ARM Library 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 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:

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 a Scala-ARM Library 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)
faltando
fonte
Eu acho que isso ficaria melhor com flush () em vez de close () ... sem re-instanciar o FileWriter.
Radtoo 22/08/10
2
@Radtoo: Tinha que mostrar a operação de acréscimo. Foi por isso que fiz dessa maneira.
precisa saber é o seguinte
@Radtoo: Depois de olhar para outras respostas neste tópico, finalmente decidi incluir esse caminho na minha resposta. Verifique-o. (Eu não ter removido o código original embora.)
missingfaktor
@ Missing Faktor, getLines().toList()deve ser o getLines().toSeqque é preguiçoso?
Elazar Leibovich
@ Elazar: Boa sugestão. Obrigado. :)
missingfaktor
11

Groovy

new File("fileio.txt").with { 
    write  "hello\n"
    append "world\n"   
    println secondLine = readLines()[1]
}
Wayne Keenan
fonte
obrigado por contribuir.
Brock Woolf
3
Você está trapaceando na parte "mundo \ n". Não é anexado, está apenas gravando no mesmo descritor de arquivo.
OTZ
O terceiro esclarecimento na postagem original indica "Você não precisa reabrir o arquivo de texto depois de escrever a primeira linha"
Wayne Keenan