Tệp I / O trong mọi ngôn ngữ lập trình [đã đóng]


127

Điều này phải là một câu hỏi phổ biến mà tất cả các lập trình viên thỉnh thoảng có. Làm cách nào để đọc một dòng từ tệp văn bản? Sau đó, câu hỏi tiếp theo là làm thế nào để tôi viết lại.

Tất nhiên hầu hết các bạn sử dụng khung mức cao trong lập trình hàng ngày (rất tốt để sử dụng trong câu trả lời) nhưng đôi khi thật tuyệt khi biết cách làm điều đó ở mức độ thấp.

Bản thân tôi biết làm thế nào để làm điều đó trong C , C++Objective-C, nhưng chắc chắn sẽ rất hữu ích khi xem cách nó được thực hiện trong tất cả các ngôn ngữ phổ biến, nếu chỉ để giúp chúng tôi đưa ra quyết định tốt hơn về ngôn ngữ nào để thực hiện tệp của chúng tôi. Tôi nghĩ sẽ rất thú vị khi xem cách nó được thực hiện trong các ngôn ngữ thao tác chuỗi, như : python, rubyvà tất nhiên perl.

Vì vậy, tôi hình ở đây chúng ta có thể tạo một tài nguyên cộng đồng mà tất cả chúng ta có thể gắn dấu sao vào hồ sơ của mình và tham khảo khi chúng ta cần thực hiện I / O bằng một số ngôn ngữ mới. Không đề cập đến việc tiếp xúc tất cả chúng ta sẽ có được các ngôn ngữ mà chúng ta không đối phó hàng ngày.

Đây là cách bạn cần trả lời:

  1. Tạo một tệp văn bản mới gọi là " fileio.txt "
  2. Viết dòng đầu tiên "xin chào" vào tệp văn bản.
  3. Nối dòng "thế giới" thứ hai vào tệp văn bản.
  4. Đọc dòng "thế giới" thứ hai thành một chuỗi đầu vào.
  5. In chuỗi đầu vào vào bàn điều khiển.

Làm rõ:

  • Bạn chỉ nên làm thế nào để làm điều này trong một ngôn ngữ lập trình cho mỗi câu trả lời.
  • Giả sử rằng tệp văn bản không tồn tại trước
  • Bạn không cần mở lại tệp văn bản sau khi viết dòng đầu tiên

Không có giới hạn cụ thể về ngôn ngữ. C, C++, C#, Java, Objective-CTất cả đều tuyệt vời.

Nếu bạn biết làm thế nào để làm điều đó trong Prolog, Haskell, Fortran, Lisp, hay Basicthì hãy đi ngay phía trước.


9
Vấn đề với điều này là nó sẽ không hiển thị trong các tìm kiếm cho một ngôn ngữ cụ thể vì nó không, cũng không thể, được gắn thẻ với mọi ngôn ngữ.
ChrisF

21
Tôi không hiểu tại sao câu hỏi này được đóng lại. Không phải mục đích của trang này là giúp mọi người tìm thông tin sao? Nếu ai đó biết cách làm một cái gì đó (như IO) trong C và muốn tìm hiểu cách làm điều tương tự trong Python, điều này có thể giúp họ bằng cách cho phép họ nhìn thấy cả hai bên cạnh nhau.
Tát

18
Tôi cũng không hiểu tại sao điều này bị đóng cửa. Có vẻ như đó chỉ là vì nó không bao gồm các từ "... trong số lượng ký tự ít nhất ...", điều này khá ngớ ngẩn. Code golf là một bài tập thú vị. Nhưng nó có thực sự hữu ích để làm cho tất cả các câu hỏi đá Rosetta bị xáo trộn, mã nhỏ trong tất cả các câu trả lời?
Spencer nelson

12
Tôi không hiểu làm thế nào điều này phù hợp với một trang web Hỏi & Đáp: ít nhất là với môn đánh gôn, có một tiêu chuẩn hơi khách quan để bỏ phiếu cho câu trả lời: câu trả lời ngắn nhất hoặc thông minh nhất được nhiều phiếu nhất. Với điều này: nó là gì, có bao nhiêu người thích Haskell? Những câu hỏi như thế này giống như cố gắng xâu chuỗi mọi loại nội dung có thể vào một hệ thống được thiết kế chỉ dành cho một người. Có gì sai với phần còn lại của internet để xử lý việc này?

11
Tại sao điều này không hoạt động tốt. Không có thông tin về ưu và nhược điểm của từng phương pháp (ngôn ngữ nào chỉ hỗ trợ một cách?). Không có thảo luận về sự đánh đổi và các vấn đề sâu sắc trong mỗi ngôn ngữ. Phạm vi giới hạn trong đó ngụ ý rằng sự cần thiết phải có một câu hỏi "trong mọi ngôn ngữ" riêng biệt. Và hầu hết không có sự kiểm duyệt của cộng đồng về chất lượng của từng câu trả lời. Tại sao tôi nói không kiểm duyệt khi mọi người đang bỏ phiếu cho họ? Bởi vì chỉ có một câu trả lời cho mỗi ngôn ngữ và mọi người sẽ không đọc đủ câu trả lời để xem nhiều lựa chọn thay thế trong lĩnh vực của họ.
dmckee --- ex-moderator mèo con

