File I / O di Setiap Bahasa Pemrograman [ditutup]


127

Ini harus menjadi pertanyaan umum yang dimiliki semua programmer dari waktu ke waktu. Bagaimana cara membaca baris dari file teks? Maka pertanyaan selanjutnya adalah selalu bagaimana saya menulisnya kembali.

Tentu saja sebagian besar dari Anda menggunakan kerangka kerja tingkat tinggi dalam pemrograman sehari-hari (yang baik untuk digunakan dalam jawaban) tetapi kadang-kadang senang mengetahui bagaimana melakukannya di tingkat rendah juga.

Saya sendiri tahu cara melakukannya C, C++dan Objective-C, tapi tentu akan berguna untuk melihat bagaimana hal itu dilakukan dalam semua bahasa populer, jika hanya untuk membantu kami membuat keputusan yang lebih baik tentang bahasa apa yang digunakan untuk melakukan file io kami. Khususnya saya pikir itu akan menarik untuk melihat bagaimana yang dilakukan dalam bahasa manipulasi string, seperti: python, rubydan tentu saja perl.

Jadi saya pikir di sini kita dapat membuat sumber daya komunitas yang kita semua bisa bintangi ke profil kita dan merujuk ketika kita perlu melakukan file I / O dalam beberapa bahasa baru. Belum lagi paparan yang kita semua akan bahas dalam bahasa yang tidak kita tangani sehari-hari.

Inilah yang perlu Anda jawab:

  1. Buat file teks baru yang disebut " fileio.txt "
  2. Tulis baris pertama "halo" ke file teks.
  3. Tambahkan "dunia" baris kedua ke file teks.
  4. Baca "dunia" baris kedua menjadi string input.
  5. Cetak string input ke konsol.

Klarifikasi:

  • Anda harus menunjukkan cara melakukan ini dalam satu bahasa pemrograman per jawaban saja.
  • Asumsikan bahwa file teks tidak ada sebelumnya
  • Anda tidak perlu membuka kembali file teks setelah menulis baris pertama

Tidak ada batasan khusus pada bahasa. C, C++, C#, Java, Objective-CSemua besar.

Jika Anda tahu bagaimana melakukannya di Prolog, Haskell, Fortran, Lisp, atau Basicmaka silakan pergi kanan depan.


9
Masalahnya adalah ini tidak akan muncul dalam pencarian untuk bahasa tertentu karena tidak, juga tidak dapat, ditandai dengan setiap bahasa.
ChrisF

21
Saya tidak mengerti mengapa pertanyaan ini ditutup. Bukankah tujuan situs ini untuk membantu orang menemukan informasi? Jika seseorang tahu cara melakukan sesuatu (seperti IO) dalam C, dan ingin belajar cara melakukan hal yang sama dengan Python, ini bisa membantu mereka dengan membiarkan mereka melihat keduanya berdampingan.
Slapout

18
Saya juga tidak mengerti mengapa ini ditutup. Sepertinya itu hanya karena itu tidak termasuk kata-kata "... dalam jumlah karakter paling sedikit ..." yang sangat konyol. Golf kode adalah latihan yang menyenangkan. Tetapi apakah benar-benar berguna untuk membuat semua pertanyaan batu rosetta membingungkan, kode kecil dalam semua jawaban?
spencer nelson

12
Saya tidak mengerti bagaimana ini cocok dengan situs T&J: setidaknya dengan kode golf, ada standar yang agak objektif untuk memilih jawaban: jawaban terpendek atau paling pintar mendapat suara terbanyak. Dengan ini: ada apa, berapa banyak orang yang menyukai Haskell? Pertanyaan seperti ini seperti mencoba menyemir setiap jenis konten yang mungkin menjadi sistem yang dirancang hanya untuk satu. Apa yang salah dengan sisa internet untuk menangani ini?

11
Kenapa ini tidak bekerja dengan baik. Tidak ada informasi tentang pro dan kontra dari setiap pendekatan (bahasa apa yang hanya mendukung satu cara?). Tidak ada diskusi tentang pertukaran dan masalah mendalam dalam setiap bahasa. Lingkup terbatas yang menyiratkan bahwa kebutuhan untuk bajiliion memisahkan pertanyaan "dalam Setiap Bahasa". Dan yang terpenting, tidak ada moderasi komunitas dari kualitas setiap jawaban. Mengapa saya mengatakan tidak ada moderasi ketika orang memilih mereka? Karena seharusnya hanya ada satu jawaban untuk setiap bahasa, dan orang tidak akan membaca jawaban yang cukup untuk melihat beberapa alternatif di bidangnya.
dmckee --- ex-moderator kitten

Jawaban:


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)

