ไฟล์ I / O ในทุกภาษาโปรแกรม [ปิด]


127

นี่เป็นคำถามทั่วไปที่โปรแกรมเมอร์ทุกคนมีเป็นครั้งคราว ฉันจะอ่านบรรทัดจากไฟล์ข้อความได้อย่างไร คำถามต่อไปคือฉันจะเขียนมันกลับมาได้อย่างไร

แน่นอนว่าส่วนใหญ่คุณใช้กรอบการทำงานระดับสูงในการเขียนโปรแกรมแบบวันต่อวัน (ซึ่งใช้ได้ดีกับคำตอบ) แต่บางครั้งก็เป็นเรื่องดีที่รู้วิธีการทำในระดับต่ำเช่นกัน

ตัวผมเองรู้วิธีที่จะทำมันในC, C++และObjective-Cแต่แน่ใจว่าจะเป็นประโยชน์เพื่อดูว่าวิธีการก็ทำในทุกภาษาที่นิยมถ้าเพียง แต่จะช่วยให้เราตัดสินใจที่ดีขึ้นเกี่ยวกับสิ่งที่ภาษาที่จะทำไฟล์ของเรา io ใน. โดยเฉพาะอย่างยิ่ง ฉันคิดว่ามันจะน่าสนใจเพื่อดูว่ามันทำในภาษาสตริงการจัดการเช่น: python, และแน่นอนrubyperl

ดังนั้นฉันคิดว่าที่นี่เราสามารถสร้างแหล่งชุมชนที่เราสามารถติดดาวไปยังโปรไฟล์ของเราและดูว่าเมื่อใดที่เราต้องทำไฟล์ I / Oในภาษาใหม่บางภาษา ไม่พูดถึงการเปิดรับเราทุกคนจะได้รับภาษาที่เราไม่ได้จัดการในแต่ละวัน

นี่คือวิธีที่คุณต้องตอบ:

  1. สร้างไฟล์ข้อความใหม่ชื่อ " fileio.txt "
  2. เขียนบรรทัดแรก "hello" ลงในไฟล์ข้อความ
  3. ผนวกบรรทัดที่สอง "โลก" ลงในไฟล์ข้อความ
  4. อ่านบรรทัดที่สอง "โลก" ลงในสายป้อน
  5. พิมพ์สตริงอินพุตไปที่คอนโซล

ชี้แจง:

  • คุณควรแสดงวิธีการทำเช่นนี้ในภาษาการเขียนโปรแกรมเดียวต่อหนึ่งคำตอบเท่านั้น
  • สมมติว่าไฟล์ข้อความไม่มีอยู่ก่อน
  • คุณไม่จำเป็นต้องเปิดไฟล์ข้อความอีกครั้งหลังจากเขียนบรรทัดแรก

ไม่ จำกัด เฉพาะภาษา C, C++, C#, Java, Objective-Cที่ดีทั้งหมด

ถ้าคุณรู้วิธีที่จะทำมันในProlog, Haskell, Fortran, LispหรือBasicแล้วโปรดไปขวาไปข้างหน้า


9
ปัญหาเกี่ยวกับสิ่งนี้คือมันจะไม่ปรากฏขึ้นในการค้นหาภาษาเฉพาะเนื่องจากไม่ใช่และไม่สามารถติดแท็กได้ในทุกภาษา
ChrisF

21
ฉันไม่เข้าใจว่าทำไมคำถามนี้จึงปิด ไซต์นี้มีจุดประสงค์เพื่อช่วยให้ผู้คนค้นพบข้อมูลไม่ใช่หรือไม่ หากมีคนรู้วิธีการทำบางสิ่งบางอย่าง (เช่น IO) ใน C และต้องการเรียนรู้วิธีการทำสิ่งเดียวกันใน Python สิ่งนี้สามารถช่วยพวกเขาได้โดยให้พวกเขาเห็นทั้งสองด้านเคียงข้างกัน
Slapout

18
ฉันยังไม่เข้าใจว่าทำไมสิ่งนี้จึงถูกปิด ดูเหมือนว่าเป็นเพราะมันไม่ได้รวมคำว่า "... ในจำนวนอักขระน้อยที่สุด ... " ซึ่งมันค่อนข้างโง่ รหัสกอล์ฟเป็นการออกกำลังกายที่สนุกสนาน แต่มันมีประโยชน์จริงๆหรือไม่ที่จะทำให้คำถาม Rosetta-Stone ทั้งหมดมีความสับสนรหัสเล็ก ๆ ในคำตอบทั้งหมด
spencer nelson

12
ฉันไม่เข้าใจว่าเว็บไซต์นี้เหมาะกับคำถามและคำตอบได้อย่างไร: อย่างน้อยก็ด้วยรหัสกอล์ฟมีมาตรฐานที่ค่อนข้างจะให้คะแนนในการตอบคำถาม: คำตอบที่สั้นที่สุดหรือฉลาดที่สุดจะได้รับคะแนนมากที่สุด ด้วยสิ่งนี้มันคืออะไรมีกี่คนที่ชอบ Haskell คำถามเช่นนี้เป็นเหมือนการพยายามที่จะซ่อนเนื้อหาทุกประเภทที่เป็นไปได้ไว้ในระบบที่ออกแบบมาสำหรับหนึ่งเดียว เกิดอะไรขึ้นกับส่วนที่เหลือของอินเทอร์เน็ตสำหรับจัดการเรื่องนี้?

