Her Programlama Dilinde Dosya G / Ç [kapalı]


127

Bu, tüm programcıların zaman zaman sorduğu ortak bir soru olmalıdır. Bir metin dosyasından bir satırı nasıl okurum? O zaman bir sonraki soru her zaman onu nasıl geri yazacağımdır.

Elbette çoğunuz günlük programlamada yüksek seviyeli bir çerçeve kullanıyorsunuz (ki bu cevaplarda kullanmakta sorun yok) ama bazen bunu nasıl düşük seviyede yapacağınızı bilmek güzel.

Kendimi içinde nasıl yapılacağını biliyorum C, C++ve Objective-C, ama emin sadece yardım etmek bize io dosyamızı ne yapacağını dil hakkında daha iyi karar eğer, popüler tüm dillerde nasıl yapıldığını görmek için kullanışlı olacaktır. Özellikle : Ben onun gibi dize manipülasyon dillerinde yapılması görmek ilginç olacağını düşünüyorum python, rubyve tabii ki perl.

Bu yüzden, burada hepimizin profillerimize yıldız verebileceğimiz ve yeni bir dilde G / Ç dosyası yapmamız gerektiğinde başvurabileceğimiz bir topluluk kaynağı oluşturabileceğimizi düşündüm . Maruziyetten bahsetmiyorum bile, hepimiz her gün uğraşmadığımız dillere ulaşacağız.

Bu şekilde cevaplamanız gerekiyor:

  1. " Fileio.txt " adlı yeni bir metin dosyası oluşturun
  2. Metin dosyasına ilk satırı "merhaba" yazın.
  3. Metin dosyasına ikinci satır olan "dünya" yı ekleyin.
  4. İkinci satır olan "dünya" yı bir giriş dizesine okuyun.
  5. Giriş dizesini konsola yazdırın.

Açıklama:

  • Bunun nasıl yapılacağını yanıt başına yalnızca bir programlama dilinde göstermelisiniz.
  • Metin dosyasının önceden mevcut olmadığını varsayın
  • İlk satırı yazdıktan sonra metin dosyasını yeniden açmanıza gerek yoktur

Dil konusunda belirli bir sınır yok. C, C++, C#, Java, Objective-CTüm mükemmeldir.

Bunu yapmak biliyorsanız Prolog, Haskell, Fortran, Lisp, veya Basico halde durma lütfen.


9
Bununla ilgili sorun, her dilde etiketlenmediği veya etiketlenemeyeceği için belirli bir dil aramalarında görünmeyecek olmasıdır.
ChrisF

21
Bu sorunun neden kapandığını anlamıyorum. Bu sitenin amacı insanların bilgi bulmasına yardımcı olmak değil mi? Birisi C'de bir şeyi nasıl yapacağını (IO gibi) biliyorsa ve aynı şeyi Python'da nasıl yapacağını öğrenmek istiyorsa, bu onlara her ikisini de yan yana görmelerine izin vererek yardımcı olabilir.
Slapout

18
Ayrıca bunun neden kapalı olduğunu da anlamıyorum. Görünüşe göre sadece "... en az sayıda karakterle ..." kelimelerini içermediği için bu oldukça aptalca. Kod golfü eğlenceli bir egzersizdir. Ancak, tüm rosetta-stone sorularının tüm yanıtlarda karmaşık, küçük bir kod haline getirilmesi gerçekten yararlı mı?
spencer nelson

12
Bunun bir Soru-Cevap sitesine nasıl uyduğunu anlamıyorum: en azından golf koduyla, cevaplara oy vermek için biraz objektif bir standart var: en kısa veya en akıllı cevap en çok oyu alır. Bununla: nedir, Haskell'i kaç kişi sever? Bunun gibi sorular, mümkün olan her tür içeriği yalnızca bir tane için tasarlanmış bir sisteme çekmeye çalışmak gibidir. Bunu halletmek için internetin geri kalanının nesi var?

11
Bu neden işe yaramıyor? Her yaklaşımın artıları ve eksileri hakkında bilgi yok (hangi diller yalnızca bir yolu destekliyor?). Her dilde değiş tokuş ve derin konular hakkında tartışma yok. Sınırlı kapsam, "Her Dilde" soruları için ayrı bir bölme ihtiyacı olduğunu ima eder. Ve en önemlisi, her cevabın kalitesine yönelik bir topluluk denetimi yoktur. İnsanlar onlara oy verirken neden ılımlılık söylemiyorum? Çünkü her dil için sadece bir cevap olması gerekiyor ve insanlar kendi alanlarında birden fazla alternatif görmek için yeterince cevap okumuyorlar.
dmckee --- eski moderatör yavru kedi