Klarifikasi

  • readlines () mengembalikan daftar semua baris dalam file. Oleh karena itu, invokation dari readlines () menghasilkan pembacaan setiap baris file. Dalam kasus tertentu, boleh saja menggunakan readlines () karena kita harus tetap membaca seluruh file (kita ingin baris terakhirnya). Tetapi jika file kami mengandung banyak baris dan kami hanya ingin mencetak baris ke-nnya, tidak perlu membaca seluruh file. Berikut adalah beberapa cara yang lebih baik untuk mendapatkan baris ke-n dari file dengan Python: Apa pengganti xreadlines () dalam Python 3? .

  • Apa ini dengan pernyataan? Pernyataan with memulai blok kode di mana Anda dapat menggunakan variabel f ​​sebagai objek stream yang dikembalikan dari panggilan untuk membuka (). Ketika blok with berakhir, python memanggil f.close () secara otomatis. Ini menjamin file akan ditutup ketika Anda keluar dari blok dengan tidak peduli bagaimana atau kapan Anda keluar dari blok (bahkan jika Anda keluar melalui pengecualian tidak tertangani). Anda dapat memanggil f.close () secara eksplisit, tetapi bagaimana jika kode Anda menimbulkan pengecualian dan Anda tidak mendapatkan panggilan f.close ()? Itu sebabnya pernyataan with berguna.

  • Anda tidak perlu membuka kembali file sebelum setiap operasi. Anda dapat menulis seluruh kode di dalam satu dengan blok.

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

    Saya menggunakan tiga dengan blok untuk menekankan perbedaan antara tiga operasi: tulis (mode 'w'), append (mode 'a'), baca (mode 'r', default).


19
Saya benar-benar tidak berpikir ada orang yang pernah menulis readlines()[1]dalam kode contoh. Dalam hal ini Anda mungkin tahu file tersebut hanya memiliki dua baris, tetapi orang lain dengan anggun menganggap itu solusi yang baik mungkin mencobanya pada file jutaan baris dan mendapatkan kejutan yang agak buruk.
Porculus

14
@Porculus dengan readlines () kami tidak melewati semua baris dalam file. Ini adalah python 3. readlines () mengembalikan sebuah iterator (bukan daftar). Karenanya hanya dua baris pertama dari file yang akan dibaca. Ini mirip dengan xreadlines () di python 2 (yang tidak ada di python 3).
snakile

7
@snakile: dapatkah Anda mengutip sesuatu untuk mendukung readlines()pengembalian iterator (bukan daftar) Hanya catatan: Anda biasanya tidak dapat mengindeks iterator.
SilentGhost

8
@ SilentGhost Saya mengutip "Menyelam ke Python 3": "Metode readlines () sekarang mengembalikan iterator, jadi sama efisiennya dengan xreadlines () di Python 2". Cari pernyataan ini di: diveintopython3.org/porting-code-to-python-3-with-2to3.html . Kedua, dalam python 3 Anda dapat mengindeks iterator. Ketik rentang (10) [4] di shell (kisaran () juga mengembalikan iterator di Python 3 berlawanan dengan python 2 di mana kisaran () mengembalikan daftar). Perhatikan bahwa rentang (N) [i] dilakukan dalam O (i), bukan O (1) dan bukan O (N).
snakile

5
@snakile: Komentar Anda salah pada beberapa level. Pertama, readlines mengembalikan daftar dengan Python 3 (uji dan lihat). Jadi kode yang diberikan akan membaca seluruh file. Kedua, iterator tidak dapat diindeks dengan Python 2 atau 3. rangeObjek memiliki dukungan khusus untuk pengindeksan, yang dilakukan dalam O (1).
interjay

242

LOLCODE

Spesifikasinya samar untuk sedikitnya, tetapi saya melakukan yang terbaik yang saya bisa. Biarkan downvoting dimulai! :) Saya masih menganggapnya sebagai latihan yang menyenangkan.

HAI
CAN HAS STDIO?
PLZ OPEN FILE "FILEIO.TXT" ITZ "TehFilez"?
    AWSUM THX
        BTW #There is no standard way to output to files yet...
        VISIBLE "Hello" ON TehFilez
        BTW #There isn't a standard way to append to files either...
        MOAR VISIBLE "World" ON TehFilez
        GIMMEH LINES TehLinez OUTTA TehFilez
        I HAS A SecondLine ITZ 1 IN MAH TehLinez
        VISIBLE SecondLine
    O NOES
        VISIBLE "OH NOES!!!"
KTHXBYE

28
Saya tidak berpikir ada bahasa lain di luar sana untuk memiliki properti ini, secara harfiah, buat saya ... lol.
Ionuț G. Stan

85
Apakah menyedihkan bahwa saya pikir LOLCODE lebih mudah dibaca daripada apa pun yang pernah saya lihat?
Joel

13
Sangat menarik rasanya seperti bahasa alami.
Abhinav Sarkar

19
Mengatakan bahwa Anda berharap akan downvoted adalah jaminan untuk upvotes pada SO karena psikologi terbalik adalah tindakan refleks untuk seorang programmer.
Brock Woolf

13
PLZ? / AWSUM THX / O NOES hanya luar biasa. Bagi saya, ini agaknya maha kuasa.
Calvin1602

43

Otak *** k

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

26
Apakah Anda melewatkan '-'? ;)
Aiden Bell

2
Oh, usahanya. Sebagai catatan, berapa lama waktu yang dibutuhkan untuk menulis?
Riduidel

Dan Anda tidak dapat membaginya menjadi beberapa baris? Bahasa terbaik yang pernah ada
TheIronKnuckle

42

COBOL

Karena tidak ada orang lain yang melakukannya ......