11
ทำไมสิ่งนี้ถึงใช้งานไม่ได้ ไม่มีข้อมูลเกี่ยวกับข้อดีข้อเสียของแต่ละวิธี (ภาษาใดบ้างที่สนับสนุนเพียงทางเดียว) ไม่มีการอภิปรายการแลกเปลี่ยนและประเด็นที่ลึกซึ้งในแต่ละภาษา ขอบเขตที่ จำกัด ซึ่งแสดงถึงความจำเป็นที่จะต้องมีคำถามบาจิลีออนแยกกัน "ในทุกภาษา" และที่สำคัญที่สุดไม่มีการกลั่นกรองคุณภาพของคำตอบในแต่ละชุมชน ทำไมฉันถึงบอกว่าไม่มีการกลั่นกรองเมื่อมีคนลงคะแนนให้พวกเขา? เพราะควรจะมีเพียงคำตอบเดียวสำหรับแต่ละภาษาและผู้คนจะไม่อ่านคำตอบมากพอที่จะเห็นทางเลือกมากมายในสาขาของพวกเขา
dmckee --- ผู้ดูแลอดีตลูกแมว

คำตอบ:


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)

ชี้แจง

  • readlines ()ส่งคืนรายการบรรทัดทั้งหมดในไฟล์ ดังนั้นการเรียกใช้ readlines () ส่งผลให้อ่านแต่ละบรรทัดของไฟล์ ในกรณีเฉพาะนั้นการใช้ readlines () เพราะเราต้องอ่านไฟล์ทั้งหมด (เราต้องการบรรทัดสุดท้าย) แต่ถ้าไฟล์ของเรามีหลายบรรทัดและเราต้องการพิมพ์บรรทัดที่ n มันไม่จำเป็นต้องอ่านไฟล์ทั้งหมด ต่อไปนี้เป็นวิธีที่ดีกว่าในการรับบรรทัดที่ n ของไฟล์ใน Python: xreadlines () ใน Python 3 คืออะไรทดแทน .

  • สิ่งนี้มีคำสั่ง? ด้วยคำสั่งเริ่มต้นบล็อกรหัสที่คุณสามารถใช้ตัวแปร f เป็นวัตถุกระแสกลับมาจากการเรียกเพื่อเปิด () เมื่อ the with block จบลงไพ ธ อนจะเรียก f.close () โดยอัตโนมัติ สิ่งนี้รับประกันว่าไฟล์จะถูกปิดเมื่อคุณออกจากบล็อกไม่ว่าจะออกจากบล็อกอย่างไร (แม้ว่าคุณจะออกจากบล็อกด้วยข้อยกเว้นที่ไม่สามารถจัดการได้) คุณสามารถโทร f.close () อย่างชัดเจน แต่จะเกิดอะไรขึ้นถ้ารหัสของคุณมีข้อยกเว้นและคุณไม่ได้รับการโทร f.close () นั่นเป็นเหตุผลที่คำสั่ง with มีประโยชน์

  • คุณไม่จำเป็นต้องเปิดไฟล์อีกครั้งก่อนการดำเนินการแต่ละครั้ง คุณสามารถเขียนรหัสทั้งหมดภายในหนึ่งด้วยบล็อก

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

    ฉันใช้สามกับบล็อกเพื่อเน้นความแตกต่างระหว่างการดำเนินการที่สาม: เขียน (โหมด 'w'), ผนวก (โหมด 'a'), อ่าน (โหมด 'r', ค่าเริ่มต้น)


19
ฉันไม่คิดว่าใครควรเขียนreadlines()[1]โค้ดตัวอย่าง ในกรณีนี้คุณอาจรู้ว่าไฟล์มีเพียงสองบรรทัด แต่บางคนคิดว่ามันเป็นทางออกที่ดีอาจลองใช้ไฟล์ล้านบรรทัดและได้รับความประหลาดใจที่ค่อนข้างน่ารังเกียจ
Porculus

14
@Porculus พร้อม readlines () เราไม่ผ่านทุกบรรทัดในไฟล์ นี่คือ python 3 readlines () ส่งคืนตัววนซ้ำ (ไม่ใช่รายการ) ดังนั้นจะอ่านได้เพียงสองบรรทัดแรกเท่านั้น คล้ายกับ xreadlines () ใน python 2 (ซึ่งไม่มีอยู่ใน python 3)
snakile

7
@snakile: คุณช่วยกรุณาอ้างอิงบางสิ่งบางอย่างที่สนับสนุนการreadlines()ส่งคืนตัววนซ้ำ (ไม่ใช่รายการ)เพียงแค่ทราบ: โดยทั่วไปคุณไม่สามารถจัดทำดัชนีตัววนซ้ำได้
SilentGhost

8
@SilentGhost ฉันอ้างถึง "Dive to Python 3": "เมธอด readlines () จะส่งคืนตัววนซ้ำดังนั้นมันจึงมีประสิทธิภาพเท่ากับ xreadlines () อยู่ใน Python 2" ค้นหาคำสั่งนี้ใน: diveintopython3.org/porting-code-to-python-3-with-2to3.html ประการที่สองใน python 3 คุณสามารถสร้างดัชนีตัววนซ้ำ Type range (10) [4] ในเชลล์ (range () ยังส่งคืนตัววนซ้ำใน Python 3 ในทางตรงกันข้ามกับ python 2 โดยที่ range () ส่งคืนรายการ) โปรดทราบว่าช่วง (N) [i] เสร็จใน O (i) ไม่ใช่ O (1) และไม่ใช่ O (N)
snakile

5
@snakile: ความคิดเห็นของคุณผิดหลายระดับ ก่อนอื่น readlines จะส่งคืนรายการใน Python 3 (ทดสอบและดู) ดังนั้นรหัสที่กำหนดจะอ่านไฟล์ทั้งหมด ประการที่สองตัววนซ้ำไม่สามารถทำดัชนีใน Python 2 หรือ 3 rangeวัตถุมีการสนับสนุนพิเศษสำหรับการทำดัชนีซึ่งจะทำใน O (1)
ระหว่าง

242

LOLCODE

รายละเอียดเป็นร่างที่จะพูดน้อย แต่ฉันทำอย่างดีที่สุดที่ฉันสามารถทำได้ ให้การเริ่มต้น downvoting! :) ฉันยังพบว่ามันเป็นการออกกำลังกายที่สนุก

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
ฉันไม่คิดว่าจะมีภาษาอื่นที่จะมีคุณสมบัตินี้ที่แท้จริงทำให้ฉัน ... lol
Ionuț G. Stan

