Файл вводу / виводу на кожній мові програмування [закрито]


127

Це має бути загальним питанням, яке час від часу виникають у всіх програмістів. Як прочитати рядок із текстового файлу? Тоді наступне запитання - це завжди, як мені це написати?

Звичайно, більшість із вас використовує рамки високого рівня в повсякденному програмуванні (які прекрасно використовувати у відповідях), але іноді приємно знати, як це зробити і на низькому рівні.

Я сам знаю , як зробити це в C, C++і Objective-C, але він упевнений , було б зручно , щоб побачити , як це робиться у всіх популярних мовах, якщо тільки , щоб допомогти нам зробити краще рішення про те, що мова , щоб зробити наш файл ІВ. Зокрема , Я думаю , було б цікаво подивитися , як його зробили на мовах маніпуляцій зі рядками, як: python, rubyі, звичайно ж perl.

Отже, я думаю, що тут ми можемо створити ресурс спільноти, на якому ми можемо зіставитись зі своїх профілів і посилатися на те, коли нам потрібно зробити файл вводу / виводу на новій мові. Не кажучи вже про експозицію, яку ми всі охопимо до мов, якими ми не займаємось щодня.

Ось як потрібно відповісти:

  1. Створіть новий текстовий файл під назвою " fileio.txt "
  2. Напишіть у текстовий файл перший рядок "привіт".
  3. Додайте до текстового файлу другий рядок "світ".
  4. Прочитайте другий рядок "world" у рядок введення.
  5. Роздрукуйте рядок введення на консоль.

Пояснення:

  • Ви повинні показати, як це зробити лише однією мовою програмування за кожну відповідь.
  • Припустимо, що текстовий файл заздалегідь не існує
  • Не потрібно повторно відкривати текстовий файл після написання першого рядка

Немає конкретного обмеження щодо мови. C, C++, C#, Java, Objective-CВсе чудово.

Якщо ви знаєте , як зробити це в Prolog, Haskell, Fortran, Lisp, або Basic, будь ласка , йдіть прямо вперед.


9
Проблема в цьому полягає в тому, що він не відображатиметься в пошуках певної мови, оскільки це не є, і не може бути позначене кожною мовою.
ChrisF

21
Я не розумію, чому це питання закрите. Чи не є метою цього сайту допомогти людям знайти інформацію? Якщо хтось знає, як щось робити (наприклад, IO) в C, і хоче навчитися робити те ж саме в Python, це може допомогти їм, дозволяючи їм бачити обидві сторони.
Slapout

18
Я також не розумію, чому це закрито. Здається, це просто тому, що вона не містить слова "... в найменшій кількості символів ...", що досить нерозумно. Код-гольф - це цікаве заняття. Але чи справді корисно, щоб усі питання, пов'язані з каменем розетки, затуманили крихітний код у всіх відповідях?
Спенсер Нельсон

12
Я не розумію, як це підходить на сайт із питань питань і питань: принаймні, з кодом гольфу, є дещо об'єктивний стандарт, за яким можна голосувати за відповіді: найкоротший або розумний відповідь отримує найбільше голосів. З цим: що це таке, скільки людей люблять Haskell? Такі питання схожі на те, щоб спробувати підключити всі можливі типи вмісту до системи, призначеної лише для одного. Що не так з рештою Інтернету для вирішення цього питання?

11
Чому це не працює добре. Немає інформації про плюси і мінуси кожного підходу (які мови підтримують лише один шлях?). Не обговорюйте компромісів та глибоких питань кожною мовою. Обмежений обсяг, який означає, що потреба в баджіліоні є окремими питаннями "на кожній мові". І більше за все не існує модерації якості відповіді у громаді. Чому я не кажу про поміркованість, коли люди голосують за них? Тому що передбачається лише одна відповідь на кожну мову, і люди не прочитають достатньо відповідей, щоб побачити декілька альтернатив у своїй галузі.
dmckee --- колишнє кошеня модератора