Yanıtlar:


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)

Açıklamalar

  • readlines () , dosyadaki tüm satırların bir listesini döndürür . Bu nedenle, readlines () 'ın çağrılması, dosyanın her satırının okunmasıyla sonuçlanır. Bu özel durumda readlines () kullanmakta sorun yok çünkü yine de tüm dosyayı okumamız gerekiyor (son satırını istiyoruz). Ancak dosyamız çok sayıda satır içeriyorsa ve sadece n'inci satırını yazdırmak istiyorsak, tüm dosyayı okumak gereksizdir. Python'da bir dosyanın n'inci satırını almanın daha iyi yolları şunlardır: Python 3'te xreadlines () yerine ne koyar? .

  • Bu ifade ile nedir? With ifadesi, f değişkenini open () çağrısından döndürülen bir akış nesnesi olarak kullanabileceğiniz bir kod bloğu başlatır . With bloğu bittiğinde, python otomatik olarak f.close () öğesini çağırır. Bu, bloktan nasıl veya ne zaman çıkarsanız çıkın (işlenmemiş bir istisna yoluyla çıksanız bile) bloğa sahip çıktığınızda dosyanın kapatılacağını garanti eder. F.close () öğesini açıkça çağırabilirsiniz, ancak ya kodunuz bir istisna yaratırsa ve f.close () çağrısına ulaşamazsanız ne olur? Bu yüzden with ifadesi kullanışlıdır.

  • Her işlemden önce dosyayı yeniden açmanıza gerek yoktur. Tüm kodu bir blok ile yazabilirsiniz.

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

    Üç işlem arasındaki farkı vurgulamak için bloklu üç kullandım: yazma (mod 'w'), ekleme ('a' modu), okuma ('r' modu, varsayılan).


19
Gerçekten hiç kimsenin readlines()[1]örnek kod yazması gerektiğini düşünmüyorum . Bu durumda, dosyanın yalnızca iki satırı olduğunu biliyor olabilirsiniz, ancak başka biri bunun iyi bir çözüm olduğunu düşünerek, milyon satırlık bir dosya üzerinde deneyebilir ve oldukça kötü bir sürprizle karşılaşabilir.
Porculus

14
@Porculus readlines () ile dosyadaki tüm satırların üzerinden geçmeyiz. Bu python 3'tür. Readlines () bir yineleyici (liste değil) döndürür. Bu nedenle dosyanın sadece ilk iki satırı okunacaktır. Bu, python 2'deki (python 3'te bulunmayan) xreadlines () 'a benzer.
snakile

7
@snakile: lütfen readlines()bir yineleyici döndürmeyi destekleyen bir şeyden alıntı yapabilir misiniz (liste değil) Sadece bir not: genellikle bir yineleyiciyi dizine ekleyemezsiniz.
SilentGhost

8
@SilentGhost "Dive into Python 3" ten alıntı yapıyorum: "readlines () yöntemi artık bir yineleyici döndürüyor, bu nedenle xreadlines () Python 2'de olduğu kadar verimli". Bu ifadeyi şu konumda arayın: diveintopython3.org/porting-code-to-python-3-with-2to3.html . İkinci olarak, python 3'te bir yineleyiciyi indeksleyebilirsiniz. Kabuktaki (range ()) range (10) [4] yazın, python 2'nin aksine Python 3'te bir yineleyici döndürür, burada range () bir liste döndürür). (N) [i] aralığının O (1) 'de değil O (N)' de yapıldığına dikkat edin.
snakile

5
@snakile: Yorumlarınız birkaç düzeyde yanlış. İlk olarak, okuma satırları Python 3'te bir liste döndürür (test edin ve görün). Böylece verilen kod tüm dosyayı okuyacaktır. İkinci olarak, yineleyiciler Python 2 veya 3'te rangeindekslenemez . Nesne, O (1) 'de yapılan indeksleme için özel desteğe sahiptir.
interjay

242

LOLCODE

Özellikler en azını söylemek için yarım yamalak ama elimden gelenin en iyisini yaptım. Olumsuz oylama başlasın! :) Hala eğlenceli bir egzersiz buluyorum.

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
Bu özelliğe sahip olacak başka bir dil olduğunu sanmıyorum, kelimenin tam anlamıyla beni ... lol yapmak.
Ionuț G. Stan