85
มันเศร้าที่ฉันคิดว่า LOLCODE สามารถอ่านได้มากกว่าสิ่งอื่นใดที่ฉันเคยเห็น
Joel

13
มันรบกวนความรู้สึกของภาษาธรรมชาติ
Abhinav Sarkar

19
การบอกว่าคุณคาดหวังว่าจะถูก downvote เป็นการรับประกัน upvotes บน SO เพราะจิตวิทยาย้อนกลับเป็นการกระทำที่สะท้อนกลับสำหรับโปรแกรมเมอร์
Brock Woolf

13
PLZ / AWSUM THX / O NOES ยอดเยี่ยมมาก ดูเหมือนว่านี่จะยิ่งใหญ่สำหรับฉัน
Calvin1602

43

สมอง *** k

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

26
คุณพลาด '-' หรือเปล่า? ;)
Aiden Bell

2
โอ้ความพยายาม แค่บันทึกก็ใช้เวลาเขียนเท่าไหร่?
Riduidel

และคุณไม่สามารถแยกมันข้ามหลายบรรทัดได้หรือไม่ ภาษาที่ดีที่สุดเท่าที่เคยมีมา
TheIronKnuckle

42

ภาษาโคบอล

เนื่องจากไม่มีใครทำ ......

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
สิ่งนี้ควรได้รับการโหวตไม่น้อยกว่า 1 ล้านครั้งสำหรับความเจ๋งสุด ๆ +1
Brock Woolf

1
+1 สำหรับ "ภาษานี้ยังอยู่ใกล้" = D
missingfaktor

3
ระวังเมื่อพยายามทำที่บ้าน คอมไพเลอร์ COBOL ของคุณอาจจะไม่ชอบสายยาวตัวแปรที่ทันสมัยเหล่านี้ ...
สเตฟาน Eggermont

ยานี่นำความทรงจำที่เก่าแก่กลับมา ฉันไม่คิดว่ามันเป็นไปตามความต้องการ แต่ ...
EvilTeach

ฉันกำลังเขียนโค้ดใน AcuCOBOL ทันที! อย่างไรก็ตามส่วน "I" ของ "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

หากคุณต้องการอ่าน / เขียนไฟล์:

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

7
Ahh the 'ผู้ทรงอำนาจ' Haskell ขอบคุณสำหรับการมีส่วนร่วม :)
Brock Woolf

3
@ Andreas Rejbrand ฉันเกือบแน่ใจว่าเขาลืม 'เป็น'
Federico klez Culloca

4
มีวิธีอื่น ๆ อีกมากมายในการใช้ I / O พื้นฐานใน Haskell ซึ่งมีประโยชน์ / สำคัญใน Haskell เมื่อคุณทำแอพบางประเภท ข้อความและแพ็คเกจทดสอบบน cabal / hackage ช่วยให้คุณจัดการกับการเข้ารหัสต่างๆและแพ็คเกจสไตล์ iteratee ต่างๆเช่น iteratee และ enumerate แสดงถึง "abstraction ที่รู้จักกันดีที่สุด" สำหรับการทำ io ที่เพิ่มขึ้น ที่สำคัญก็คือการแยกวิเคราะห์ libs เช่น parsec และ bytestring ที่เพิ่มขึ้นเท่านั้น attoparsec lib Haskellers ได้ใช้แนวทางอย่างละเอียดในการสำรวจตัวเลือกการออกแบบไอโอ ตัวอย่างที่ไม่สามารถใช้ได้ ได้แก่ ไอโอเอสขี้เกียจและความต่อเนื่อง
Carter Tazio Schonwald

4
Yuji: โดยพื้นฐานแล้วการโกง Haskell เป็นภาษาที่ใช้งานได้จริงยกเว้นประเภทใดก็ตามIO aที่มีคอมไพเลอร์พิเศษที่สนับสนุนผลข้างเคียง (ความบริสุทธิ์จะได้รับการเก็บรักษาไว้ที่อื่นเพราะสิ่งใดที่ทำงานหรือสังเกตผลข้างเคียงที่เป็นประเภทIO aดังนั้นระบบประเภทจะช่วยให้มั่นใจว่าส่วนที่เหลือของโปรแกรมของคุณยังคงบริสุทธิ์อยู่)
Sam Stokes

4
มันเกิดขึ้นนั่นIOคือ monad แต่นั่นไม่ใช่สาเหตุที่ทำให้เกิดผลข้างเคียง การเป็น monad คือสิ่งที่ช่วยให้คุณเขียนไวยากรณ์ที่มีความต้องการ: มันยังช่วยให้แน่ใจว่า (มีการสนับสนุนภาษาพิเศษ) ผลข้างเคียงเกิดขึ้นตามลำดับที่เหมาะสมดังนั้นคุณจึงไม่ได้อ่านจากไฟล์ก่อนที่จะเขียนเป็นต้น .
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 ++! ฉันฝันถึงวันที่ D แทนที่ C และ C ++ อย่างสมบูรณ์ :-)
missingfaktor

10
ดี บางทีฉันควรเรียน D
helpermethod

34

ทับทิม

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 ดี แต่ต้องเข้มงวดคุณไม่ต้องใส่ข้อมูลลงในตัวแปรก่อนที่จะเขียนลงในคอนโซล
Lasse Espeholt

3
@lasseespeholt คุณพูดถูก ฉันซ่อมมัน.
Wayne Conrad

5
ไม่มีเหตุผลที่จะใช้อักษรตัวใหญ่และพูดว่า 'PATH' เพียงแค่พูดว่า 'เส้นทาง'
OTZ

2
@otz มันคงที่ เขาอาจเรียกมันว่า 'เส้นทาง' แต่ค่าคงที่ใน Ruby ก็ต้องเริ่มต้นด้วยตัวอักษรตัวพิมพ์ใหญ่
Sirupsen