Câu trả lời:


48

Con trăn 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)

Làm rõ

  • readlines () trả về một danh sách tất cả các dòng trong tệp. Do đó, việc gọi ra các đường dẫn () dẫn đến việc đọc từng dòng của tệp. Trong trường hợp cụ thể đó, sử dụng readlines () là tốt vì chúng tôi phải đọc toàn bộ tệp (chúng tôi muốn dòng cuối cùng của nó). Nhưng nếu tệp của chúng tôi chứa nhiều dòng và chúng tôi chỉ muốn in dòng thứ n của nó, thì không cần thiết phải đọc toàn bộ tệp. Dưới đây là một số cách tốt hơn để có được dòng thứ n của tệp trong Python: Điều gì thay thế xreadlines () trong Python 3? .

  • Đây là gì với tuyên bố? Câu lệnh with bắt đầu một khối mã trong đó bạn có thể sử dụng biến f làm đối tượng luồng được trả về từ lệnh gọi để mở (). Khi khối kết thúc, python tự động gọi f.close (). Điều này đảm bảo tệp sẽ được đóng khi bạn thoát khỏi khối với bất kể bạn thoát khỏi khối như thế nào hoặc ngay cả khi bạn thoát khỏi nó thông qua một ngoại lệ chưa được xử lý). Bạn có thể gọi f.close () một cách rõ ràng, nhưng nếu mã của bạn phát sinh một ngoại lệ và bạn không nhận được cuộc gọi f.close () thì sao? Đó là lý do tại sao câu lệnh với hữu ích.

  • Bạn không cần mở lại tệp trước mỗi thao tác. Bạn có thể viết toàn bộ mã bên trong một với khối.

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

    Tôi đã sử dụng ba khối để nhấn mạnh sự khác biệt giữa ba thao tác: write (chế độ 'w'), chắp thêm (chế độ 'a'), đọc (chế độ 'r', mặc định).


19
Tôi thực sự không nghĩ ai nên viết readlines()[1]mã ví dụ. Trong trường hợp này, bạn có thể biết tệp chỉ có hai dòng, nhưng người khác hoàn toàn cho rằng đó là một giải pháp tốt có thể thử nó trên tệp hàng triệu và nhận được một bất ngờ khá khó chịu.
porculus

14
@Porculus với readlines () chúng tôi không đi qua tất cả các dòng trong tệp. Đây là python 3. readlines () trả về một iterator (không phải danh sách). Do đó, chỉ hai dòng đầu tiên của tệp sẽ được đọc. Điều này tương tự với xreadlines () trong python 2 (không tồn tại trong python 3).
snakile

7
@snakile: bạn có thể vui lòng trích dẫn điều gì đó để hỗ trợ readlines()trả về một trình vòng lặp (không phải là danh sách) Chỉ cần một lưu ý: bạn thường không thể lập chỉ mục một trình vòng lặp.
SilentGhost

8
@SilentGhost Tôi đang trích dẫn "Đi sâu vào Python 3": "Phương thức readlines () hiện trả về một trình vòng lặp, do đó, nó cũng hiệu quả như xreadlines () trong Python 2". Tìm kiếm tuyên bố này trong: diveintopython3.org/porting-code-to-python-3-with-2to3.html . Thứ hai, trong python 3, bạn có thể lập chỉ mục một trình vòng lặp. Loại phạm vi (10) [4] trong shell (phạm vi () cũng trả về một trình vòng lặp trong Python 3 trái ngược với python 2 trong đó phạm vi () trả về một danh sách). Lưu ý rằng phạm vi (N) [i] được thực hiện trong O (i), không phải O (1) và không O (N).
snakile

5
@snakile: Nhận xét của bạn sai ở nhiều cấp độ. Đầu tiên, readlines trả về một danh sách trong Python 3 (kiểm tra và xem). Vì vậy, mã được đưa ra sẽ đọc toàn bộ tập tin. Thứ hai, các trình vòng lặp không thể được lập chỉ mục trong Python 2 hoặc 3. Đối rangetượng có hỗ trợ đặc biệt để lập chỉ mục, được thực hiện trong O (1).
interjay

242

LOLCODE

Thông số kỹ thuật còn sơ sài để nói ít nhất, nhưng tôi đã làm tốt nhất có thể. Hãy bắt đầu xuống cấp! :) Tôi vẫn thấy nó là một bài tập thú vị.

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
Tôi không nghĩ rằng có bất kỳ ngôn ngữ nào khác ngoài đó để có tài sản này, theo nghĩa đen, làm cho tôi ... lol.
Ionuț G. Stan