85
LOLCODE'un gördüğüm her şeyden daha okunabilir olduğunu düşünmem üzücü mü?
Joel

13
Doğal bir dil gibi hissettirdiği ilgi çekici.
Abhinav Sarkar

19
Eksik oy verilmesini beklediğinizi söylemek, SO'ya verilen olumlu oyların garantisidir, çünkü ters psikoloji bir programcı için bir refleks eylemidir.
Brock Woolf

13
PLZ? / AWSUM THX / O NOES gerçekten harika. Bu bana çok kuvvetli geliyor.
Calvin1602

43

Beyin *** k

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

26
Bir '-' özlediniz mi? ;)
Aiden Bell

2
Oh çaba. Sadece kayıt için, yazmak ne kadar sürdü?
Riduidel

Ve bunu birden fazla satıra bölemez misin? Şimdiye kadarki en iyi dil
TheIronKnuckle

42

COBOL

Kimse yapmadığı için ......

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
Bu, saf muhteşemlik için en az 1 milyon kez oylanmalıdır +1
Brock Woolf

1
"Bu dil hala ortalıkta" için +1. = D
missingfaktor

3
Bunu evde denerken dikkatli olun. Cobol derleyiciniz bu modern değişken uzunluklu çizgileri
beğenmeyebilir

Ya, bu bazı eski hatıraları geri getiriyor. Gerçi gereksinimleri karşıladığını sanmıyorum ...
EvilTeach

Şu anda AcuCOBOL'da kod yazıyorum! Bu arada, "I / O" nun "I" parçası nerede?
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

Sadece bir dosya okumak / yazmak istiyorsanız:

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

7
Ahh "Her Şeye Gücü Yeten" Haskell. Katkınız için teşekkürler :)
Brock Woolf

3
@Andreas Rejbrand Bir 'olmayı' unuttuğundan neredeyse eminim
Federico klez Culloca

4
Haskell'de temel G / Ç'ye, belirli türden uygulamaları yaptıktan sonra Haskell'de yararlı / önemli hale gelen bir dizi başka yaklaşım vardır. Cabal / hackage üzerindeki metin ve bytestring paketleri, çeşitli kodlamalarla uğraşmanıza izin verir ve iteratee ve enumerate gibi çeşitli yineleme stili paketleri artımlı io yapmak için "en iyi bilinen soyutlamayı" temsil eder. Ayrıca parsec gibi kitapların ayrıştırılması ve artımlı testlerin yalnızca attoparsec lib'de yapılması da önemlidir. Haskellers, io tasarım seçeneklerini keşfetmek için çok kapsamlı bir yaklaşım benimsemiştir. Canlı olmayan örnekler arasında tembel io ve devamlar yer alıyor
Carter Tazio Schonwald

4
Yuji: temelde hile yaparak. Haskell, yan etkiler için özel derleyici desteğine sahip olan her türden hariç , tamamen işlevsel bir dildir IO a. (Saflık başka bir yerde korunur çünkü bir yan etkiyi gerçekleştiren veya gözlemleyen herhangi bir şey tipidir IO a, bu nedenle tür sistemi programınızın geri kalanının saf kalmasını sağlar.)
Sam Stokes

4
Öyle oluyor ki IObu bir monad, ama bu yüzden yan etkilere izin verilmiyor. Bir monad olmak, o emir gibi görünen sözdizimini yazmanıza izin veren şeydir: ayrıca (özel dil desteği ile) yan etkilerin mantıklı bir sırayla gerçekleşmesini sağlar, böylece dosyaya yazmadan önce dosyadan okumazsınız, vb. .
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, C ++ sürümünden çok daha güzel ve okunabilir! D'nin tamamen C ve C ++ 'nın yerini aldığı bir günü hayal ediyorum. :-)
missingfaktor

10
Güzel. Belki bir gün D öğrenmeliyim.
helpermethod

34

yakut

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 Güzel, ama kesin olmak gerekirse, girişi konsola yazmadan önce bir değişkene koymazsınız.
Lasse Espeholt

3
@lasseespeholt, haklısın. Onardım.
Wayne Conrad

5
Değişken adını büyük harfle yazıp 'PATH' demek için bir neden yok. Sadece 'yol' deyin.
OTZ

2
@otz Bu bir sabittir. Buna 'Yol' diyebilirdi, Ruby'de bir sabit sadece büyük harfle başlamalıdır.
Sirupsen