1
@Thomas Ahle: เมื่อใช้File.openกับบล็อกไฟล์จะถูกเปิดส่งผ่านไปยังบล็อกแล้วปิดโดยอัตโนมัติ
Matchu

33

ค#

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)เป็น. Net 4.0 เท่านั้นทางเลือกคือการFile.ReadAllLines(path)[1]แยกวิเคราะห์ไฟล์ทั้งหมดลงในอาร์เรย์


1
มันค่อนข้างสั้นใน C # ขอบคุณที่บริจาค
บร็อควูล์ฟ

13
หมายเหตุ: File.ReadLines เฉพาะกับ. NET 4
kirk.burleson

5
สิ่งที่ไวยากรณ์ที่ไม่พึงประสงค์ดู C # มี
ไอเดนเบล

3
@Aiden Bell: เทียบกับภาษาใด?
zfedoran

2
@Aiden Bell - คำตอบนี้พยายามรวบรัดมากกว่าที่อ่านได้ มีวิธีที่ "ดี" เป็นจำนวนมากในการบรรลุสิ่งเดียวกันใน C # ดูdotnetperls.com/file-handlingสำหรับตัวอย่างที่สมจริงยิ่งขึ้น
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;
}

คำตอบที่ดี ขอบคุณที่บริจาค +1
Brock Woolf

ทำไมคุณถึงเรียก fgets () สองครั้ง?
kirk.burleson

2
เพราะบรรทัดที่สองคือบรรทัดที่เราต้องการพิมพ์ไปยัง stdout
JeremyP

1
#include <stdio.h> int main (void) {ไฟล์ FILE ; ถ่าน buf [128]; file = fopen ("fileio.txt", "w"); if (! file) ข้อผิดพลาด goto; fputs ("hello \ n", ไฟล์); fflush (ไฟล์); fputs ("world \ n", ไฟล์); fclose (ไฟล์); file = fopen ("fileio.txt", "r"); if (! file) ข้อผิดพลาด goto; fgets (buf, sizeof (buf), ไฟล์); /ข้าม 'hello' / fgets (buf, sizeof (buf), ไฟล์); / get 'word' * / fclose (ไฟล์); fputs (buf, stdout); กลับ 0 ข้อผิดพลาด: fputs ("ไม่สามารถเปิดไฟล์ \ n", stderr); คืน 1 }
FelipeC

การเขียนโค้ดที่สะอาดดี (การตรวจสอบข้อผิดพลาดที่เหมาะสม) ในโพสต์ orignal C (ซึ่งค่อนข้างยาว)
xagyg

29

เชลล์สคริปต์ (UNIX)

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

จริง ๆ แล้วsed -n "2p"ส่วนที่พิมพ์บรรทัดที่สอง แต่คำถามถามว่าบรรทัดที่สองจะถูกเก็บไว้ในตัวแปรแล้วพิมพ์ดังนั้น ... :)


9
ฉันไม่รู้ว่าทำไม แต่ฉันชอบสิ่งนี้ :)
Federico klez Culloca

แน่นอนมันนับ คำตอบที่ดีและขอบคุณสำหรับการมีส่วนร่วม +1
Brock Woolf

ทำไมไม่ส่งมาตรฐานไปที่ / dev / null?
Gumbo

มีรุ่นที่ค่อนข้างง่ายและเร็วกว่าโดยใช้เพียง shell builtins (ซึ่งแตกต่างจากการแยกกระบวนการที่จะเรียกออกsed) ที่นี่: stackoverflow.com/questions/3538156/…
Brian Campbell

@Gumbo แล้วคุณจะรับบรรทัดที่สองได้อย่างไร LINE=`foo`จับการส่งออกของลงในตัวแปรfoo LINE
แปลกหน้า

27

x86 Assembler (NASM) บน Linux

ฉันไม่ได้สัมผัส asm ใน 7 ปีดังนั้นฉันจึงต้องใช้ google สักหน่อยเพื่อแฮกมันด้วยกัน แต่ก็ใช้งานได้;) ฉันรู้ว่ามันไม่ถูกต้อง 100% แต่เฮ้: D

ตกลงมันไม่ทำงาน ขอโทษด้วย ในขณะที่พิมพ์worldในท้ายที่สุดก็ไม่ได้พิมพ์จากไฟล์ แต่จากecxที่ตั้งอยู่บนบรรทัดที่ 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

การอ้างอิงที่ใช้: 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% หรือไม่ หากไม่เป็นเช่นนั้นให้ลบออกเพื่อให้เวอร์ชันที่ใช้งานได้เกิดขึ้น
kirk.burleson

4
สิ่งที่ตลกคือตัวอย่างใน C ซึ่งควรจะเป็นภาษาระดับที่สูงขึ้นเป็นเรื่องเกี่ยวกับตราบใดที่หนึ่งนี้ ... =)
Jani Hartikainen

1
@Jani: แต่อย่างน้อยก็ค่อนข้างง่ายที่จะเข้าใจ
sbi

คิดว่ามันเป็นสำหรับ DOS ในตอนแรก :)
mlvljr

21

JavaScript - node.js

ก่อนการโทรกลับซ้อนกันมากมาย

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

ทำความสะอาดนิดหน่อย:

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: ขอบคุณสำหรับผลงานมากมายของคุณ +1
Brock Woolf

4
@Dave ไม่ใช่ JS ที่พบในเบราว์เซอร์ ฉันหมายถึงวากยสัมพันธ์และความหมายมันเป็น JS เดียวกันเพียงแค่ไลบรารีมาตรฐานจะแตกต่างกัน ฉันใช้ stdlib ของnode.jsแพลตฟอร์ม ดูnodejs.org
Ionuț G. Stan

5
รหัสนี้กำลังร้องออกมาเพื่อดำเนินการต่อ ฉันได้ยินเสียงน้ำตา
แมตต์

2
เป็นเรื่องตลกหรือไม่ที่จำนวนบรรทัดใกล้เคียงกับโซลูชัน ASM ชั้นล่างใช่หรือไม่
kizzx2