85
Có buồn không khi tôi nghĩ LOLCODE dễ đọc hơn bất cứ thứ gì tôi từng thấy?
Joel

13
Nó xen vào bao nhiêu cảm giác như một ngôn ngữ tự nhiên.
Abhinav Sarkar

19
Nói rằng bạn mong đợi được hạ cấp là một sự đảm bảo cho các upvote trên SO vì tâm lý ngược là một hành động phản xạ cho một lập trình viên.
Brock Woolf

13
PLZ? / AWSUM THX / O NOES chỉ là tuyệt vời. Điều này có vẻ như toàn năng đối với tôi.
Calvin1602

43

Não *** k

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

26
Bạn đã bỏ lỡ một '-'? ;)
Aiden Bell

2
Ôi những nỗ lực. Chỉ cần cho hồ sơ, mất bao nhiêu thời gian để viết?
Riduidel

Và bạn không thể chia nó thành nhiều dòng? Ngôn ngữ tốt nhất từng có
TheIronKnuckle

42

Bạc hà

Vì không ai khác làm ......

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
Điều này sẽ được bình chọn không dưới 1 triệu lần cho sự tuyệt vời thuần túy +1
Brock Woolf

1
+1 cho "Ngôn ngữ này vẫn còn xung quanh." = D
missingfaktor

3
Hãy cẩn thận khi thử điều này ở nhà. Trình biên dịch cobol của bạn có thể không thích các dòng có độ dài thay đổi hiện đại này ...
Stephan Eggermont

Ya, điều này mang lại một số ký ức rỉ sét. Tôi không nghĩ rằng nó đáp ứng các yêu cầu mặc dù ...
EvilTeach

Tôi đang viết mã bằng AcuCOBOL ngay bây giờ! Nhân tiện, phần "tôi" của "I / O ở đâu?"
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

Nếu bạn chỉ muốn đọc / ghi một tập tin:

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

7
Ahh 'Toàn năng' Haskell. Cảm ơn sự đóng góp của bạn :)
Brock Woolf

3
@Andreas Rejbrand Tôi gần như chắc chắn rằng anh ta đã quên một 'be'
Federico klez Culloca

4
Có một số cách tiếp cận khác đối với I / O cơ bản trong Haskell trở nên hữu ích / quan trọng trong Haskell khi bạn đang thực hiện một số loại ứng dụng nhất định. Các gói văn bản và các gói kiểm tra trên cabal / hackage cho phép bạn xử lý các mã hóa khác nhau và các gói kiểu lặp khác nhau như iteratee và liệt kê đại diện cho một "trừu tượng được biết đến nhiều nhất" để thực hiện io gia tăng. Cũng quan trọng là phân tích libs như Parsec và bytestring chỉ tăng attoparsec lib. Haskeller đã thực hiện một cách tiếp cận rất kỹ lưỡng để khám phá các lựa chọn thiết kế io. Các ví dụ không khả thi bao gồm io lười biếng và các phần tiếp theo
Carter Tazio Schonwald

4
Yuji: về cơ bản, bằng cách gian lận. Haskell là một ngôn ngữ chức năng thuần túy, ngoại trừ bất kỳ loại nào IO a, có trình biên dịch đặc biệt hỗ trợ cho các tác dụng phụ. (Độ tinh khiết được bảo tồn ở nơi khác vì mọi thứ thực hiện hoặc quan sát tác dụng phụ đều thuộc loại IO a, vì vậy hệ thống loại đảm bảo phần còn lại của chương trình của bạn được giữ nguyên.)
Sam Stokes

4
Nó thực sự IOlà một đơn nguyên, nhưng đó không phải là lý do tại sao nó được phép làm tác dụng phụ. Trở thành một đơn nguyên là điều cho phép bạn viết cú pháp bắt buộc đó: nó cũng đảm bảo (cũng với sự hỗ trợ ngôn ngữ đặc biệt) các tác dụng phụ xảy ra theo một thứ tự hợp lý, vì vậy bạn không đọc từ tệp trước khi viết vào đó, v.v. .
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, Đẹp và dễ đọc hơn nhiều so với phiên bản C ++! Tôi mơ về một ngày khi D thay thế hoàn toàn C và C ++. :-)
missingfaktor

10
Đẹp. Có lẽ tôi nên học D một ngày nào đó.
helpermethod

34

Hồng ngọc

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 Đẹp, nhưng để nghiêm ngặt, bạn không đặt đầu vào thành một biến trước khi ghi nó vào bàn điều khiển.
Lasse Espeholt

3
@lasseespeholt, bạn nói đúng. Tôi sửa nó rồi.
Wayne Conrad

5
Không có lý do để viết hoa tên và nói 'PATH'. Chỉ cần nói 'con đường'.
OTZ