1
@Thomas Ahle: File.openBir blok ile kullanıldığında , dosya açılır, bloğa aktarılır ve ardından otomatik olarak kapatılır.
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)Yalnızca .Net 4.0 ise, bunun alternatifi File.ReadAllLines(path)[1]tüm dosyayı bir diziye ayrıştırmaktır.


1
C # olarak oldukça kısadır. Katkılarınız için teşekkürler
Brock Woolf

13
NOT: File.ReadLines, .NET 4'e
özeldir

5
C # 'da ne kadar tatsız görünen bir sözdizimi var
Aiden Bell

3
@Aiden Bell: hangi dile göre?
zfedoran

2
@Aiden Bell - Bu cevap okunabilir olmaktan çok kısa ve öz olmaya çalışıyor. C # 'da aynı şeyi başarmanın pek çok "güzel" yolu vardır. Daha gerçekçi örnekler için dotnetperls.com/file-handling adresine bakın .
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;
}

Güzel cevap. +1
Brock Woolf'a

Neden fgets () 'ı iki kez çağırıyorsunuz?
kirk.burleson

2
Çünkü ikinci satır,
standart çıktıya

1
#include <stdio.h> int main (void) {FILE dosyası; char buf [128]; file = fopen ("fileio.txt", "w"); eğer (! dosya) hatası goto; fputs ("merhaba \ n", dosya); fflush (dosya); fputs ("dünya \ n", dosya); fclose (dosya); file = fopen ("fileio.txt", "r"); eğer (! dosya) hatası goto; fgets (buf, sizeof (buf), dosya); / 'merhaba' / fgets (buf, sizeof (buf), dosya) atla ; / 'kelime' olsun * / fclose (dosya); fputs (buf, stdout); dönüş 0; hata: fputs ("Dosya açılamadı \ n", stderr); dönüş 1; }
FelipeC

Orijinal C yazısında güzel temiz kodlama (çok sayıda düzgün hata kontrolü) (uzunluğu bir şekilde dışarı atar).
xagyg

29

Kabuk Komut Dosyası (UNIX)

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

Aslında sed -n "2p"parça ikinci satırı yazdırıyor, ancak soru ikinci satırın bir değişkende saklanmasını ve ardından yazdırılmasını istiyor, yani ... :)


9
Neden bilmiyorum ama bunu seviyorum :)
Federico klez Culloca

Tabii ki önemli. Güzel yanıt ve katkıda bulunduğunuz için teşekkürler +1
Brock Woolf

Standardı neden / dev / null'a göndermiyorsunuz?
Gumbo

Biraz daha basit ve daha hızlı, versiyon, (çağırmak için ayrı bir sürecin iptal çatallama aksine sadece kabuk yerleşikleri ile var sed:) burada stackoverflow.com/questions/3538156/...
Brian Campbell

@Gumbo, o zaman ikinci satırı nasıl alırsın? değişkeninin LINE=`foo`çıktısını yakalar . fooLINE
strager

27

Linux'ta x86 Assembler (NASM)

7 yıldır asm'e dokunmadım, bu yüzden bunu birlikte kesmek için google'ı biraz kullanmak zorunda kaldım, ama yine de çalışıyor;)% 100 doğru olmadığını biliyorum, ama hey: D

Tamam, çalışmıyor. bunun için üzgünüm. o yazdırmak yapar iken worldsonunda, bu dosyadan yazdırmak değil, ama gelen ecxhangi hat 27 üzerinde ayarlanır.

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

Kullanılan referanslar: 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


% 100 çalışması için düzeltecek misiniz? Değilse, çalışan bir sürümün yerini alabilmesi için onu silin.
kirk.burleson

4
Komik olan, daha yüksek seviyeli bir dil olması gereken C'deki örneğin bu kadar uzun olması ... =)
Jani Hartikainen

1
@Jani: Ama en azından anlaşılması biraz daha kolay.
sbi

İlk başta DOS için olduğunu düşündüm :)
mlvljr

21

JavaScript - node.js

İlk olarak, çok sayıda iç içe geçmiş geri arama.

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

Biraz daha temiz:

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: Katkılarınız için teşekkürler +1
Brock Woolf

4
@Dave, tarayıcılarda bulunan JS değil. Demek istediğim, sözdizimsel ve anlamsal olarak, aynı JS, sadece standart kitaplık farklı. node.jsPlatformun stdlib'ini kullandım . Bkz nodejs.org
Ionuț G. Stan