Відповіді:


48

Пітон 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? .

  • Що це з твердженням? Оператор with запускає блок коду, де ви можете використовувати змінну f в якості об'єкта потоку, повернутого з виклику open (). Коли блок з блоком закінчується, python викликає f.close () автоматично. Це гарантує, що файл буде закритий, коли ви виходите з блоку незалежно від того, як і коли ви виходите з блоку (навіть якщо ви виходите з нього через необроблений виняток). Ви можете зателефонувати f.close (), але що робити, якщо ваш код підвищує виняток, і ви не потрапите на виклик f.close ()? Ось чому з твердженням корисно.

  • Вам не потрібно повторно відкривати файл перед кожною операцією. Ви можете написати весь код всередині одного за допомогою блоку.

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

    Я використовував три з блоками, щоб підкреслити різницю між трьома операціями: write (режим 'w'), додати (режим 'a'), read (режим 'r', за замовчуванням).


19
Я дійсно не думаю, що ніхто ніколи не повинен писати readlines()[1]в приклад код. У цьому випадку ви, можливо, знаєте, що файл має лише два рядки, але хтось інший, напевно, припустивши, що це гарне рішення, може спробувати його на мільйонний рядок і отримати досить неприємний сюрприз.
Porculus

14
@Porculus з readlines () ми не проходимо всі рядки у файлі. Це python 3. readlines () повертає ітератор (не список). Тому будуть прочитані лише перші два рядки файлу. Це схоже на xreadlines () у python 2 (якого немає в python 3).
snakile

7
@snakile: чи можете ви процитувати щось у підтримку readlines()повернення ітератора (а не списку) .
SilentGhost

8
@SilentGhost Я цитую "Занурення в Python 3": "Метод readlines () тепер повертає ітератор, тому він настільки ж ефективний, як xreadlines () був у Python 2". Шукайте це твердження в: diveintopython3.org/porting-code-to-python-3-with-2to3.html . По-друге, в python 3 ви можете індексувати ітератор. Тип діапазону (10) [4] в оболонці (діапазон () також повертає ітератор в 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).
interjay

242

ЛОЛКОД

Технічні характеристики є найменшими, але я зробив усе, що міг. Нехай розпочнеться заборона! :) Я все ще вважаю це втіхою вправою.

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
Я не думаю, що там є якась інша мова, яка має цю властивість буквально змусити мене ... хаха.
Ionuț G. Stan

85
Чи сумно, що я думаю, що LOLCODE читає більше за все, що я бачив?
Джоель

13
Цікаветься, наскільки це відчуває природна мова.
Абхінав Саркар

19
Скажімо, що ви очікуєте зняття з посади - це гарантія підвищення цін на ЗП, оскільки зворотна психологія - це рефлекторна дія для програміста.
Брок Вульф

13
ПЛЗ? / AWSUM THX / O NOES просто приголомшливий. Мені це здається всемогучим.
Calvin1602

43

Мозок *** к

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

26
Ви пропустили знак "-"? ;)
Ейден Белл

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
пропав фактор

3
Будьте обережні, намагаючись це зробити вдома. Вашому компілятору коболів можуть не подобатися ці сучасні лінії змінної довжини ...
Стефан Еггермонт

Так, це повертає кілька іржавих спогадів. Я не думаю, що він відповідає вимогам, хоча ...
EvilTeach

Я зараз пишу код в AcuCOBOL! До речі, де "Я" частина "I / O?"
Buggabill

39

Хаскелл

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
Ах, "Всемогутній" Хаскелл. Дякуємо за ваш внесок :)
Brock Woolf

3
@Andreas Rejbrand Я майже впевнений, що він забув "бути"
Federico klez Culloca