2
@otz Đó là một hằng số. Anh ta có thể gọi nó là 'Đường dẫn', một hằng số trong Ruby chỉ phải bắt đầu bằng một chữ cái viết hoa.
Sirupsen

1
@Thomas Ahle: khi sử dụng File.openvới một khối, tệp được mở, được chuyển đến khối và sau đó tự động đóng lại.
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)chỉ là .Net 4.0, thay thế là File.ReadAllLines(path)[1]phân tích toàn bộ tệp thành một mảng.


1
nó khá ngắn trong C #. cảm ơn vì đã đóng góp
Brock Woolf

13
LƯU Ý: File.ReadLines dành riêng cho .NET 4
kirk.burleson

5
Thật là một cú pháp khó chịu C # có
Aiden Bell

3
@Aiden Bell: liên quan đến ngôn ngữ nào?
zfedoran

2
@Aiden Bell - Câu trả lời này đang cố gắng ngắn gọn để có thể đọc được. Có rất nhiều cách "hay" để đạt được điều tương tự trong C #. Xem dotnetperls.com/file-handling để biết các ví dụ thực tế hơn.
Dan Diplo

29

AN 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;
}

Câu trả lời tốt đẹp. Cảm ơn bạn đã đóng góp +1
Brock Woolf

Tại sao bạn gọi fgets () hai lần?
kirk.burleson

2
Bởi vì dòng thứ hai là dòng mà chúng tôi muốn in ra thiết bị xuất chuẩn
JeremyP

1
#include <stdio.h> int main (void) {tệp FILE ; char buf [128]; file = fopen ("fileio.txt", "w"); if (! file) lỗi goto; fputs ("hello \ n", tệp); fflush (tập tin); fputs ("world \ n", tệp); fclose (tập tin); file = fopen ("fileio.txt", "r"); if (! file) lỗi goto; fgets (buf, sizeof (buf), file); / bỏ qua 'xin chào' / fgets (buf, sizeof (buf), tệp); / nhận 'từ' * / fc Đóng (tệp); fputs (buf, stdout); trả về 0; lỗi: fputs ("Không thể mở tệp \ n", stderr); trả lại 1; }
FelipeC

Mã hóa sạch đẹp (rất nhiều kiểm tra lỗi khá) trong bài viết C gốc (điều này làm giảm độ dài phần nào).
xagyg

29

Shell Script (UNIX)

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

Trên thực tế, sed -n "2p"phần này in dòng thứ hai, nhưng câu hỏi yêu cầu dòng thứ hai được lưu trữ trong một biến và sau đó được in, vì vậy ... :)


9
Tôi không biết tại sao, nhưng tôi thích điều này :)
Federico klez Culloca

Tất nhiên là nó có giá trị. Câu trả lời hay và cảm ơn vì đã đóng góp +1
Brock Woolf

Tại sao không gửi tiêu chuẩn ra / dev / null?
Gumbo

Có một phiên bản đơn giản hơn và nhanh hơn, chỉ sử dụng các nội dung shell (trái ngược với việc hủy bỏ một quy trình riêng để gọi sed), tại đây: stackoverflow.com/questions35388/ trên
Brian Campbell

@Gumbo, làm thế nào bạn có được dòng thứ hai? LINE=`foo`nắm bắt đầu ra của foobiến LINE.
strager

27

Trình biên dịch x86 (NASM) trên Linux

Tôi đã không chạm vào asm trong 7 năm, vì vậy tôi đã phải sử dụng google một chút để hack cái này cùng nhau, nhưng nó vẫn hoạt động;) Tôi biết nó không đúng 100%, nhưng hey: D

OK, nó không hoạt động. xin lỗi vì điều này trong khi worldcuối cùng nó in, nó không in nó từ tệp, mà từ ecxđó được đặt trên dòng 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

Tài liệu tham khảo được sử dụng: 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/LINEUX%20System%20Call%20Quick%20Reference.pdf


Bạn sẽ sửa nó để nó hoạt động 100%? Nếu không, hãy xóa nó để phiên bản hoạt động có thể thay thế.
kirk.burleson

4
Điều thú vị là ví dụ trong C, được cho là ngôn ngữ cấp cao hơn, dài bằng cái này ... =)
Jani Hartikainen

1
@Jani: Nhưng ít nhất nó cũng dễ hiểu hơn.
sbi

Nghĩ rằng nó là dành cho DOS lúc đầu :)
mlvljr

21

JavaScript - node.js

Đầu tiên, rất nhiều cuộc gọi lại lồng nhau.

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

Dọn dẹp hơn một chút:

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

@Iovy: Cảm ơn bạn đã đóng góp nhiều +1
Brock Woolf