5
Bu kod, devamlar için haykırıyor. Gözyaşlarını duyabiliyorum.
Matt

2
Satır sayısının aşağıdaki ASM çözümüyle hemen hemen aynı olması komik değil mi?
kizzx2

1
@Matt evet, devamlar veya monadlar burada da yardımcı olur.
Martijn

21

Ortak Lisp

(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
"lisp" adlı bir dil için çok daha fazla "s" harfi
bulunmalıdır

18

Güç kalkanı

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

3
Bu güzel ve temiz. Yay powershell.
Jay Bazuzi

Alıntı yapma mantığınıza katılıyorum. Bunları kaldırmamın nedeni, bu betiğin kompakt olduğu için aslında zirvede olduğunun farkına varmamdı, bu yüzden benim için daha küçük olmasını istedim - ama net olmasına izin verdik :). Ve gcyerine kullanımı catmantıklı :-) ilk önce get-aliasbana verdi cat(PowerShell'i fazla kullanmıyorum).
Lasse Espeholt

4
Kahretsin, daha kısa bir şey var mı?
0fnt

18

Kabuk Komut Dosyası

İşte önceki yanıtların yaptığı gibi sedveya harici komutları çağırmak yerine, yalnızca yerleşik komutları kullanan bir kabuk betiği tail.

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

Önemli kabuk komut dosyalarını yazarken, yerleşikleri olabildiğince çok kullanmanız önerilir, çünkü ayrı bir işlemin oluşturulması yavaş olabilir; makinemdeki hızlı bir testten, sedçözüm kullanmaktan yaklaşık 20 kat daha yavaş read. sedBu durumda olduğu gibi bir kez arayacaksanız , fark edebileceğinizden daha hızlı çalışacağından pek bir önemi yoktur, ancak bunu yüzlerce veya binlerce kez gerçekleştirecekseniz, ekleyin.

Sözdizimi aşina olanlar için {ve } mevcut kabuk ortamında komutların bir listesini çalıştırma (karşıt olarak (ve )burada bir altkabuk oluşturmak; daha sonra değişkenin değeri kullanabilir bu yüzden, mevcut kabuk ortamında çalışan gereken) . Yönlendirme ile oluşturulan aynı girdi akışı üzerinde her ikisinin de çalışmasını sağlamak için komutları birlikte gruplamamız gerekir fileio.txt; basitçe koşarsak read < fileio.txt; read input < fileio.txt, dosya iki komut arasında kapanıp yeniden açılacağı için ilk satırı alırdık. Kabuk sözdiziminin kendine özgü olması nedeniyle ( {ve }metakarakterlerin aksine ayrılmış kelimelerdir), {ve}boşluklu komutların geri kalanından ve komutların listesini bir ;.

readYerleşik değişkenlerin isimleri içine okumak için bir argüman olarak alır. Bir girdi satırı tüketir, girdiyi boşlukla böler (teknik olarak, içeriğine göre keser $IFS, varsayılan olarak bir boşluk karakteridir, burada boşluk karakteri herhangi bir boşluk, sekme veya yeni satıra bölmek anlamına gelir), atar her bir kelime sırayla verilen değişken isimlerine ve satırın kalanını son değişkene atar. Sadece bir değişken sağladığımız için, sadece tüm satırı o değişkene koyar. $inputİlk satırda ne olduğunu umursamadığımız için değişkeni yeniden kullanıyoruz (Bash kullanıyorsak, bir değişken adı sağlayamayız, ancak taşınabilir olmak için her zaman en az bir ad sağlamalısınız).

Burada yaptığım gibi, satırları birer birer okuyabilseniz de, onu bir while döngüsüne sarmak çok daha yaygın bir model olacaktır:

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

3
Çok hoş. Bir şey öğrendim (geçici de olsa).
Potatoswatter

Katkınız için teşekkürler Brian.
Brock Woolf

Tamamen hasta! İyi bir şekilde :-)
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)))))

Veya eşdeğeri olarak, iş parçacığı makrosunu kullanarak ->(aynı zamanda paren kaldırıcı olarak da bilinir):