IDENTIFICATION DIVISION.
PROGRAM-ID.  WriteDemo.
AUTHOR.  Mark Mullin.
* Hey, I don't even have a cobol compiler

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT StudentFile ASSIGN TO "STUDENTS.DAT"
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD TestFile.
01 TestData.
   02  LineNum        PIC X.
   02  LineText       PIC X(72).

PROCEDURE DIVISION.
Begin.
    OPEN OUTPUT TestFile
    DISPLAY "This language is still around."

    PERFORM GetFileDetails
    PERFORM UNTIL TestData = SPACES
       WRITE TestData 
       PERFORM GetStudentDetails
    END-PERFORM
    CLOSE TestFile
    STOP RUN.

GetFileDetails.
    DISPLAY "Enter - Line number, some text"
    DISPLAY "NXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    ACCEPT  TestData.

2
Ini harus dipilih tidak kurang dari 1 juta kali untuk kemegahan murni +1
Brock Woolf

1
+1 untuk "Bahasa ini masih ada." = D
missingfaktor

3
Hati-hati saat mencoba ini di rumah. Kompiler cobol Anda mungkin tidak menyukai garis-garis panjang variabel modern ini ...
Stephan Eggermont

Ya, ini membawa kembali beberapa ingatan berkarat. Saya tidak berpikir itu memenuhi persyaratan ...
EvilTeach

Saya sedang menulis kode di AcuCOBOL sekarang! Ngomong-ngomong, di mana bagian "I" dari "I / O?"
Buggabill

39

Haskell

main :: IO ()
main = let filePath = "fileio.txt" in
       do writeFile filePath "hello"
          appendFile filePath "\nworld"
          fileLines <- readFile filePath
          let secondLine = (lines fileLines) !! 1
          putStrLn secondLine

Jika Anda hanya ingin membaca / menulis file:

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

7
Ahh si 'Mahakuasa' Haskell. Terima kasih atas kontribusi Anda :)
Brock Woolf

3
@Andreas Rejbrand Saya hampir yakin dia lupa 'menjadi'
Federico klez Culloca

4
Ada sejumlah pendekatan lain untuk I / O dasar di Haskell yang menjadi berguna / penting di Haskell setelah Anda melakukan jenis aplikasi tertentu. Teks dan paket-paket bytestring pada cabal / hackage memungkinkan Anda menangani berbagai penyandian, dan berbagai paket gaya iteratee seperti iteratee dan enumerate mewakili "abstraksi yang paling terkenal" untuk melakukan incremental io. Juga penting adalah pengurai lib seperti parsec dan penambahan hanya menguji attoparsec lib. Haskeller telah mengambil pendekatan yang sangat teliti untuk mengeksplorasi pilihan desain io. Contoh nonviable termasuk lazy io dan kelanjutan
Carter Tazio Schonwald

4
Yuji: pada dasarnya, dengan curang. Haskell adalah bahasa fungsional murni, kecuali untuk tipe apa pun IO a, yang memiliki dukungan kompiler khusus untuk efek samping. (Kemurnian dipertahankan di tempat lain karena apa pun yang melakukan atau mengamati efek samping adalah tipe IO a, sehingga sistem tipe memastikan sisa program Anda tetap murni.)
Sam Stokes

4
Kebetulan itu IOadalah monad, tapi itu tidak mengapa diizinkan untuk melakukan efek samping. Menjadi seorang monad adalah apa yang memungkinkan Anda menulis sintaks yang tampak imperatif: itu juga memastikan (juga dengan dukungan bahasa khusus) efek samping terjadi dalam urutan yang masuk akal, sehingga Anda tidak membaca dari file sebelum Anda menulisnya, dll .
Sam Stokes

35

D

module d_io;

import std.stdio;


void main()
{
    auto f = File("fileio.txt", "w");
    f.writeln("hello");
    f.writeln("world");

    f.open("fileio.txt", "r");
    f.readln;
    auto s = f.readln;
    writeln(s);
}

10
+1, Jauh lebih indah dan mudah dibaca daripada versi C ++! Saya bermimpi suatu hari ketika D sepenuhnya menggantikan C dan C ++. :-)
missingfaktor

10
Bagus. Mungkin saya harus belajar D suatu hari nanti.
helpermethod

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

2
+1 Bagus, tapi harus tegas, Anda tidak memasukkan input ke dalam variabel sebelum menulisnya ke konsol.
Lasse Espeholt

3
@ classeespeholt, Anda benar. Aku telah memperbaikinya.
Wayne Conrad

5
Tidak ada alasan untuk huruf besar varname dan ucapkan 'PATH'. Katakan saja 'jalan'.
OTZ

2
@ Otz Ini konstan. Dia bisa menyebutnya 'Path', sebuah konstanta di Ruby hanya harus dimulai dengan huruf besar.
Sirupsen

1
@ Thomas Ahle: saat menggunakan File.opendengan blok, file dibuka, diteruskan ke blok, dan kemudian ditutup secara otomatis.
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)hanya .Net 4.0 saja, alternatifnya adalah File.ReadAllLines(path)[1]mem-parsing seluruh file menjadi sebuah array.


1
cukup pendek di C #. terima kasih telah berkontribusi
Brock Woolf

13
CATATAN: File.ReadLines khusus untuk .NET 4
kirk.burleson

5
Apa sintaks yang tampak tidak menyenangkan dari C #
Aiden Bell