4
@Dave, nó không phải là JS được tìm thấy trong các trình duyệt. Ý tôi là, về mặt cú pháp và ngữ nghĩa, đó là cùng một JS, chỉ là thư viện chuẩn là khác nhau. Tôi đã sử dụng stdlib của node.jsnền tảng. Xem nodejs.org
Ionuț G. Stan

5
Mã này đang khóc cho tiếp tục. Tôi có thể nghe thấy những giọt nước mắt của nó.
Matt

2
Có buồn cười không khi số lượng dòng gần như khớp với giải pháp ASM ở tầng dưới?
kizzx2

1
@Matt có, tiếp tục, hoặc đơn nguyên cũng sẽ giúp đỡ ở đây.
Martijn

21

Lisp thường gặp

(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
đối với một ngôn ngữ gọi là "lisp" thì sẽ có rất nhiều chữ "s" liên quan :)
iwasrobbed

18

PowerShell

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

3
Điều này là tốt đẹp và sạch sẽ. Yay powershell.
Jay Bazuzi

Tôi đồng ý với logic của bạn về trích dẫn. Lý do tôi loại bỏ chúng là vì tôi nhận ra rằng kịch bản này thực sự nằm trong top vì nhỏ gọn nên tôi muốn nó nhỏ hơn - nhưng chúng tôi đã để nó rõ ràng :). Và việc sử dụng gcthay vì catcó ý nghĩa :-) get-aliasđã cho tôi cattrước (Tôi không sử dụng PowerShell nhiều).
Lasse Espeholt

4
Chết tiệt, có gì ngắn hơn không ??
0fnt

18

Shell Script

Đây là một tập lệnh shell chỉ sử dụng các lệnh dựng sẵn, thay vì gọi các lệnh bên ngoài như sedhoặc tailnhư các phản hồi trước đó đã thực hiện.

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

Khi viết các kịch bản shell quan trọng, nên sử dụng các nội dung càng nhiều càng tốt, vì sinh ra một quy trình riêng biệt có thể bị chậm; từ một thử nghiệm nhanh trên máy của tôi, sedgiải pháp chậm hơn khoảng 20 lần so với sử dụng read. Nếu bạn sẽ gọi sedmột lần, như trong trường hợp này, điều đó thực sự không quan trọng lắm, vì nó sẽ thực thi nhanh hơn bạn có thể nhận thấy, nhưng nếu bạn sẽ thực hiện nó hàng trăm hoặc hàng nghìn lần, thì có thể thêm vào.

Đối với những người không quen với cú pháp {} thực hiện một danh sách các lệnh trong môi trường shell hiện tại (trái ngược với ()tạo ra một lớp con; chúng ta cần phải hoạt động trong môi trường shell hiện tại, vì vậy chúng ta có thể sử dụng giá trị của biến sau) . Chúng ta cần nhóm các lệnh lại với nhau để cả hai cùng hoạt động trên cùng một luồng đầu vào, được tạo bằng cách chuyển hướng từ fileio.txt; Nếu chúng ta chỉ đơn giản chạy read < fileio.txt; read input < fileio.txt, chúng ta sẽ chỉ nhận được dòng đầu tiên, vì tệp sẽ được đóng và mở lại giữa hai lệnh. Do một cú pháp riêng của cú pháp shell ( {}là các từ dành riêng, trái ngược với siêu ký tự), chúng ta cần tách {}từ phần còn lại của các lệnh có khoảng trắng và chấm dứt danh sách các lệnh bằng a ;.

Các readBUILTIN mất như một cuộc tranh cãi những cái tên của các biến để đọc vào. Nó tiêu thụ một dòng đầu vào, phá vỡ đầu vào bằng khoảng trắng (về mặt kỹ thuật, nó phá vỡ nó theo nội dung $IFS, mặc định cho một ký tự khoảng trắng , trong đó một ký tự khoảng trắng có nghĩa là phân chia nó trên bất kỳ khoảng trắng , tab hoặc dòng mới nào), gán mỗi từ cho các tên biến được đưa ra theo thứ tự và gán phần còn lại của dòng cho biến cuối cùng. Vì chúng tôi chỉ cung cấp một biến, nên nó chỉ đặt toàn bộ dòng trong biến đó. Chúng tôi sử dụng lại $inputbiến, vì chúng tôi không quan tâm đến dòng đầu tiên (nếu chúng tôi sử dụng Bash, chúng tôi không thể cung cấp tên biến, nhưng để có thể mang theo, bạn phải luôn cung cấp ít nhất một tên).

Lưu ý rằng trong khi bạn có thể đọc từng dòng một, như tôi làm ở đây, một mẫu phổ biến hơn nhiều sẽ là bọc nó trong một vòng lặp while:

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

3
Rất đẹp. Tôi đã học được một cái gì đó (mặc dù tạm thời).
Potatoswatter

Cảm ơn sự đóng góp của bạn Brian.
Brock Woolf

Hoàn toàn bị bệnh! Theo một cách tốt :-)
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)))))