(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, son 50 yıldır neredeyse hiç kimse Lisp / Scheme'nin harika olduğunu söylemedi!
Ionuț G. Stan

11
Bekle, spitgerçekten dosyaya yazma işlevinin adı mı?
Sam Stokes

4
Clojure kesinlikle sallanmıyor!
kirk.burleson

1
@ [Sam Stokes] Çekirdekte slurp adında bir dosyanın tamamını bir dizeye okuyan ve onu döndüren bir işlev vardır. tükürmek tam tersini yapar. Sorun ne? Line-seq gibi benzer şeyleri farklı şekillerde yapan başka işlevler de vardır.
Rayne

4
@ kirk.burleson Kesinlikle Java'dan daha fazla Rocks. :)
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 #. Güzel. Katkınız için teşekkürler.
Brock Woolf

16

TEMEL

BASIC'i neredeyse 10 yıldır kullanmadım, ancak bu soru bana bilgimi hızla tazelemem için bir neden verdi. :)

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$

Bunu 10 yıl sonra hala yapabilmen inanılmaz !. Aferin ve katkınız için teşekkürler.
Brock Woolf

Elbette bunu kafamın tepesinden yapmadım: bazı şeylere bakmak birkaç dakika sürdü.
casablanca

Evet tabiki. Hala iyi iş çıkardın.
Brock Woolf

BASIC'in en klasik sürümünde satır numaralarına ihtiyacınız yok mu ???
Yuji

@Yuji: "En klasik versiyonda" evet, ama 90'ların başından beri herhangi bir versiyonun onları gerektirdiğini düşünmüyorum.
casablanca

16

Objective-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
Objective-C'yi hiç sevmedim. Sözdizimi, Java gibi bir dilden geldiğinde çok yabancı görünüyor.
Faysal Abid

5
Objective-C'nin sırrı, Xcode'un tüm kod tamamlamayı sizin için yapmasıdır. Uzun yöntem isimlerini hatırlamak zorunda değilsiniz. Kodunuzu kesinlikle daha okunaklı hale getiriyorlar
Brock Woolf

7
Ve c ++ sözdiziminin zaten en kötü göründüğünü düşündüm.
Toad

6
Objective-C yalnızca Stackoverflow sözdizimi vurgulayıcı doğru renklendirilmediği için kötü görünüyor.
Brock Woolf

4
Bunun listenin bu kadar aşağısında olduğuna inanamıyorum! Ayrıca Java görevlileri Objective-C'nin çirkin olduğunu söylüyor, aynı dosyayı yazmak için kaç satır gerektiğini gördünüz mü? Ben bir Java meraklısıydım, ama sanırım Objective-C kalbime sızdı.
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
sözcüksel dosya tanıtıcıları, 3 bağımsız değişken açık mı?
MkV

6
Sözcüksel olmayan dosya tanıtıcıları hiçbir zaman Stack Overflow'da kullanılmamalıdır. Uygulamada nadiren bunlara ihtiyaç vardır ve yeni başlayanlara onların var oldukları bile gösterilmemelidir.
Ether

4
Aynı şey açık iki argüman için de geçerli: Bunu asla Stack Overflow'da ve muhtemelen pratikte kullanmamalısınız.
rpkelly

2
3-argümanlı açık ve sözcüksel dosya tanıtıcılarını o kadar çok kullanıyorum ki, gördüğümde pratikte bir sözdizimi hatası olarak görüyorum. Ve öyle olmalı. / me, bunu yapmak için bir modül yazmayı düşünüyor.
Kent Fredric

2
"Tekli açık bile kendi kullanımlarına sahip", kullanımları var, evet, ama bunun nasıl çalıştığını çalıştığım gün istismar edildiğini hissettim ve buna ihtiyacı olduğunu düşünen birini her gördüğümde "Elbette başka bir yol var" diyeceğim. perl -we 'for (q{ps aux |}){ open _; print <_>; }'
Kent Fredric

15

R:

kedi ("merhaba \ n", file = "fileio.txt")
kedi ("dünya \ n", dosya = "fileio.txt", ekleme = DOĞRU)
line2 = readLines ("fileio.txt", n = 2) [2]
Kedi (satır2)

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

Bu harika. Katkı için teşekkürler.
Brock Woolf

20
Alternatif olarak, C uygulamasını alabilir ve dolar işaretleri ekleyebilirsiniz.
Kendall Hopkins

@strager Hiçbir fikrim yok. İsteğe bağlı olduğunu ve onsuz daha iyi olduğunu bilmeyen insanlar var.
Ionuț G. Stan

6
Herhangi birinin merak etmesi durumunda, kapanış etiketini bırakmasının nedeni, onu eklerseniz ve sonunda beyaz boşluk bırakırsanız, 'başlıklar zaten gönderilmiş' hatası alma riskiyle karşı karşıya kalırsınız.
Bill H


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

36
@Brock: Bugünlerde Java yavaş değil. Sadece ayrıntılı, ama yavaş değil. Lütfen bu tür yorumlarda bulunmayın; JVM çalışanlarına zarar veriyor. : '|
missingfaktor

9
Java'nın yavaş olduğunu söyleyen kişi ya Java'dan nefret ediyor ya da bir kayanın altında yaşıyor. Java, önyükleme yapmak için platform bağımsızlığı ile C'den daha hızlı olmasa bile hızlı olabilir.
NullUserException

4
@Missing Faktor: Öyle mi?
Jerry Tabut

19
yürütme hızı, programcıların sahip olduğu öfke yarışmalarının en gecikmeli şeklidir. Her zaman iş için doğru aracı seçmek, yürütme hızı gibi rastgele bir ölçü seçmek ve ona önemli yığınlar atamak çok saçmadır, özellikle yürütme hızı görevlerin büyük çoğunluğu için korkunç derecede önemli olmadığı sürece. yeterince hızlı (java neredeyse her şey için)
Matt Briggs

11
"donanım bağlantısı makine kodundan daha hızlıdır", "makine kodu asm'den daha hızlıdır", "asm C'den daha hızlıdır", "C Java'dan daha hızlıdır", "blah blah blah" ... Ne kadar olduğuna dair bir ipucunuz var mı? indireksiyon zaten makine kodu ile CPU arasında mı? mikro kod, öngörücü iyileştirici, talimat / veri önbellekleri, kod çözücü, vb. C / asm'deki dinamik tahsisin neden olduğu belirsizlikten bahsetmeye gerek yok. Java ve diğer güvenli diller, doğrudan doğruya yönlendirmenin sadece bir küçük adımıdır, önemli değildir. Ya sonsuza kadar ilkel formunuzda kalabilir ya da bizimle gelişebilirsiniz.
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';
}