3
@Aiden Bell: relatif ke bahasa yang mana?
zfedoran

2
@Aiden Bell - Jawaban ini mencoba untuk menjadi ringkas untuk dibaca. Ada banyak cara "bagus" untuk mencapai hal yang sama di C #. Lihat dotnetperls.com/file- penanganan untuk contoh yang lebih realistis.
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;
}

Jawaban bagus. Terima kasih telah berkontribusi +1
Brock Woolf

Mengapa Anda memanggil fgets () dua kali?
kirk.burleson

2
Karena baris kedua adalah yang ingin kita cetak ke stdout
JeremyP

1
#include <stdio.h> int main (void) {FILE file; char buf [128]; file = fopen ("fileio.txt", "w"); if (! file) goto error; fputs ("hello \ n", file); fflush (file); fputs ("world \ n", file); fclose (file); file = fopen ("fileio.txt", "r"); if (! file) goto error; fgets (buf, sizeof (buf), file); / lewati 'hello' / fgets (buf, sizeof (buf), file); / dapatkan 'kata' * / fclose (file); fputs (buf, stdout); return 0; error: fputs ("Tidak dapat membuka file \ n", stderr); return 1; }
FelipeC

Pengkodean yang bagus dan bersih (banyak pengecekan error yang layak) di posting C orignal (yang agak panjang).
xagyg

29

Script Shell (UNIX)

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

Sebenarnya sed -n "2p"bagian mencetak baris kedua, tetapi pertanyaannya meminta baris kedua disimpan dalam variabel dan kemudian dicetak, jadi ... :)


9
Saya tidak tahu mengapa, tapi saya suka ini :)
Federico klez Culloca

Tentu saja itu penting. Jawaban yang bagus dan terima kasih telah berkontribusi +1
Brock Woolf

Mengapa tidak mengirim standar ke / dev / null?
Gumbo

Ada versi yang sedikit lebih sederhana, dan lebih cepat, hanya menggunakan shell builtin (sebagai lawan untuk melepaskan proses terpisah untuk menjalankan sed), di sini: stackoverflow.com/questions/3538156/…
Brian Campbell

@ Gumbo, Lalu bagaimana Anda mendapatkan baris kedua? LINE=`foo`menangkap keluaran dari fooke dalam variabel LINE.
strager

27

x86 Assembler (NASM) di Linux

Saya belum menyentuh asm dalam 7 tahun, jadi saya harus menggunakan google sedikit untuk meretas ini bersama-sama, tapi tetap saja itu berfungsi;) Saya tahu itu tidak 100% benar, tapi hei: D

Oke, itu tidak berhasil. maaf soal ini. sementara itu mencetak worldpada akhirnya, itu tidak mencetaknya dari file, tetapi dari ecxyang diatur pada baris 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

Referensi yang digunakan: 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


Apakah Anda akan memperbaikinya sehingga berfungsi 100%? Jika tidak, hapus sehingga versi yang berfungsi dapat menggantikannya.
kirk.burleson

4
Apa yang lucu adalah bahwa contoh dalam C, yang seharusnya menjadi bahasa tingkat yang lebih tinggi, sekitar selama ini ... =)
Jani Hartikainen

1
@Jani: Tapi setidaknya itu agak lebih mudah dimengerti.
sbi

Kupikir itu untuk DOS pada awalnya :)
mlvljr

21

JavaScript - node.js

Pertama, banyak panggilan balik bersarang.

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

Sedikit lebih bersih:

var writeString = function (string, nextAction) {
    fs.writeFile(path, string, nextAction);
};

var appendString = function (string, nextAction) {
    return function (error, file) {
        fs.open(path, "a", 0666, function (error, file) {
            fs.write(file, string, null, "utf-8", function () {
                fs.close(file, nextAction);
            });
        });
    };
};

var readLine = function (index, nextAction) {
    return function (error) {
        fs.readFile(path, "utf-8", function (error, data) {
            var lines = data.split("\n");
            nextAction(lines[index]);
        });
    };
};

var writeToConsole = function (line) {
    sys.puts(line);
};

writeString("hello", appendString("\nworld", readLine(1, writeToConsole)));

@Ionut: Terima kasih atas banyak kontribusi Anda +1
Brock Woolf

4
@ Sayang, ini bukan JS yang ditemukan di browser. Maksud saya, secara sintaksis dan semantik, ini JS yang sama, hanya pustaka standar yang berbeda. Saya menggunakan stdlib node.jsplatform. Lihat nodejs.org
Ionuț G. Stan

5
Kode ini menyerukan kelanjutan. Aku bisa mendengar air matanya.
Matt

2
Bukankah lucu jumlah garis hampir cocok dengan solusi ASM di lantai bawah?
kizzx2

1
@ Mat ya, kelanjutan, atau monad akan membantu di sini juga.
Martijn

21

Gangguan umum

(defun main ()
  (with-open-file (s "fileio.txt" :direction :output :if-exists :supersede)
    (format s "hello"))
  (with-open-file (s "fileio.txt" :direction :io :if-exists :append)
    (format s "~%world")
    (file-position s 0)
    (loop repeat 2 for line = (read-line s nil nil) finally (print line))))

1
untuk bahasa yang disebut "lisp" harus ada lebih banyak huruf "s" yang terlibat :)
iwasrobbed