Hoặc tương tự, sử dụng macro phân luồng ->(còn được gọi là loại bỏ paren):

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

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

1
WTF, trong 50 năm qua hầu như không ai nói đá Lisp / Scheme!
Ionuț G. Stan

11
Đợi đã, spitcó thực sự là tên của hàm ghi vào tập tin không?
Sam Stokes

4
Clojure chắc chắn không đá!
kirk.burleson

1
@ [Sam Stokes] Có một hàm trong lõi được gọi là slurp đọc toàn bộ tệp thành một chuỗi và trả về nó. nhổ không chính xác ngược lại. Vấn đề là gì? Có các hàm khác, như line-seq, thực hiện những điều tương tự theo những cách khác nhau.
Rayne

4
@ kirk.burleson Đá nhiều hơn Java, chắc chắn. :)
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 #. Đẹp. Cảm ơn sự đóng góp của bạn.
Brock Woolf

16

CĂN BẢN

Tôi đã không sử dụng BASIC trong gần 10 năm, nhưng câu hỏi này đã cho tôi một lý do để nhanh chóng nắm bắt kiến ​​thức của mình. :)

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$

Thật tuyệt vời khi bạn vẫn có thể làm điều này sau 10 năm!. Làm tốt và cảm ơn sự đóng góp của bạn.
Brock Woolf

Tôi tất nhiên đã không làm điều đó ra khỏi đỉnh đầu của tôi: mất một vài phút để tìm kiếm một số thứ.
casifer

Tất nhiên rồi. Vẫn làm tốt.
Brock Woolf

Bạn không cần số dòng trong phiên bản BASIC cổ điển nhất ???
Yuji

@Yuji: Trong "phiên bản cổ điển nhất", vâng, nhưng tôi không nghĩ bất kỳ phiên bản nào kể từ đầu những năm 90 đã yêu cầu chúng.
casifer

16

Mục tiêu-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
Tôi chưa bao giờ thích Objective-C. Cú pháp có vẻ rất xa lạ khi đến từ một ngôn ngữ như Java.
Faisal Abid

5
Bí mật của Objective-C là Xcode thực hiện tất cả các mã hoàn thành cho bạn. Bạn không cần phải nhớ tên phương thức dài. Họ chắc chắn làm cho mã của bạn dễ đọc hơn nhiều
Brock Woolf

7
Và tôi nghĩ rằng cú pháp c ++ đã trông tệ nhất.
cóc

6
Objective-C chỉ trông có vẻ xấu vì cú pháp tô sáng Stackoverflow không được tô màu chính xác.
Brock Woolf

4
Tôi không thể tin rằng điều này là quá xa trong danh sách! Ngoài ra, những người Java nhận xét rằng Objective-C là xấu, bạn có thấy cần bao nhiêu dòng để viết cùng một tệp không? Tôi đã từng là một người đam mê Java, nhưng tôi nghĩ Objective-C đã len lỏi vào trái tim tôi.
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
Những gì về file lexical, 3 đối số mở?
MkV

6
Không bao giờ nên sử dụng tập tin phi từ vựng trên Stack Overflow. Rất hiếm khi có nhu cầu về chúng trong thực tế và người mới bắt đầu không nên cho thấy rằng chúng thậm chí còn tồn tại.
Ether

4
Tương tự với hai đối số mở: Bạn không bao giờ nên sử dụng nó trên Stack Overflow và có thể không có trong thực tế.
rpkelly

2
Tôi sử dụng các tập tin từ vựng và mở 3-arg rất nhiều nên thực tế tôi coi đó là một lỗi cú pháp khi tôi nhìn thấy nó. Và nó nên là như vậy. / tôi suy nghĩ về việc viết một mô-đun để làm cho nó như vậy.
Kent Fredric

2
"Ngay cả unary open cũng có công dụng của nó", nó có công dụng của nó, vâng, nhưng tôi cảm thấy bị lạm dụng vào ngày tôi làm việc như thế nào và sẽ đi "Chắc chắn là có một cách khác" mỗi khi tôi thấy ai đó nghĩ rằng họ cần nó. perl -we 'for (q{ps aux |}){ open _; print <_>; }'
Kent Fredric

15

R:

mèo ("xin chào \ n", file = "fileio.txt")
con mèo ("world \ n", file = "fileio.txt", append = TRUE)
dòng2 = readLines ("fileio.txt", n = 2) [2]
mèo (dòng2)

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

Thật tuyệt. Cảm ơn sự đóng góp.
Brock Woolf

20
Ngoài ra, bạn có thể thực hiện C và thêm các ký hiệu đô la.
Kendall Hopkins

@strager Mình không có ý kiến. Có những người không biết nó là quang học và thực sự tốt hơn nếu không có nó.
Ionuț G. Stan

