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
, ruby
dan 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:
- Buat file teks baru yang disebut " fileio.txt "
- Tulis baris pertama "halo" ke file teks.
- Tambahkan "dunia" baris kedua ke file teks.
- Baca "dunia" baris kedua menjadi string input.
- 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-C
Semua besar.
Jika Anda tahu bagaimana melakukannya di Prolog
, Haskell
, Fortran
, Lisp
, atau Basic
maka silakan pergi kanan depan.
sumber
Jawaban:
Python 3
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.
Saya menggunakan tiga dengan blok untuk menekankan perbedaan antara tiga operasi: tulis (mode 'w'), append (mode 'a'), baca (mode 'r', default).
sumber
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.readlines()
pengembalian iterator (bukan daftar) Hanya catatan: Anda biasanya tidak dapat mengindeks iterator.range
Objek memiliki dukungan khusus untuk pengindeksan, yang dilakukan dalam O (1).LOLCODE
Spesifikasinya samar untuk sedikitnya, tetapi saya melakukan yang terbaik yang saya bisa. Biarkan downvoting dimulai! :) Saya masih menganggapnya sebagai latihan yang menyenangkan.
sumber
Otak *** k
sumber
COBOL
Karena tidak ada orang lain yang melakukannya ......
sumber
Haskell
Jika Anda hanya ingin membaca / menulis file:
sumber
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 tipeIO a
, sehingga sistem tipe memastikan sisa program Anda tetap murni.)IO
adalah 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 .D
sumber
Rubi
sumber
File.open
dengan blok, file dibuka, diteruskan ke blok, dan kemudian ditutup secara otomatis.C #
File.ReadLines(path).ElementAt(1)
hanya .Net 4.0 saja, alternatifnya adalahFile.ReadAllLines(path)[1]
mem-parsing seluruh file menjadi sebuah array.sumber
ANSI C
sumber
Script Shell (UNIX)
Sebenarnya
sed -n "2p"
bagian mencetak baris kedua, tetapi pertanyaannya meminta baris kedua disimpan dalam variabel dan kemudian dicetak, jadi ... :)sumber
sed
), di sini: stackoverflow.com/questions/3538156/…LINE=`foo`
menangkap keluaran darifoo
ke dalam variabelLINE
.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
world
pada akhirnya, itu tidak mencetaknya dari file, tetapi dariecx
yang diatur pada baris 27.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
sumber
JavaScript - node.js
Pertama, banyak panggilan balik bersarang.
Sedikit lebih bersih:
sumber
node.js
platform. Lihat nodejs.orgGangguan umum
sumber
PowerShell
sumber
gc
bukannyacat
masuk akal :-)get-alias
memberi sayacat
pertama (Saya tidak menggunakan PowerShell banyak).Script Shell
Berikut ini skrip shell menggunakan perintah builtin saja, daripada menjalankan perintah eksternal seperti
sed
atautail
seperti tanggapan sebelumnya.Saat menulis skrip shell yang signifikan, disarankan untuk menggunakan builtin sebanyak mungkin, karena memunculkan proses terpisah bisa lambat; dari pengujian cepat pada mesin saya,
sed
solusinya sekitar 20 kali lebih lambat daripada menggunakanread
. Jika Anda akan meneleponsed
sekali, 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 darifileio.txt
; jika kita hanya berlariread < 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
read
builtin 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$input
variabel, 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:
sumber
Clojure
Atau setara, menggunakan threading macro
->
(juga dikenal sebagai penghapus paren):sumber
spit
benarkah nama fungsi tulis-ke-file?F #
sumber
DASAR
Saya belum pernah menggunakan BASIC selama hampir 10 tahun, tetapi pertanyaan ini memberi saya alasan untuk cepat-cepat memoles pengetahuan saya. :)
sumber
Objektif-C
sumber
Perl
sumber
perl -we 'for (q{ps aux |}){ open _; print <_>; }'
R:
sumber
PHP
sumber
?>
: framework.zend.com/manual/en/…Jawa
sumber
C ++
atau agak kurang pedantik,
sumber
<limits>
hanya untuk memberitahuignore
ada tidak batas dengan ukuran garis.Pergilah
sumber
os.O_RDWR | os.O_CREATE, 0666
sampah itu diperlukan untuk file I / O dasar Go?Erlang
Mungkin bukan Erlang yang paling idiomatis, tetapi:
sumber
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).
[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 ...
sumber
File Batch Windows - Versi # 2
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
sumber
Scala:
Menggunakan perpustakaan standar:
Menggunakan Perpustakaan Scala-ARM Josh Suereth :
Karena banyak orang telah menggunakan deskriptor file yang sama untuk menulis dua string, saya juga memasukkan jawaban saya.
Menggunakan perpustakaan standar:
Menggunakan Perpustakaan Scala-ARM Josh Suereth :
sumber
getLines().toList()
harusgetLines().toSeq
yang malas?Asyik
sumber