1
@ มัดใช่การต่อเนื่องหรือพระจะช่วยได้ที่นี่เช่นกัน
Martijn

21

เสียงกระเพื่อมสามัญ

(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" ควรมีตัวอักษร "s" มากขึ้น :)
iwasrobbed

18

PowerShell

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

3
นี่เป็นสิ่งที่ดีและสะอาด พลังนรก
Jay Bazuzi

ฉันเห็นด้วยกับตรรกะของคุณเกี่ยวกับข้อความ เหตุผลที่ฉันลบมันออกมาก็คือฉันรู้ว่าสคริปต์นี้อยู่ด้านบนสุดของคอมแพคดังนั้นฉันจึงอยากให้มันเล็กลง - แต่เราให้มันชัดเจน :) และการใช้gcแทนที่จะcatทำให้รู้สึก :-) get-aliasให้ฉันcatก่อน (ฉันไม่ได้ใช้ PowerShell มาก)
Lasse Espeholt

4
ประณามมีอะไรที่สั้นลงไหม ??
0fnt

18

เชลล์สคริปต์

นี่คือเชลล์สคริปต์ที่ใช้เพียงแค่คำสั่งในตัวแทนที่จะเรียกใช้คำสั่งภายนอกเช่นsedหรือ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

เมื่อเขียนเชลล์สคริปต์ที่สำคัญขอแนะนำให้ใช้บิวอินมากที่สุดเท่าที่จะเป็นไปได้เนื่องจากการวางไข่กระบวนการแยกต่างหากอาจช้า จากการทดสอบอย่างรวดเร็วในเครื่องของฉันที่sedการแก้ปัญหาคือประมาณ 20 readครั้งช้ากว่าการใช้ หากคุณจะโทรsedครั้งเดียวเช่นในกรณีนี้มันไม่สำคัญมากนักเพราะมันจะทำงานได้เร็วกว่าที่คุณสังเกตเห็น แต่ถ้าคุณจะเรียกใช้งานมันหลายร้อยหรือหลายพันครั้งก็สามารถ เพิ่มขึ้น.

สำหรับผู้ที่ไม่คุ้นเคยกับไวยากรณ์{และ} ดำเนินการรายการคำสั่งในสภาพแวดล้อมเชลล์ปัจจุบัน (ตรงข้ามกับ(และ)ที่สร้าง subshell เราจำเป็นต้องปฏิบัติการในสภาพแวดล้อมเชลล์ปัจจุบันดังนั้นเราจึงสามารถใช้ค่าของตัวแปรในภายหลัง) . เราจำเป็นต้องจัดกลุ่มคำสั่งร่วมกันเพื่อให้ทั้งคู่ทำงานในอินพุตสตรีมเดียวกันซึ่งสร้างขึ้นโดยเปลี่ยนเส้นทางจากfileio.txt; ถ้าเราวิ่งเพียงแค่read < fileio.txt; read input < fileio.txtเราจะได้บรรทัดแรกเนื่องจากไฟล์จะถูกปิดและเปิดใหม่ระหว่างคำสั่งสองคำ เนื่องจากความไม่ชอบมาพากลของไวยากรณ์เชลล์ ( {และ}เป็นคำที่สงวนไว้ซึ่งตรงข้ามกับอักขระเมตา) เราจึงต้องแยก{และ};จากส่วนที่เหลือของคำสั่งที่มีช่องว่างและยุติรายการของคำสั่งกับที่

readbuiltinใช้เวลาเป็นอาร์กิวเมนต์ชื่อของตัวแปรในการอ่านเป็น มันกินบรรทัดของการป้อนข้อมูลแบ่งการป้อนข้อมูลด้วยช่องว่าง (ในทางเทคนิคมันแบ่งตามเนื้อหาของ$IFSซึ่งเริ่มต้นที่ตัวอักษรช่องว่างที่ตัวอักษรช่องว่างหมายถึงการแยกมันในพื้นที่แท็บหรือขึ้นบรรทัดใหม่) กำหนด แต่ละคำให้กับชื่อตัวแปรที่กำหนดตามลำดับและกำหนดส่วนที่เหลือของบรรทัดให้กับตัวแปรสุดท้าย เนื่องจากเราแค่จัดหาตัวแปรหนึ่งตัวมันแค่ใส่ทั้งเส้นในตัวแปรนั้น เราใช้$inputตัวแปรอีกครั้งเนื่องจากเราไม่สนใจสิ่งที่อยู่ในบรรทัดแรก (ถ้าเราใช้ Bash เราไม่สามารถระบุชื่อตัวแปรได้ แต่ต้องพกพาคุณต้องระบุชื่ออย่างน้อยหนึ่งชื่อเสมอ)

โปรดทราบว่าในขณะที่คุณสามารถอ่านบรรทัดได้ทีละบรรทัดเหมือนกับที่ฉันทำที่นี่รูปแบบที่ธรรมดากว่านั้นก็คือการพันในขณะที่วนรอบ:

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

3
ดีมาก. ฉันเรียนรู้บางสิ่ง (ถึงแม้ว่าจะเป็นการชั่วคราว)
Potatoswatter

ขอบคุณสำหรับการสนับสนุนของคุณไบรอัน
Brock Woolf

ป่วยโดยสิ้นเชิง! เป็นวิธีที่ดี :-)
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)))))

หรืออย่างเท่าเทียมกันโดยใช้มาโครเธรด->(หรือที่รู้จักในชื่อ paren remover):