6
Chỉ trong trường hợp bất kỳ ai tò mò, lý do anh ta bỏ thẻ đóng là vì nếu bạn bao gồm nó và để lại bất kỳ khoảng trắng nào ở cuối, bạn có nguy cơ nhận được lỗi 'tiêu đề đã được gửi'.
Bill H

Tham khảo cho không ?>: framework.zend.com/manual/en/
Kẻ

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: Ngày nay Java không chậm. Chỉ dài dòng, nhưng không chậm. Xin đừng bình luận như vậy; làm tổn thương người JVM của chúng tôi. : '|
missingfaktor

9
Bất cứ ai nói Java chậm là một người ghét Java mù hoặc sống dưới một tảng đá. Java có thể nhanh như, nếu không nhanh hơn C, với tính độc lập nền tảng để khởi động.
NullUserException

4
@Missing Faktor: Và như vậy?
Jerry Coffin

19
tốc độ thực hiện là hình thức chậm nhất của các cuộc thi lập trình viên. Luôn luôn là về việc chọn công cụ phù hợp cho công việc, chọn một số liệu ngẫu nhiên như tốc độ thực thi và gán hàng đống tầm quan trọng cho nó chỉ là ngớ ngẩn, đặc biệt là vì tốc độ thực thi không quan trọng khủng khiếp đối với phần lớn các nhiệm vụ, miễn là nó là đủ nhanh (mà java dành cho hầu hết mọi thứ)
Matt Briggs

11
"hardwires nhanh hơn mã máy", "mã máy nhanh hơn asm", "asm nhanh hơn C", "C nhanh hơn Java", "blah blah blah" ... Bạn thậm chí có một đầu mối bao nhiêu Sự gián tiếp đã nằm giữa mã máy và CPU? microcode, tối ưu hóa dự đoán, lưu trữ hướng dẫn / dữ liệu, bộ giải mã, v.v., chưa kể đến tính không đặc hiệu gây ra bởi phân bổ động trong C / asm. Java và các ngôn ngữ an toàn khác chỉ là một bước nhỏ nữa của sự gián tiếp, nó không phải là vấn đề lớn. Bạn có thể ở dạng nguyên thủy của mình mãi mãi hoặc phát triển cùng chúng tôi.
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';
}

hoặc hơi ít về mặt giáo dục,

#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
Tuyệt quá! Cảm ơn bạn đã đóng góp +1
Brock Woolf

14
Tôi quên mất cú pháp của c ++ xấu xí như thế nào.
cóc

Điều này tồi tệ so với hầu hết các mã C ++ trông như thế nào. Vấn đề chính là thiếu các hằng số thích hợp được xác định trong thư viện chuẩn, tuy nhiên, không phải là cú pháp. Nó thổi tôi đi rằng tôi cần bao gồm <limits>chỉ để nói ignorerằng không có giới hạn về kích thước dòng.
Potatoswatter

8
@Hans: Bạn có muốn làm rõ điều đó? Cá nhân, tôi nghĩ rằng I / O thuộc về một thư viện chứ không phải ngôn ngữ và tất cả các ngôn ngữ tôi lập trình theo cách đó (C, C ++, Java, Python, v.v.)
Chinmay Kanchi

2
Bây giờ tôi biết tại sao Linus nói C ++ là xấu xí. (không vi phạm)
kizzx2

13

Đi

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
Ngôn ngữ này nên được đổi tên thành "loại"
Aiden Bell

os.O_RDWR | os.O_CREATE, 0666rác thậm chí cần thiết cho I / O tập tin cơ bản trong Go?
Joey Adams

1
Hoặc có lẽ nên đổi tên thành "Dừng"
xagyg

16
Thật đáng kinh ngạc khi có 30 năm tiến hóa và thiết kế ngôn ngữ, họ vẫn có thể phát minh ra một ngôn ngữ mới khó viết mã kiểm tra lỗi như C. Ngay cả Java cũng ít dài dòng hơn!
ĐK.

5
Wow ... Đi có vẻ thất bại rất nhiều với ví dụ này
Alessandro Stamatto

12

Erlang

Có lẽ không phải là Erlang thành ngữ nhất, nhưng:

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

Mặc dù một số người nói Emacs chủ yếu là một trình soạn thảo văn bản [1]. Vì vậy, trong khi Emacs Lisp có thể được sử dụng để giải quyết tất cả các loại vấn đề, nó được tối ưu hóa theo nhu cầu của trình soạn thảo văn bản. Vì các trình soạn thảo văn bản (rõ ràng) có các nhu cầu khá cụ thể khi nói đến cách các tệp được xử lý, điều này ảnh hưởng đến chức năng liên quan đến tệp mà Emacs Lisp cung cấp.

Về cơ bản, điều này có nghĩa là Emacs Lisp không cung cấp các chức năng để mở tệp dưới dạng luồng và đọc từng phần một. Tương tự như vậy, bạn không thể thêm vào một tệp mà không tải toàn bộ tệp trước. Thay vào đó, tập tin hoàn toàn [2] đọc vào bộ đệm [3], chỉnh sửa và sau đó lưu lại vào tập tin.