18

PowerShell

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

3
Ini bagus & bersih. Yay memberi kekuatan.
Jay Bazuzi

Saya setuju dengan logika Anda tentang penawaran. Alasan saya menghapusnya adalah karena saya menyadari bahwa skrip ini sebenarnya ada di bagian atas karena ringkas sehingga saya menginginkannya lebih kecil - tetapi kami membiarkannya menjadi jelas :). Dan penggunaan gcbukannya catmasuk akal :-) get-aliasmemberi saya catpertama (Saya tidak menggunakan PowerShell banyak).
Lasse Espeholt

4
Sial, adakah yang lebih pendek ??
0fnt

18

Script Shell

Berikut ini skrip shell menggunakan perintah builtin saja, daripada menjalankan perintah eksternal seperti sedatau tailseperti tanggapan sebelumnya.

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

Saat menulis skrip shell yang signifikan, disarankan untuk menggunakan builtin sebanyak mungkin, karena memunculkan proses terpisah bisa lambat; dari pengujian cepat pada mesin saya, sedsolusinya sekitar 20 kali lebih lambat daripada menggunakan read. Jika Anda akan menelepon sedsekali, seperti dalam kasus ini, itu tidak terlalu penting, karena akan dieksekusi lebih cepat daripada yang Anda sadari, tetapi jika Anda akan mengeksekusinya ratusan atau ribuan kali, itu bisa menjumlahkan.

Bagi mereka yang tidak terbiasa dengan sintaksis, {dan } jalankan daftar perintah di lingkungan shell saat ini (sebagai lawan dari (dan )yang membuat subkulit; kita perlu beroperasi di lingkungan shell saat ini, sehingga kita dapat menggunakan nilai variabel nanti) . Kita perlu mengelompokkan perintah-perintah bersama agar keduanya beroperasi pada aliran input yang sama, dibuat dengan mengarahkan dari fileio.txt; jika kita hanya berlari read < fileio.txt; read input < fileio.txt, kita hanya akan mendapatkan baris pertama, karena file akan ditutup dan dibuka kembali di antara dua perintah. Karena keanehan sintaksis shell ( {dan }kata-kata yang dicadangkan, yang bertentangan dengan metakarakter), kita perlu memisahkan {dan}dari sisa perintah dengan spasi, dan mengakhiri daftar perintah dengan a ;.

The readbuiltin mengambil sebagai argumen nama-nama variabel untuk membaca ke dalam. Mengkonsumsi garis input, memecah input dengan spasi putih (secara teknis, memecahnya sesuai dengan konten $IFS, yang default ke karakter spasi, di mana karakter spasi berarti membaginya pada ruang, tab, atau baris baru), memberikan setiap kata dengan nama variabel yang diberikan secara berurutan, dan menetapkan sisa baris ke variabel terakhir. Karena kita hanya memasok satu variabel, itu hanya menempatkan seluruh baris dalam variabel itu. Kami menggunakan kembali $inputvariabel, karena kami tidak peduli apa yang ada di baris pertama (jika kami menggunakan Bash, kami tidak bisa menyediakan nama variabel, tetapi untuk menjadi portabel, Anda harus selalu menyediakan setidaknya satu nama).

Perhatikan bahwa meskipun Anda dapat membaca baris satu per satu, seperti yang saya lakukan di sini, pola yang jauh lebih umum adalah membungkusnya dalam loop sementara:

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

3
Sangat bagus. Saya belajar sesuatu (walaupun sementara).
Potatoswatter

Terima kasih atas kontribusi Anda, Brian.
Brock Woolf

Benar-benar sakit! Dalam cara yang baik :-)
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)))))

Atau setara, menggunakan threading macro ->(juga dikenal sebagai penghapus paren):

(use '[clojure.java.io :only (reader)])

(let [file-name "fileio.txt"] 
  (spit file-name "hello") 
  (spit file-name "\nworld" :append true) 
  (-> file-name reader line-seq second println))

1
WTF, selama 50 tahun terakhir hampir tidak ada yang mengatakan Lisp / Skema batu!
Ionuț G. Stan

11
Tunggu, spitbenarkah nama fungsi tulis-ke-file?
Sam Stokes

4
Clojure jelas tidak mengguncang!
kirk.burleson

1
@ [Sam Stokes] Ada fungsi dalam core yang disebut slurp yang membaca seluruh file menjadi string dan mengembalikannya. ludah melakukan sebaliknya. apa masalahnya? Ada fungsi lain, seperti line-seq, yang melakukan hal serupa dengan cara yang berbeda.
Rayne

4
@ kirk.burleson Rocks lebih dari Jawa, tentu saja. :)
Rayne

17

F #

let path = "fileio.txt"
File.WriteAllText(path, "hello")
File.AppendAllText(path, "\nworld")

let secondLine = File.ReadLines path |> Seq.nth 1
printfn "%s" secondLine

1
F #. Bagus. Terima kasih atas kontribusi Anda.
Brock Woolf

16

DASAR

Saya belum pernah menggunakan BASIC selama hampir 10 tahun, tetapi pertanyaan ini memberi saya alasan untuk cepat-cepat memoles pengetahuan saya. :)

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$