ya da biraz daha az bilgiççe,

#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
Harika! +1
Brock Woolf'a

14
C ++ 'ın sözdiziminin ne kadar çirkin olabileceğini unuttum.
Toad

Bu , çoğu C ++ kodunun neye benzediğine kıyasla korkunç. Temel sorun, sözdizimi değil, standart kitaplıkta tanımlanan uygun sabitlerin olmamasıdır. Ben dahil etmek gerektiğini beni darbeler uzak <limits>sadece anlatmak için ignoreorada değil çizgi boyutu için bir sınır.
Potatoswatter

8
@Hans: Bunu açıklığa kavuşturmak ister misiniz? Kişisel olarak, G /
Ç'nin

2
Linus'un neden C ++ 'nın çirkin olduğunu söylediğini şimdi anlıyorum. (suç değil)
kizzx2

13

Git

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
Bu dil "tür" olarak yeniden adlandırılmalıdır
Aiden Bell

Bu os.O_RDWR | os.O_CREATE, 0666önemsiz, Go'da temel dosya G / Ç için gerekli mi?
Joey Adams

1
Veya belki de "Dur" olarak yeniden adlandırılmalıdır
xagyg

16
30 yıllık evrim ve dil tasarımı göz önüne alındığında, C kadar hata kontrol kodu yazmak kadar zor olan yeni bir dil icat etmiş olmaları oldukça şaşırtıcıdır. Java bile daha az ayrıntılı!
DK.

5
Vay be ... Go çok başarısız görünüyor Bu örnekte başarısız
Alessandro Stamatto

12

Erlang

Muhtemelen en deyimsel Erlang değil, ama:

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

Bazılarının Emacs'ın esas olarak bir metin editörü olduğunu söylediklerine rağmen [1]. Dolayısıyla Emacs Lisp her türlü sorunu çözmek için kullanılabilirken, bir metin düzenleyicinin ihtiyaçlarına göre optimize edilmiştir. Metin editörlerinin (tabii ki) dosyaların nasıl işlendiğine gelince oldukça özel ihtiyaçları olduğundan, bu Emacs Lisp'in dosya ile ilgili hangi işlevselliği sunduğunu etkiler.

Temel olarak bu, Emacs Lisp'in bir dosyayı akış olarak açma ve onu parça parça okuma işlevleri sunmadığı anlamına gelir. Aynı şekilde, önce tüm dosyayı yüklemeden bir dosyaya ekleyemezsiniz. Bunun yerine dosya tamamen [2] bir arabelleğe [3] okunur, düzenlenir ve sonra tekrar bir dosyaya kaydedilir.