4
Існує ряд інших підходів до базового вводу-виводу в Haskell, які стають корисними / важливими в Haskell, коли ви робите певні типи додатків. Текстові пакети та пакети повторних випробувань у програмі cabal / hackge дозволяють вам працювати з різними кодуваннями, а різні пакунки в стилі ітерації, такі як ітерація та перерахування, є "найвідомішою абстракцією" для того, щоб робити додаткові io. Також важливими є розбір ліфтів, таких як парсек, і поступовий тест лише тестопарсек. Haskellers дуже ґрунтовно підійшли до вивчення вибору дизайну io. До нежиттєздатних прикладів можна віднести ледачі і продовження
Картер Таціо Шонвальд,

4
Юджі: в основному, шляхом обману. Haskell - це чиста функціональна мова, за винятком будь-якого типу IO a, який має спеціальну підтримку компілятора для побічних ефектів. (Чистота зберігається в іншому місці, тому що все, що виконує або спостерігає побічний ефект, є типовим IO a, тому система типу забезпечує, що решта вашої програми залишається чистою.)
Сем Стоукс

4
Так трапляється, що IOце монада, але це не тому, що дозволено робити побічні ефекти. Бути монадою - це те, що дозволяє написати цей синтаксис, необхідний для нагляду: він також забезпечує (також за допомогою спеціальної підтримки мови) побічні ефекти трапляються в розумному порядку, тому ви не читаєте з файлу, перш ніж писати в нього тощо. .
Сем Стоукс

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 ++. :-)
пропав фактор

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, ти маєш рацію. Я полагодив це.
Уейн Конрад

5
Немає підстав писати велике ім'я та вимовляти "ПАТ". Просто скажіть "шлях".
ОТЗ

2
@otz Це постійна. Він міг би назвати це "Шлях", хоча константа в Рубі просто повинна починатися з великої літери.
Сірупсен

1
@Thomas Ahle: при використанні File.openз блоком файл відкривається, передається до блоку, а потім автоматично закривається.
Матву

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)є .Net 4.0, альтернативою є те, File.ReadAllLines(path)[1]що аналізує весь файл у масив.


1
його досить короткий у C #. спасибі за внесок
Brock Woolf

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 ; char buf [128]; file = fopen ("fileio.txt", "w"); якщо (! файл) перейти до помилки; fputs ("привіт \ n", файл); fflush (файл); fputs ("world \ n", файл); fclose (файл); file = fopen ("fileio.txt", "r"); якщо (! файл) перейти до помилки; fgets (buf, sizeof (buf), файл); / пропустити 'привіт' / fgets (buf, sizeof (buf), файл); / отримати 'слово' * / fclose (файл); fputs (buf, stdout); повернути 0; помилка: fputs ("Не вдалося відкрити файл \ n", stderr); повернути 1; }
FelipeC

Приємне чисте кодування (безліч пристойних перевірок помилок) в оригінальній публікації 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
Не знаю чому, але я люблю це :)
Федеріко Клез Каллока

Звичайно, це важливо. Приємна відповідь та подяка за те, що я написав +1
Brock Woolf

Чому б не відправити стандарт на / dev / null?
Gumbo

Існує дещо простіша та швидша версія, що використовує лише вбудовані оболонки (на відміну від відключення окремого процесу для виклику sed) тут: stackoverflow.com/questions/3538156/…
Брайан Кемпбелл

@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, який повинен бути мовою вищого рівня, приблизно такий, як цей ... =)
Яні Хартікайнен

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
@Matt так, продовження чи монади також допоможуть тут.
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
Це добре і чисто. Так, повноваження.
Джей Базузі

Я згоден з вашою логікою щодо цитування. Причиною того, що я їх усунув, було те, що я зрозумів, що цей сценарій насправді знаходиться вгорі за його компактність, тому я хотів, щоб він був ще меншим - але ми давали зрозуміти :). І використання 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один раз, як у цьому випадку, це насправді не має великого значення, оскільки воно виконається швидше, ніж ви можете помітити, але якщо ви збираєтесь його виконати в сотні або тисячі разів, це може складати.