Sungguh menakjubkan Anda masih bisa melakukan ini setelah 10 tahun !. Dilakukan dengan baik dan terima kasih atas kontribusi Anda.
Brock Woolf

Tentu saja saya tidak melakukannya di atas kepala saya: butuh beberapa menit untuk mencari beberapa barang.
casablanca

Ya tentu saja. Masih dilakukan dengan baik.
Brock Woolf

Apakah Anda tidak perlu nomor baris dalam versi BASIC yang paling klasik ???
Yuji

@ Yuji: Dalam "versi paling klasik", ya, tapi saya tidak berpikir versi apa pun sejak awal tahun 90an mengharuskan mereka.
casablanca

16

Objektif-C

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

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

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

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

NSLog(@"%@", [linesInFile objectAtIndex:1]);

17
Saya tidak pernah menyukai Objective-C. Sintaks sepertinya begitu asing ketika datang dari bahasa seperti Java.
Faisal Abid

5
Rahasia untuk Objective-C adalah bahwa Xcode melakukan semua penyelesaian kode untuk Anda. Anda tidak harus mengingat nama metode yang panjang. Mereka tentu membuat kode Anda jauh lebih mudah dibaca
Brock Woolf

7
Dan saya pikir sintaks c ++ sudah tampak yang terburuk.
Kodok

6
Objective-C hanya terlihat buruk karena stabilo sintaksis Stackoverflow tidak mendapatkan warna yang benar.
Brock Woolf

4
Saya tidak percaya ini begitu jauh dari daftar! Juga orang-orang Jawa berkomentar bahwa Objective-C jelek, apakah Anda melihat berapa banyak baris yang diperlukan untuk menulis file yang sama? Saya dulu penggemar Java, tapi saya pikir Objective-C telah merayap masuk ke dalam hati saya.
Kyle

16

Perl

#!/usr/bin/env perl

use 5.10.0;
use utf8;
use strict;
use autodie;
use warnings qw<  FATAL all     >;
use open     qw< :std  :utf8    >;

use English  qw< -no_match_vars >;

# and the last shall be first
END { close(STDOUT) }

my $filename = "fileio.txt";
my($handle, @lines);

$INPUT_RECORD_SEPARATOR = $OUTPUT_RECORD_SEPARATOR = "\n";

open($handle, ">",  $filename);
print $handle "hello";
close($handle);

open($handle, ">>", $filename);
print $handle "world";
close($handle);

open($handle, "<",  $filename);
chomp(@lines = <$handle>);
close($handle);

print STDOUT $lines[1];

15
bagaimana dengan filehandles leksikal, 3 argumen terbuka?
MkV

6
Menangani file non-leksikal tidak boleh digunakan pada Stack Overflow. Jarang ada kebutuhan untuk mereka dalam latihan, dan pemula seharusnya tidak pernah ditunjukkan bahwa mereka ada.
Eter

4
Hal yang sama berlaku untuk dua argumen terbuka: Anda tidak boleh menggunakannya di Stack Overflow, dan mungkin tidak dalam prakteknya.
rpkelly

2
Saya menggunakan file-file 3-arg terbuka dan leksikal sehingga saya menganggapnya sebagai kesalahan sintaksis ketika saya melihatnya. Dan memang seharusnya begitu. Saya berpikir untuk membuat modul.
Kent Fredric

2
"Bahkan open unary memiliki kegunaannya", itu memiliki kegunaannya, ya, tapi saya merasa dilecehkan pada hari saya mengetahui cara kerjanya, dan akan berkata "Tentunya ada cara lain" setiap kali saya melihat seseorang yang berpikir mereka membutuhkannya. perl -we 'for (q{ps aux |}){ open _; print <_>; }'
Kent Fredric

15

R:

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

15

PHP

<?php

$filePath = "fileio.txt";

file_put_contents($filePath, "hello");
file_put_contents($filePath, "\nworld", FILE_APPEND);

$lines = file($filePath);

echo $lines[1];

// closing PHP tags are bad practice in PHP-only files, don't use them

Itu hebat. Terima kasih atas kontribusinya.
Brock Woolf

20
Atau, Anda bisa mengambil implementasi C dan menambahkan tanda dolar.
Kendall Hopkins

@ Strager Saya tidak tahu. Ada orang yang tidak tahu itu optinal dan sebenarnya lebih baik tanpanya.
Ionuț G. Stan

6
Kalau-kalau ada yang penasaran, alasan dia meninggalkan tag penutup adalah karena jika Anda memasukkannya, dan meninggalkan spasi putih, Anda berisiko mendapatkan kesalahan 'header sudah terkirim'.
Bill H


15

Jawa

import java.io.*;
import java.util.*;

class Test {
  public static void  main(String[] args) throws IOException {
    String path = "fileio.txt";
    File file = new File(path);

    //Creates New File...
    try (FileOutputStream fout = new FileOutputStream(file)) {
      fout.write("hello\n".getBytes());
    }

    //Appends To New File...
    try (FileOutputStream fout2 = new FileOutputStream(file,true)) {
      fout2.write("world\n".getBytes());
    }

    //Reading the File...
    try (BufferedReader fin = new BufferedReader(new FileReader(file))) {
      fin.readLine();
      System.out.println(fin.readLine());
    }       
  }
}