(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 ในช่วง 50 ปีที่ผ่านมาแทบไม่มีใครพูดถึง Lisp / Scheme!
Ionuț G. Stan

11
เดี๋ยวก่อนspitชื่อฟังก์ชั่นเขียนไฟล์เป็นจริงหรือไม่
Sam Stokes

4
Clojure แน่นอนไม่โยก!
kirk.burleson

1
@ [Sam Stokes] มีฟังก์ชั่นในแกนที่เรียกว่า slurp ที่อ่านไฟล์ทั้งหมดเป็นสตริงและส่งกลับ คายไม่ตรงข้ามแน่นอน มีปัญหาอะไร มีฟังก์ชั่นอื่น ๆ เช่น line-seq ที่ทำสิ่งที่คล้ายกันในวิธีที่ต่างกัน
Rayne

4
@ kirk.burleson Rocks มากกว่า Java แน่นอน :)
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 # ดี ขอบคุณสำหรับการสนับสนุนของคุณ
Brock Woolf

16

ขั้นพื้นฐาน

ฉันไม่ได้ใช้ BASIC มาเกือบ 10 ปีแล้ว แต่คำถามนี้ทำให้ฉันมีความรู้อย่างรวดเร็ว :)

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$

มันวิเศษมากที่คุณยังสามารถทำได้หลังจากผ่านไป 10 ปี! ทำได้ดีมากและขอขอบคุณสำหรับการสนับสนุนของคุณ
Brock Woolf

แน่นอนว่าฉันไม่ได้ทำมันออกมาจากหัวของฉัน: ใช้เวลาสักครู่เพื่อค้นหาบางสิ่งบางอย่าง
คาซาบลังก้า

ใช่แน่นอน. ทำได้ดีมาก
Brock Woolf

คุณไม่ต้องการหมายเลขบรรทัดใน BASIC รุ่นสุดคลาสสิคใช่หรือไม่
Yuji

@Yuji: ใน "รุ่นคลาสสิคที่สุด" ใช่ แต่ฉันไม่คิดว่าจะมีรุ่นใดตั้งแต่ต้นยุค 90 จำเป็นต้องใช้พวกเขา
คาซาบลังก้า

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 ดูเหมือนว่าไวยากรณ์ต่างประเทศมากเมื่อมาจากภาษาเช่น Java
Faisal Abid

5
ความลับของ Objective-C คือ Xcode ทำทุกอย่างให้คุณ คุณไม่จำเป็นต้องจำชื่อวิธียาว ๆ แน่นอนพวกเขาทำให้โค้ดของคุณอ่านง่ายขึ้นมาก
Brock Woolf

7
และฉันคิดว่าไวยากรณ์ c ++ ดูแย่ที่สุดแล้ว
คางคก

6
Objective-C ดูไม่ดีเพียงอย่างเดียวเนื่องจากปากกาเน้นข้อความ Stackoverflow เน้นสีไม่ถูกต้อง
Brock Woolf

4
ฉันไม่อยากจะเชื่อเลยว่านี่จะอยู่ไกลลิสต์! นอกจากนี้พวก Java ที่แสดงความคิดเห็นว่า Objective-C นั้นน่าเกลียดคุณเห็นว่ามีหลายบรรทัดที่ใช้ในการเขียนไฟล์เดียวกันหรือไม่? ฉันเคยเป็นผู้ที่ชื่นชอบการใช้จาวา แต่ฉันคิดว่า Objective-C พุ่งเข้าหาหัวใจของฉัน
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
filehandles เกี่ยวกับคำศัพท์ 3 อาร์กิวเมนต์เปิดอยู่?
MkV

6
ไม่ควรใช้ filehandles ที่ไม่ใช่คำศัพท์ใน Stack Overflow ในทางปฏิบัติไม่ค่อยมีความจำเป็นสำหรับพวกเขาและผู้เริ่มต้นไม่ควรแสดงให้เห็นว่าพวกเขามีอยู่จริง
อีเธอร์

4
กันไปสำหรับสองอาร์กิวเมนต์เปิด: คุณไม่ควรใช้มันใน Stack Overflow และอาจไม่ได้ใช้งานจริง
rpkelly

2
ฉันใช้ filehandles 3-arg open และคำศัพท์มากฉันคิดว่ามันเป็นข้อผิดพลาดทางไวยากรณ์เมื่อฉันเห็นมัน และดังนั้นจึงควร / ฉันใคร่ครวญเขียนโมดูลเพื่อให้เป็นเช่นนั้น
Kent Fredric

2
"แม้การเปิดเอกภาพมีการใช้งาน" แต่ก็มีประโยชน์ใช้ แต่ฉันรู้สึกว่าถูกทำร้ายในวันที่ฉันทำงานออกมาว่าจะทำงานอย่างไรและจะไป "แน่นอนมีวิธีอื่น" ทุกครั้งที่ฉันเห็นใครบางคนที่คิดว่าพวกเขาต้องการ perl -we 'for (q{ps aux |}){ open _; print <_>; }'
Kent Fredric

15

R:

cat ("hello \ n", file = "fileio.txt")
cat ("world \ n", file = "fileio.txt", ผนวก = TRUE)
line2 = readLines ("fileio.txt", n = 2) [2]
แมว (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

มันเยี่ยมมาก ขอบคุณสำหรับการบริจาค
Brock Woolf

20
หรือคุณสามารถลงมือปฏิบัติ C และเพิ่มเครื่องหมายดอลลาร์
Kendall Hopkins

@ strager ฉันไม่มีความคิด มีคนที่ไม่รู้ว่ามันเป็น optinal และจริง ๆ แล้วมันดีกว่าถ้าไม่มี
Ionuț G. Stan

6
ในกรณีที่ใครอยากรู้อยากเห็นเหตุผลที่เขาออกจากแท็กปิดคือเพราะถ้าคุณรวมมันและเว้นช่องว่างสีขาวใด ๆ คุณจะเสี่ยงต่อการได้รับข้อผิดพลาด 'ส่วนหัวที่ส่งแล้ว'
Bill H

ไม่มีการอ้างอิงถึง?>: framework.zend.com/manual/en/…
cdmckay

15

ชวา

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: วันนี้ Java ไม่ช้า เพียง verbose แต่ไม่ช้า โปรดอย่าแสดงความคิดเห็นเช่น; ทำร้ายคน JVM ของเรา : '|
missingfaktor

9
ใครก็ตามที่กล่าวว่า Java ช้าไม่ว่าจะเป็นชวาที่ตาบอดหรือมีชีวิตอยู่ใต้หิน Java สามารถเร็วเท่ากับ, ถ้าไม่เร็วกว่า C, ด้วยความเป็นอิสระของแพลตฟอร์มในการบูต
NullUserException

4
@ Missing Faktor: แล้วงั้นเหรอ?
Jerry Coffin

19
ความเร็วในการประมวลผลเป็นรูปแบบที่ช้าที่สุดในการแข่งขันที่โปรแกรมเมอร์มี เป็นเรื่องเกี่ยวกับการเลือกเครื่องมือที่เหมาะสมสำหรับงานเสมอการเลือกตัวชี้วัดแบบสุ่มเช่นความเร็วในการประมวลผลและกำหนดความสำคัญให้กับมันเป็นเรื่องที่โง่เง่าโดยเฉพาะอย่างยิ่งเนื่องจากความเร็วในการปฏิบัติไม่สำคัญอย่างยิ่งต่องานส่วนใหญ่ตราบใดที่ ก็เพียงพอที่รวดเร็ว (ซึ่ง Java สำหรับเกือบทุกอย่าง)
แมตต์บริกส์

11
"การเดินสายนั้นเร็วกว่ารหัสเครื่อง", "รหัสเครื่องเร็วกว่า asm", "asm เร็วกว่า C", "C เร็วกว่า Java", "blah blah blah" ... คุณมีเงื่อนงำเพียงใด ทางอ้อมระหว่างรหัสเครื่องและ CPU อยู่แล้ว? ไมโครโค้ด, เครื่องมือเพิ่มประสิทธิภาพการทำนาย, แคชคำสั่ง / ข้อมูล, ถอดรหัส, ฯลฯ ไม่ต้องพูดถึง nondeterminism ที่เกิดจากการจัดสรรแบบไดนามิกใน C / asm Java และภาษาที่ปลอดภัยอื่น ๆ เป็นเพียงขั้นตอนเล็ก ๆ อีกขั้นของการอ้อมมันไม่ใช่เรื่องใหญ่อะไร คุณสามารถอยู่ในรูปแบบดั้งเดิมของคุณตลอดไปหรือพัฒนากับเรา
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';
}

หรือค่อนข้างอวดรู้น้อย

#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
ที่ดี! ขอบคุณที่บริจาค +1
Brock Woolf

14
ฉันลืมว่าไวยากรณ์ของ c ++ น่าเกลียดแค่ไหน
คางคก

นี่คือความเลวร้ายเมื่อเทียบกับรหัส C ++ ส่วนใหญ่ ปัญหาหลักคือการขาดค่าคงที่ที่เหมาะสมที่กำหนดไว้ในไลบรารีมาตรฐาน แต่ไม่ใช่ไวยากรณ์ มันทำให้ฉันหวั่นไหวว่าฉันจะต้องใส่<limits>เพียงเพื่อบอกignoreว่าไม่มีขีด จำกัด ของขนาดเส้น
Potatoswatter

8
@Hans: คุณต้องการที่จะชี้แจงว่า? โดยส่วนตัวฉันคิดว่า I / O อยู่ในห้องสมุดมากกว่าในภาษาและทุกภาษาที่ฉันเขียนโปรแกรมทำอย่างนั้น (C, C ++, Java, Python ฯลฯ )
Chinmay Kanchi

2
ตอนนี้ฉันรู้แล้วว่าทำไมไลนัสพูดว่า C ++ น่าเกลียด (ไม่มีความผิด)
kizzx2

13

ไป

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
ภาษานี้ควรเปลี่ยนชื่อเป็น "type"
Aiden Bell

นั่นคือos.O_RDWR | os.O_CREATE, 0666ขยะแม้กระทั่งสิ่งที่จำเป็นสำหรับแฟ้มพื้นฐาน I / O ใน Go?
Joey Adams

1
หรืออาจจะเปลี่ยนชื่อเป็น "Stop"
xagyg

16
มันค่อนข้างมหัศจรรย์ที่ได้รับวิวัฒนาการและการออกแบบภาษามา 30 ปีพวกเขายังคงสามารถคิดค้นภาษาใหม่ที่ยากที่จะเขียนโค้ดตรวจสอบข้อผิดพลาดในภาษา C. แม้กระทั่ง verbose ที่น้อยของ Java!
DK

5
ว้าว ... ดูเหมือนจะล้มเหลวมากด้วยตัวอย่างนี้
Alessandro Stamatto

12

Erlang

อาจไม่ใช่ Erlang ที่ใช้สำนวนมากที่สุด แต่:

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

แม้จะมีบางคนพูดว่า Emacs นั้นส่วนใหญ่เป็น text editor [1] ดังนั้นในขณะที่ Emacs Lisp สามารถใช้แก้ปัญหาทุกประเภทได้ แต่ปรับให้เหมาะกับความต้องการของโปรแกรมแก้ไขข้อความ เนื่องจากตัวแก้ไขข้อความ (เห็นได้ชัด) มีความต้องการค่อนข้างเฉพาะเมื่อกล่าวถึงวิธีจัดการไฟล์สิ่งนี้ส่งผลกระทบต่อการทำงานของไฟล์ที่เกี่ยวข้องกับ Emacs Lisp

โดยทั่วไปนี่หมายความว่า Emacs Lisp ไม่ได้เสนอฟังก์ชั่นในการเปิดไฟล์เป็นสตรีมและอ่านทีละส่วน เช่นเดียวกันคุณไม่สามารถต่อท้ายไฟล์โดยไม่โหลดทั้งไฟล์ก่อน แทนที่จะเป็นไฟล์ [2] ที่อ่านลงในบัฟเฟอร์ [3] ให้แก้ไขแล้วบันทึกลงไฟล์อีกครั้ง