Для тих, хто не знає синтаксис, {і } виконувати список команд у поточному середовищі оболонки (на відміну від (та, )які створюють підшару; нам потрібно працювати в поточному середовищі оболонки, щоб ми могли використовувати значення змінної пізніше) . Нам потрібно згрупувати команди разом для того, щоб вони обидва працювали на одному вхідному потоці, створеному перенаправленням з fileio.txt; якби ми просто бігли read < fileio.txt; read input < fileio.txt, ми просто отримали перший рядок, оскільки файл буде закритий і знову відкритий між двома командами. Через ідіосинкразію синтаксису оболонки ( {і }є зарезервованими словами, на відміну від метахарактерів), нам потрібно відокремити {і}з решти команд з пробілами, а список команд закінчується символом a ;.

readВбудований приймає в якості аргументу імена змінних для читання в. Він споживає рядок введення, розбиває вхід на пробіл (технічно він розбиває його відповідно до вмісту $IFS, який за замовчуванням відповідає символу пробілу, де символ пробілу означає розділити його на будь-який пробіл, вкладку чи новий рядок), призначає кожне слово до імен змінних, заданих порядком, і решту рядка присвоює останній змінній. Оскільки ми просто постачаємо одну змінну, вона просто розміщує весь рядок у цій змінній. Ми повторно використовуємо $inputзмінну, оскільки нам не байдуже, що знаходиться в першому рядку (якщо ми використовуємо Bash, ми могли б просто не вказати ім’я змінної, але щоб бути портативним, ви завжди повинні вводити принаймні одне ім’я).

Зауважте, що, хоча ви можете читати рядки один за одним, як я роблю тут, набагато більш поширеним шаблоном було б обернути його в певний час:

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

3
Дуже хороша. Я чомусь навчився (хоч і тимчасово).
Potatoswatter

Дякую за Ваш внесок Брайан.
Брок Вульф

Повністю хворий! В хороший спосіб :-)
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)))))

Або рівнозначно, використовуючи макрос нарізки ->(також відомий як видалення батьків):

(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справді це назва функції запису в файл?
Сем Стоукс

4
Clojure точно не гойдається!
kirk.burleson

1
@ [Sam Stokes] У ядрі є функція, яка називається slurp, яка читає весь файл у рядок і повертає його. коса робить навпаки. У чому проблема? Є й інші функції, такі як line-seq, які роблять подібні речі по-різному.
Рейне

4
@ kirk.burleson Скелі більше, ніж Java. :)
Rayne


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 років !. Молодці і дякую за ваш внесок.
Брок Вульф

Я, звичайно, не робив цього з голови: на пошук деяких речей знадобилося кілька хвилин.
касабланка

Так, звичайно. Ще молодець.
Брок Вульф

Чи не потрібні вам рядкові номери в найбільш класичній версії BASIC ???
Yuji

@Yuji: У "найбільш класичній версії", так, але я не думаю, що жодна версія з початку 90-х вимагала їх.
casablanca

16

Ціль-С

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.
Файсал Абід

5
Секрет Objective-C полягає в тому, що Xcode робить усі коди для вас. Вам не доведеться пам'ятати довгі назви методів. Вони, безумовно, роблять ваш код набагато читаючишим
Брок Вульф

7
І я думав, що синтаксис c ++ вже виглядає найгірше.
Жаба

6
Objective-C виглядає погано лише тому, що підсвічувач синтаксису Stackoverflow не кольоровий правильно.
Брок Вульф

4
Я не можу повірити, що це так далеко в списку! Також хлопці Java, коментуючи, що Objective-C некрасивий, ви бачили, скільки рядків потрібно, щоб написати той самий файл? Раніше я був ентузіастом Java, але думаю, що Objective-C прокрався, це дорога в моє серце.
Кайл

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
як щодо лексичних файлових файлів, 3 аргументи відкриті?
MkV