36
@ Batu: Hari-hari ini Java tidak lambat. Hanya bertele-tele, tapi tidak lambat. Tolong jangan membuat komentar seperti itu; menyakiti kita orang JVM. : '|
missingfaktor

9
Siapa pun yang mengatakan Jawa lambat adalah pembenci Jawa buta atau hidup di bawah batu. Java dapat secepat, jika tidak lebih cepat dari C, dengan kebebasan platform untuk mem-boot.
NullUserException

4
@Missing Faktor: Jadi?
Jerry Coffin

19
kecepatan eksekusi adalah bentuk yang paling terbelakang yang dimiliki oleh para programmer kontes kencing. Itu selalu tentang memilih alat yang tepat untuk pekerjaan itu, memilih metrik acak seperti kecepatan eksekusi dan menetapkan tumpukan penting untuk itu hanya konyol, terutama karena kecepatan eksekusi tidak terlalu penting untuk sebagian besar tugas, asalkan cukup cepat (yang java untuk hampir semuanya)
Matt Briggs

11
"pengkabelan lebih cepat dari kode mesin", "kode mesin lebih cepat dari asm", "asm lebih cepat dari C", "C lebih cepat dari Java", "bla bla bla" ... Apakah Anda bahkan memiliki satu petunjuk berapa banyak tipuan sudah antara kode mesin dan CPU? mikrokode, optimizer prediktif, instruksi / cache data, decoder, dll, belum lagi ketidakpastian yang disebabkan oleh alokasi dinamis dalam C / asm. Java dan bahasa aman lainnya hanyalah satu langkah kecil tipuan, ini bukan masalah besar. Anda dapat tetap dalam bentuk primitif Anda selamanya atau berkembang bersama kami.
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';
}

atau agak kurang pedantik,

#include <string>
#include <fstream>
#include <iostream>
using namespace std;

int main() {
    fstream file( "fileio.txt", ios::in | ios::out | ios::trunc  );
    file.exceptions( ios::failbit );   

    file << "hello" << endl
         << "world" << endl;

    file.seekg( 0 ).ignore( 10000, '\n' );
    string input_string;
    getline( file, input_string );

    cout << input_string << endl;
}

1
Bagus! Terima kasih telah berkontribusi +1
Brock Woolf

14
Saya lupa bagaimana sintaks c ++ jelek.
Kodok

Ini adalah mengerikan dibandingkan dengan apa yang seperti kebanyakan C ++ kode penampilan. Masalah utama adalah kurangnya konstanta yang tepat didefinisikan dalam perpustakaan standar, meskipun, bukan sintaksis. Ini pukulan saya pergi bahwa saya perlu menyertakan <limits>hanya untuk memberitahu ignoreada tidak batas dengan ukuran garis.
Potatoswatter

8
@Hans: Apakah Anda ingin menjelaskannya? Secara pribadi, saya pikir saya / O lebih baik berada di perpustakaan daripada di bahasa, dan semua bahasa yang saya programkan melakukannya dengan cara seperti itu (C, C ++, Java, Python, dll.)
Chinmay Kanchi

2
Sekarang saya tahu mengapa Linus mengatakan C ++ jelek. (jangan tersinggung)
kizzx2

13

Pergilah

package main

import (
  "os"
  "bufio"
  "log"
)

func main() {
  file, err := os.Open("fileio.txt", os.O_RDWR | os.O_CREATE, 0666)
  if err != nil {
    log.Exit(err)
  }
  defer file.Close()

  _, err = file.Write([]byte("hello\n"))
  if err != nil {
    log.Exit(err)
  }

  _, err = file.Write([]byte("world\n"))
  if err != nil {
    log.Exit(err)
  }

  // seek to the beginning 
  _, err = file.Seek(0,0)
  if err != nil {
    log.Exit(err)
  }

  bfile := bufio.NewReader(file)
  _, err = bfile.ReadBytes('\n')
  if err != nil {
    log.Exit(err)
  }

  line, err := bfile.ReadBytes('\n')
  if err != nil {
    log.Exit(err)
  }

  os.Stdout.Write(line)
}

23
Bahasa ini harus diganti namanya "type"
Aiden Bell

Apakah os.O_RDWR | os.O_CREATE, 0666sampah itu diperlukan untuk file I / O dasar Go?
Joey Adams

1
Atau mungkin itu harus diganti namanya menjadi "Stop"
xagyg

16
Agak luar biasa karena diberikan 30 tahun evolusi dan desain bahasa, mereka masih berhasil menemukan bahasa baru yang sulit untuk menulis kode pemeriksaan kesalahan sebagai C. Bahkan Jawa kurang verbose!
DK.

5
Wow ... Go sepertinya gagal dengan contoh ini
Alessandro Stamatto

12

Erlang

Mungkin bukan Erlang yang paling idiomatis, tetapi:

#!/usr/bin/env escript

main(_Args) ->
  Filename = "fileio.txt",
  ok = file:write_file(Filename, "hello\n", [write]),
  ok = file:write_file(Filename, "world\n", [append]),
  {ok, File} = file:open(Filename, [read]),
  {ok, _FirstLine} = file:read_line(File),
  {ok, SecondLine} = file:read_line(File),
  ok = file:close(File),
  io:format(SecondLine).

12

Emacs Lisp