Đối với các tác vụ bắt buộc, bạn sẽ sử dụng Emacs Lisp cho việc này là phù hợp và nếu bạn muốn làm điều gì đó không liên quan đến việc chỉnh sửa các chức năng tương tự có thể được sử dụng.

Nếu bạn muốn nối thêm một tập tin nhiều lần thì điều này đi kèm với một chi phí rất lớn, nhưng có thể như đã trình bày ở đây. Trong thực tế, bạn thường hoàn thành các thay đổi đối với bộ đệm cho dù bằng tay hoặc lập trình trước khi ghi vào tệp (chỉ cần kết hợp hai biểu thức s đầu tiên trong ví dụ bên dưới).

(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] Ít nhất tôi sẽ không đi xa đến mức gọi nó là HĐH; một giao diện người dùng thay thế có, một hệ điều hành không.

[2] Bạn chỉ có thể tải các phần của tệp, nhưng điều này chỉ có thể được chỉ định theo byte.

[3] Bộ đệm vừa là kiểu dữ liệu trong một số trường hợp tương tự như chuỗi cũng như "điều bạn thấy trong khi chỉnh sửa tệp". Trong khi chỉnh sửa bộ đệm được hiển thị trong cửa sổ nhưng bộ đệm không nhất thiết phải hiển thị cho người dùng.

Chỉnh sửa: Nếu bạn muốn xem văn bản được chèn vào bộ đệm, rõ ràng bạn phải làm cho nó hiển thị và ngủ giữa các hành động. Bởi vì Emacs thường chỉ hiển thị lại màn hình khi chờ nhập liệu của người dùng (và ngủ không giống như chờ nhập), bạn cũng phải buộc hiển thị lại. Điều này là cần thiết trong ví dụ này (sử dụng nó thay cho sexp thứ hai); trong thực tế, tôi chưa bao giờ phải sử dụng 'redisplay' dù chỉ một lần - vì vậy, điều này thật xấu xí nhưng ...

(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
tốt đẹp cảm ơn. Có thể tăng cường điều này để tôi thực sự thấy một "bóng ma" mở tệp và gõ vào nó, giống như một macro nào đó không?
zedoo

11

Tập tin Windows Batch - Phiên bản # 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

Để giải thích rằng vòng lặp tìm kiếm khủng khiếp cuối cùng, nó giả định rằng chỉ có thế giới hello (newline) trong tệp. Vì vậy, nó chỉ bỏ qua dòng đầu tiên và tiếng vang chỉ thứ hai.

Thay đổi

  • 2 - Opps, phải đọc sai các yêu cầu hoặc họ đã thay đổi tôi. Bây giờ đọc dòng cuối cùng từ tập tin


khéo léo. cảm ơn sự đóng góp của bạn
Brock Woolf

Tôi hiểu bước 4) khi đọc từ tệp đã tạo.
devio

@devio - Các yêu cầu phải thay đổi hoặc tôi chỉ đọc sai chúng ... Dù sao tôi cũng sẽ thấy liệu một giải pháp như vậy có tồn tại hay không
TheLQ

11

Scala:

Sử dụng thư viện chuẩn:

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)

Sử dụng Thư viện Scala-ARM của 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)      


Vì nhiều người đã sử dụng cùng một bộ mô tả tệp để viết hai chuỗi, tôi cũng bao gồm cách đó trong câu trả lời của mình.

Sử dụng thư viện chuẩn:

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)

Sử dụng Thư viện Scala-ARM của 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)

Tôi nghĩ rằng nó sẽ trông đẹp hơn với flush () thay vì close () ... không khởi tạo lại FileWriter.
Radtoo

2
@Radtoo: Phải hiển thị thao tác chắp thêm. Đó là lý do tại sao tôi làm theo cách này.
missingfaktor

@Radtoo: Sau khi xem các câu trả lời khác trong chủ đề này, cuối cùng tôi đã quyết định đưa cách đó vào câu trả lời của mình. Kiểm tra nó. (Tôi đã không loại bỏ mã gốc mặc dù.)
missingfaktor

@Missing Faktor, getLines().toList()có nên getLines().toSeqlười không?
Elazar Leibovich

@Elazar: Gợi ý tốt. Cảm ơn. :)
missingfaktor

11

Groovy

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

cảm ơn vì đã đóng góp
Brock Woolf

3
Bạn đang gian lận trong phần "thế giới \ n". Nó không nối thêm, nó chỉ ghi vào cùng một mô tả tập tin.
OTZ

Làm rõ thứ 3 trong bài đăng gốc nói rằng "Bạn không cần mở lại tệp văn bản sau khi viết dòng đầu tiên"
Wayne Keenan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.