6
Нелексичні файлові файли ніколи не повинні використовуватися в Stack Overflow. На практиці в них рідко виникає потреба, і початківцям ніколи не слід показувати, що вони навіть існують.
Ефір

4
Те ж саме стосується і двох аргументів: ніколи не слід використовувати його в Stack Overflow і, мабуть, не на практиці.
rpkelly

2
Я так багато використовую відкриті та лексичні файлові файли 3-arg, що я практично вважаю це синтаксичною помилкою, коли я бачу це. І так має бути. / мені розмірковує над написанням модуля, щоб зробити це так.
Кент Фредрік

2
"Навіть унарний відкритий має свої можливості", він має свої можливості, так, але я відчував зловживання в той день, коли я розробив, як це працює, і пітиму "Безумовно, є інший шлях" кожного разу, коли я побачу когось, хто вважає, що це потрібно. perl -we 'for (q{ps aux |}){ open _; print <_>; }'
Кент Фредрік

15

R:

cat ("привіт \ n", файл = "fileio.txt")
cat ("world \ n", file = "fileio.txt", append = ІСТИНА)
line2 = readLines ("fileio.txt", n = 2) [2]
кішка (рядок2)

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

Це чудово. Дякуємо за внесок.
Брок Вульф

20
Крім того, ви можете взяти впровадження C і додати знаки долара.
Кендалл Хопкінс

@strager Я поняття не маю. Є люди, які не знають, що це оптинал, і що без нього насправді краще.
Ionuț G. Stan

6
На всякий випадок, коли хтось цікавий, причина, з якої він відмовився від закриття тегу, полягає в тому, що якщо ви включите його та залиште будь-який проміжок білого простору, ви ризикуєте отримати помилку "заголовки вже надіслані".
Білл Н

Довідка № ?>: Framework.zend.com/manual/en/…
cdmckay

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: Ці дні Java не повільна. Просто багатослівний, але не повільний. Будь ласка, не робіть таких коментарів; шкодить нам, JVM людям. : '|
зниклий фактор

9
Хто б не сказав, що Java повільна, це або сліпий ненависник Java, або живе під скелею. Java може бути такою ж швидкою, як і не швидше, ніж C, з незалежністю платформи до завантаження.
NullUserException

4
@Missing Faktor: І так?
Джері Коффін

19
Швидкість виконання є найбільш уповільненою формою пісаних конкурсів програмістів. Йдеться завжди про вибір правильного інструменту для роботи, вибір випадкової метрики, як швидкість виконання, і присвоєння їй великої ваги, це просто нерозумно, тим більше, що швидкість виконання не дуже важлива для переважної більшості завдань, якщо це досить швидкий (що Java майже для всього)
Метт Бріггс