Terlepas dari apa yang dikatakan sebagian orang, Emacs pada dasarnya adalah editor teks [1]. Jadi, sementara Emacs Lisp dapat digunakan untuk menyelesaikan semua jenis masalah, ia dioptimalkan untuk kebutuhan editor teks. Karena editor teks (jelas) memiliki kebutuhan yang cukup spesifik dalam hal bagaimana file ditangani, ini memengaruhi fungsionalitas terkait file apa yang ditawarkan Emacs Lisp.

Pada dasarnya ini berarti bahwa Emacs Lisp tidak menawarkan fungsi untuk membuka file sebagai aliran, dan membacanya sebagian demi sebagian. Anda juga tidak dapat menambahkan file tanpa memuat seluruh file terlebih dahulu. Sebaliknya file tersebut sepenuhnya [2] dibaca menjadi buffer [3], diedit dan kemudian disimpan ke file lagi.

Untuk tugas yang harus Anda gunakan Emacs Lisp untuk ini cocok dan jika Anda ingin melakukan sesuatu yang tidak melibatkan pengeditan fungsi yang sama dapat digunakan.

Jika Anda ingin menambahkan file berulang kali ini disertai dengan overhead yang sangat besar, tetapi dimungkinkan seperti yang ditunjukkan di sini. Dalam praktiknya, Anda biasanya selesai membuat perubahan pada buffer baik secara manual atau terprogram sebelum menulis ke file (cukup gabungkan dua s-ekspresi pertama dalam contoh di bawah).

(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] Setidaknya saya tidak akan menyebutnya OS; UI alternatif ya, OS no.

[2] Anda hanya dapat memuat sebagian file, tetapi ini hanya dapat ditentukan secara byte.

[3] Buffer adalah tipe data dalam bentuk yang mirip dengan string dan juga "hal yang Anda lihat saat mengedit file". Saat mengedit buffer ditampilkan di jendela tetapi buffer tidak harus terlihat oleh pengguna.

Sunting: Jika Anda ingin melihat teks yang dimasukkan ke buffer Anda jelas harus membuatnya terlihat, dan tidur di antara tindakan. Karena Emacs biasanya hanya menampilkan ulang layar ketika menunggu input pengguna (dan tidur tidak sama dengan menunggu input), Anda juga harus memaksa menampilkan ulang. Ini diperlukan dalam contoh ini (gunakan sebagai ganti sexp kedua); dalam prakteknya saya tidak pernah menggunakan `redisplay 'sekali pun - jadi ya, ini jelek tapi ...

(with-current-buffer (generate-new-buffer "*demo*")
  (pop-to-buffer (current-buffer))
  (redisplay)
  (sleep-for 1)
  (insert-file-contents "file")
  (redisplay)
  (sleep-for 1)
  (goto-char (point-max))
  (redisplay)
  (sleep-for 1)
  (insert "world\n")
  (redisplay)
  (sleep-for 1)
  (write-file "file"))

1
Terima kasih banyak. Apakah mungkin untuk meningkatkan ini sehingga saya benar-benar melihat 'hantu' membuka file dan mengetiknya, seperti semacam makro?
zedoo

11

File Batch Windows - Versi # 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

Untuk menjelaskan loop mengerikan yang terakhir dicari, diasumsikan bahwa hanya ada halo (baris baru) dunia dalam file. Jadi itu hanya melompati baris pertama dan hanya menggema yang kedua.

Changelog

  • 2 - Opps, harus salah membaca persyaratan atau diubah pada saya. Sekarang membaca baris terakhir dari file


rapi. terima kasih atas kontribusi kamu.
Brock Woolf

Saya mengerti langkah 4) sebagai membaca dari file yang dibuat.
devio

@devio - Persyaratannya harus berubah atau saya salah baca saja ... Pokoknya saya akan melihat apakah solusi semacam itu ada
TheLQ

11

Scala:

Menggunakan perpustakaan standar:

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)

Menggunakan Perpustakaan Scala-ARM 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)      


Karena banyak orang telah menggunakan deskriptor file yang sama untuk menulis dua string, saya juga memasukkan jawaban saya.

Menggunakan perpustakaan standar:

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)

Menggunakan Perpustakaan Scala-ARM 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)

Saya pikir ini akan terlihat lebih bagus dengan flush () daripada close () ... tidak ada instantiating kembali dari FileWriter.
Radtoo

2
@Radtoo: Harus menunjukkan operasi penambahan. Itu sebabnya saya melakukannya dengan cara ini.
missingfaktor

@Radtoo: Setelah melihat jawaban lain di utas ini, saya akhirnya memutuskan untuk memasukkan itu ke dalam jawaban saya. Periksa. (Saya belum menghapus kode aslinya.)
missingfaktor

@Missing Faktor, getLines().toList()harus getLines().toSeqyang malas?
Elazar Leibovich

@ Elazar: Saran bagus. Terima kasih. :)
missingfaktor

11

Asyik

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

terima kasih telah berkontribusi.
Brock Woolf

3
Anda curang pada bagian "dunia \ n". Itu tidak menambahkan, itu hanya menulis ke deskriptor file yang sama.
OTZ

Klarifikasi ke-3 dalam posting asli menyatakan "Anda tidak perlu membuka kembali file teks setelah menulis baris pertama"
Wayne Keenan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.