สำหรับงานที่ต้องทำคุณจะต้องใช้ Emacs Lisp สำหรับสิ่งนี้เหมาะสมและหากคุณต้องการทำสิ่งที่ไม่เกี่ยวข้องกับการแก้ไขฟังก์ชั่นเดียวกันสามารถใช้งานได้

หากคุณต้องการผนวกไฟล์ซ้ำแล้วซ้ำอีกสิ่งนี้จะมาพร้อมค่าใช้จ่ายขนาดใหญ่ แต่ก็เป็นไปได้ดังที่แสดงไว้ที่นี่ ในทางปฏิบัติโดยปกติคุณจะทำการเปลี่ยนแปลงบัฟเฟอร์ไม่ว่าจะด้วยตนเองหรือโดยทางโปรแกรมก่อนที่จะเขียนลงในไฟล์ (เพียงรวมสองนิพจน์แรกในตัวอย่างด้านล่าง)

(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] อย่างน้อยฉันก็จะไม่ไปไกลเท่าที่เรียกมันว่าระบบปฏิบัติการ UI อื่นที่เป็นตัวเลือกใช่ OS ไม่

[2] คุณสามารถโหลดได้เพียงบางส่วนของไฟล์ แต่สามารถระบุได้เฉพาะไบต์เท่านั้น

[3] บัฟเฟอร์เป็นทั้งประเภทข้อมูลในห้องโถงคล้ายกับสตริงเช่นเดียวกับ "สิ่งที่คุณเห็นในขณะที่แก้ไขไฟล์" ในขณะที่การแก้ไขบัฟเฟอร์จะแสดงในหน้าต่าง แต่ผู้ใช้ไม่จำเป็นต้องมองเห็นบัฟเฟอร์

แก้ไข: หากคุณต้องการที่จะเห็นข้อความที่ถูกแทรกลงในบัฟเฟอร์คุณจะต้องทำให้เห็นได้ชัดและพักระหว่างการกระทำ เนื่องจากโดยปกติแล้ว Emacs จะแสดงหน้าจออีกครั้งเมื่อรอการป้อนข้อมูลของผู้ใช้ (และการนอนหลับไม่เหมือนกับการรออินพุต) คุณจึงต้องบังคับให้เล่นซ้ำอีกครั้ง นี่เป็นสิ่งจำเป็นในตัวอย่างนี้ (ใช้แทนการใช้ sexp ที่สอง); ในทางปฏิบัติฉันไม่เคยใช้ "เล่นซ้ำ" ซ้ำอีกครั้ง - ใช่แล้วนี่มันน่าเกลียด แต่ ...

(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
ขอบคุณมาก เป็นไปได้หรือไม่ที่จะปรับปรุงสิ่งนี้ดังนั้นฉันจึงเห็น 'ผี' เปิดไฟล์และพิมพ์มันเหมือนมาโครบางประเภท?
zedoo

11

ไฟล์ Windows Batch - เวอร์ชั่น # 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

เพื่ออธิบายว่าการค้นหาลูปที่น่ากลัวครั้งสุดท้ายมันจะถือว่ามีเพียงสวัสดี (ขึ้นบรรทัดใหม่) ในไฟล์เท่านั้น ดังนั้นมันจะข้ามบรรทัดแรกและ echos ที่สองเท่านั้น

การเปลี่ยนแปลง

  • 2 - Opps ต้องอ่านผิดข้อกำหนดหรือพวกเขาเปลี่ยนฉัน ตอนนี้อ่านบรรทัดสุดท้ายจากไฟล์


เรียบร้อย ขอบคุณสำหรับการสนับสนุนของคุณ
Brock Woolf

ฉันเข้าใจขั้นตอนที่ 4) เป็นการอ่านจากไฟล์ที่สร้างขึ้น
devio

@devio - ข้อกำหนดต้องมีการเปลี่ยนแปลงหรือฉันเพิ่งอ่านผิด ... อย่างไรก็ตามฉันจะดูว่ามีวิธีการแก้ปัญหานี้อยู่ด้วยหรือ
เปล่า

11

Scala:

ใช้ห้องสมุดมาตรฐาน:

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)

การใช้ห้องสมุด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)      


เนื่องจากมีหลายคนที่ใช้ตัวอธิบายไฟล์เดียวกันเพื่อเขียนสตริงสองตัวฉันจึงรวมวิธีนั้นไว้ในคำตอบของฉันด้วย

ใช้ห้องสมุดมาตรฐาน:

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)

การใช้ห้องสมุด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)

ฉันคิดว่าสิ่งนี้จะดูดีกว่าพร้อมล้าง () แทนที่จะปิด () ... ไม่มีการสร้าง FileWriter ใหม่ในทันที
Radtoo

2
@Radtoo: ต้องแสดงการดำเนินการต่อท้าย นั่นเป็นเหตุผลที่ฉันทำอย่างนี้
missingfaktor

@ Radtoo: หลังจากดูคำตอบอื่น ๆ ในกระทู้นี้ในที่สุดฉันก็ตัดสินใจที่จะรวมวิธีการดังกล่าวในคำตอบของฉัน ตรวจสอบ. (ฉันยังไม่ได้ลบรหัสต้นฉบับ)
missingfaktor

@ หายตัวไป Faktor ซึ่งgetLines().toList()ควรจะgetLines().toSeqขี้เกียจ?
Elazar Leibovich

@Elazar: คำแนะนำที่ดี ขอบคุณ :)
missingfaktor

11

Groovy

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

ขอบคุณสำหรับการมีส่วนร่วม
Brock Woolf

3
คุณกำลังนอกใจในส่วน "world \ n" มันไม่ได้ต่อท้ายมันเป็นเพียงการเขียนไปยังไฟล์ descriptor เดียวกัน
OTZ

การชี้แจงครั้งที่ 3 ในโพสต์ต้นฉบับ "คุณไม่จำเป็นต้องเปิดไฟล์ข้อความใหม่หลังจากเขียนบรรทัดแรก"
Wayne Keenan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.