Zorunlu görevler için Emacs Lisp kullanmalısınız, bunun için uygundur ve eğer aynı işlevleri düzenlemeyi içermeyen bir şey yapmak istiyorsanız kullanılabilir.

Bir dosyaya tekrar tekrar eklemek isterseniz, bu çok büyük bir ek yük getirir, ancak burada gösterildiği gibi mümkündür. Pratikte normalde bir dosyaya yazmadan önce manuel veya programlı olarak bir arabellekte değişiklik yapmayı bitirirsiniz (sadece aşağıdaki örnekte ilk iki s-ifadesini birleştirin).

(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] En azından işletim sistemi olarak adlandıracak kadar ileri gitmem; alternatif bir UI evet, bir işletim sistemi hayır.

[2] Bir dosyanın yalnızca bölümlerini yükleyebilirsiniz, ancak bu yalnızca bayt bazında belirtilebilir.

[3] Arabellek, hem bir dizeye benzer bir veri türü hem de "bir dosyayı düzenlerken gördüğünüz şey" dir. Bir arabelleği düzenlerken bir pencerede görüntülenir, ancak arabelleklerin kullanıcı tarafından görülmesi gerekmez.

Düzenle: Eğer arabelleğe eklenen metni görmek istiyorsanız, açıkça görünür hale getirmeniz ve eylemler arasında uyumanız gerekir. Emacs normalde yalnızca kullanıcı girdisini beklerken ekranı yeniden görüntülediğinden (ve uyumak, girdi beklemekle aynı şey değildir), ayrıca yeniden görüntülemeye zorlamanız gerekir. Bu, bu örnekte gereklidir (ikinci sexp yerine kullanın); pratikte bir kez bile `` yeniden gösterimi '' kullanmak zorunda kalmadım - bu yüzden evet, bu çirkin ama ...

(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
güzel, teşekkürler. Bunu geliştirmek mümkün mü, böylece dosyayı açıp ona yazı yazan bir 'hayalet' görüyorum, tıpkı bir makro gibi?
zedoo

11

Windows Toplu İş Dosyaları - Sürüm # 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

Bu son korkunç arayış döngüsünü açıklamak için, dosyada yalnızca merhaba (yeni satır) dünyası olduğunu varsayar. Böylece sadece ilk satırı atlar ve yalnızca ikinciyi yansıtır.

Değişiklikler

  • 2 - Opps, gereksinimleri yanlış okumalı veya benden değişmiş olmalı. Şimdi dosyadan son satırı okuyor


düzgün. Katkınız için teşekkürler.
Brock Woolf

4. adımı oluşturulan dosyadan okurken anlıyorum .
devio

@devio - Gereksinimler değişmiş olmalı yoksa yanlış okudum ... Her neyse, böyle bir çözüm var mı
göreceğim

11

Scala:

Standart kitaplığı kullanma:

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)

Josh Suereth'in Scala-ARM Kitaplığını Kullanma :

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)      


Birçok kişi iki dizeyi yazmak için aynı dosya tanımlayıcısını kullandığından, cevabıma bu yolu da dahil ediyorum.

Standart kitaplığı kullanma:

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)

Josh Suereth'in Scala-ARM Kitaplığını Kullanma :

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)

Bunun close () yerine flush () ile daha güzel görüneceğini düşünüyorum ... FileWriter'ın yeniden somutlaştırılması yok.
Radtoo

2
@Radtoo: Ekleme işlemini göstermem gerekiyordu. Bu yüzden bu şekilde yaptım.
missingfaktor

@Radtoo: Bu konudaki diğer cevaplara baktıktan sonra, sonunda cevabıma bu şekilde dahil etmeye karar verdim. Kontrol et. (Yine de orijinal kodu kaldırmadım.)
missingfaktor

@Missing Faktor, tembel olan hangisi getLines().toList()olmalı getLines().toSeq?
Elazar Leibovich

@Elazar: Güzel bir öneri. Teşekkürler. :)
missingfaktor

11

harika

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

Katkıda bulunduğunuz için teşekkürler.
Brock Woolf

3
"Dünya \ n" kısmında aldatıyorsun. Eklenmiyor, sadece aynı dosya tanımlayıcısına yazıyor.
OTZ

Orijinal gönderideki 3. açıklama, "İlk satırı yazdıktan sonra metin dosyasını yeniden açmanıza gerek yoktur" şeklindedir
Wayne Keenan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.