11
"hardwiring швидше машинного коду", "машинний код швидше asm", "asm швидше C", "C швидше, ніж Java", "bla bla bla bla" ... У вас навіть є одна підказка, скільки непрямість вже між машинним кодом і процесором? мікрокод, оптимізатор прогнозування, кеш-інструкцій / даних, декодер тощо, не кажучи вже про недетермінізм, викликаний динамічним розподілом у C / asm. Ява та інші безпечні мови - це ще один невеликий крок непрямості, це нічого не важливо. Ви можете залишитись у своїй примітивній формі назавжди або розвиватися разом з нами.
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: Ви хочете уточнити це? Особисто я вважаю, що введення-вивід належить до бібліотеки, а не до мови, і всі мови, які я програмую, роблять це саме так (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
Цю мову слід перейменувати на "тип"
Ейден Белл

Чи os.O_RDWR | os.O_CREATE, 0666потрібен цей мотлох для базового вводу / виводу файлів у програмі Go?
Джої Адамс

1
Або, можливо, його слід перейменувати на "Стоп"
xagyg

16
Досить дивно, що, враховуючи 30 років еволюції та мовного дизайну, їм все-таки вдалося винайти нову мову, на яку так само важко написати код перевірки помилок, як і C. Навіть менш словесний Java!
ДК.

5
Нічого собі ... Здається, на цьому прикладі так багато не
вдалося

12

Ерланг

Напевно, не самий ідіоматичний Ерланг, але:

#!/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 - це головним чином текстовий редактор [1]. Тому, хоча Emacs Lisp можна використовувати для вирішення всіх видів проблем, він оптимізований для потреб текстового редактора. Оскільки текстові редактори (очевидно) мають досить специфічні потреби, коли справа стосується того, як обробляються файли, це впливає на функціональність, пов'язану з файлами, яку пропонує Emacs Lisp.

В основному це означає, що Emacs Lisp не пропонує функцій відкривати файл як потік і читати його по черзі. Так само ви не можете додати файл, не завантаживши попередньо весь файл. Натомість файл повністю [2] читається в буфер [3], редагується та знову зберігається у файлі.

Для обов'язкових завдань ви б використовували Emacs Lisp для цього, і якщо ви хочете зробити щось, що не передбачає редагування тих же функцій, можна використовувати.

Якщо ви хочете додавати файл знову і знову, це має великі накладні витрати, але це можливо, як показано тут. На практиці ви зазвичай закінчуєте вносити зміни до буфера вручну чи програму перед тим, як записати у файл (просто поєднайте перші два s-вирази у прикладі нижче).

(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] Принаймні, я б не пішов так далеко, як називати це ОС; альтернативний інтерфейс так, ОС немає.

[2] Ви можете завантажувати лише частини файлу, але це може бути визначено лише в байтах.

[3] Буфер - це і тип даних, схожий на рядок, і "річ, яку ви бачите під час редагування файлу". Під час редагування буфера відображається у вікні, але буфери не обов'язково повинні бути видимими користувачеві.

Редагувати: Якщо ви хочете, щоб текст вставлявся в буфер, ви, очевидно, повинні зробити його видимим і пережити між діями. Оскільки Emacs зазвичай лише повторно відображає екран під час очікування введення користувачем (а режим сну - це не те саме, що очікування введення), вам також доведеться примушувати повторне відображення. Це необхідно в цьому прикладі (використовувати його замість другого сексопу); на практиці мені ніколи не доводилося використовувати `повторне відображення 'навіть один раз - так, так, це некрасиво, але ...

(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 - версія №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

Щоб пояснити цей останній жахливий пошук циклу, передбачається, що у файлі є лише привіт (новий рядок). Тож він просто пропускає перший рядок і повторює лише другий.

Журнал змін

  • 2 - Опс, повинні неправильно прочитати вимоги або вони змінили мене. Тепер читає останній рядок з файлу


акуратний. дякую за ваш внесок.
Брок Вульф

Я розумію крок 4) як читання зі створеного файлу.
devio

@devio - Вимоги повинні бути змінені, або я їх просто неправильно прочитав ... У будь-якому разі я побачу, чи існує таке рішення
TheLQ

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 Джоша Сьюрета :

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 Джоша Сьюрета :

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)

Я думаю, що це буде виглядати приємніше з flush () замість close () ... без повторної інстанції FileWriter.
Radtoo

2
@Radtoo: Довелося показати операцію додавання. Тому я зробив це так.
зниклий фактор

@Radtoo: Переглянувши інші відповіді в цій темі, я нарешті вирішив включити саме такий спосіб у свою відповідь. Перевір це. (Я не видалив оригінал коду.)
missingfaktor

@Missing Faktor, getLines().toList()має бути getLines().toSeqякий ледачий?
Елазар Лейбович

@Elazar: Гарна пропозиція. Дякую. :)
зниклий фактор

11

Groovy

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

дякую за внесок.
Брок Вульф

3
Ви обманюєте "світову \ n" частину. Це не додається, це просто запис до того ж дескриптора файлу.
ОТЗ

У третьому роз’ясненні в початковій публікації зазначено: «Вам не потрібно знову відкривати текстовий файл після написання першого рядка»
Уейн Кінан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.