Файловый ввод-вывод на всех языках программирования [закрыто]

127

Это должен быть общий вопрос, который время от времени задают все программисты. Как прочитать строку из текстового файла? Тогда следующий вопрос: как мне его написать?

Конечно, большинство из вас используют высокоуровневую структуру в повседневном программировании (которую можно использовать в ответах), но иногда приятно знать, как это делать и на низком уровне.

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

Итак, я полагаю, что здесь мы можем создать ресурс сообщества, который мы все можем пометить в наших профилях и ссылаться, когда нам нужно выполнить файловый ввод-вывод на каком-то новом языке. Не говоря уже о том, что мы все столкнемся с языками, с которыми мы не сталкиваемся каждый день.

Вот как вам нужно ответить:

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

Разъяснение:

  • Вы должны показать, как это сделать, только на одном языке программирования за каждый ответ.
  • Предположим, что текстовый файл заранее не существует
  • Вам не нужно повторно открывать текстовый файл после написания первой строки

Нет особых ограничений по языку. C, C++, C#, Java, Objective-CВсе замечательно.

Если вы знаете , как сделать это в Prolog, Haskell, Fortran, Lisp, или Basic, пожалуйста , идите прямо вперед.

Брок Вульф
источник
9
Проблема в том, что он не будет отображаться при поиске по конкретному языку, поскольку он не помечен и не может быть помечен тегами для каждого языка.
ChrisF
21
Я не понимаю, почему этот вопрос закрыт. Разве цель этого сайта - не помогать людям находить информацию? Если кто-то знает, как делать что-то (например, ввод-вывод) на C, и хочет научиться делать то же самое на Python, это могло бы помочь им, позволив им видеть и то, и другое.
Slapout
18
Я тоже не понимаю, почему это закрыто. Похоже, это просто потому, что в нем нет слов «… хоть сколько-нибудь символов…», что довольно глупо. Кодовый гольф - увлекательное занятие. Но действительно ли полезно, чтобы все вопросы розеттского камня содержали запутанный, крошечный код во всех ответах?
Спенсер Нельсон
12
Я не понимаю, как это подходит для сайта вопросов и ответов: по крайней мере, с кодом для гольфа существует несколько объективный стандарт, по которому можно голосовать за ответы: самый короткий или самый умный ответ получает наибольшее количество голосов. С этим: что это такое, скольким людям нравится Haskell? Подобные вопросы похожи на попытку втиснуть все возможные типы контента в систему, предназначенную только для одного. Что не так с остальной частью Интернета, чтобы справиться с этим?
11
Почему это не работает. Нет информации о плюсах и минусах каждого подхода (какие языки поддерживают только один способ?). Никакого обсуждения компромиссов и глубоких проблем на каждом языке. Ограниченный объем, который подразумевает, что необходимость в bajiliion отдельные вопросы "на каждом языке". И, что самое главное, сообщество не контролирует качество каждого ответа. Почему я говорю «нет модерации», когда люди голосуют за них? Потому что для каждого языка должен быть только один ответ, и люди не будут читать достаточно ответов, чтобы увидеть несколько альтернатив в своей области.
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? ,

  • Что это с заявлением? Оператор with запускает блок кода, в котором вы можете использовать переменную f в качестве объекта потока, возвращаемого вызовом open (). Когда блок with заканчивается, python автоматически вызывает f.close (). Это гарантирует, что файл будет закрыт при выходе из блока with независимо от того, как и когда вы выйдете из блока (даже если вы выйдете из него через необработанное исключение). Вы можете вызвать f.close () явно, но что, если ваш код вызывает исключение, а вы не перейдете к вызову f.close ()? Вот почему полезно использовать оператор with.

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

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

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

snakile
источник
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 вы можете индексировать итератор. Введите в оболочке range (10) [4] (range () также возвращает итератор в Python 3 в отличие от python 2, где range () возвращает список). Обратите внимание, что range (N) [i] выполняется в O (i), а не в O (1) и не в O (N).
snakile
5
@snakile: Ваши комментарии ошибочны на нескольких уровнях. Во-первых, readlines возвращает список в Python 3 (протестируйте и посмотрите). Таким образом, данный код будет читать весь файл. Во-вторых, итераторы не могут быть проиндексированы в Python 2 или 3. У rangeобъекта есть специальная поддержка индексации, которая выполняется в O (1).
Interjay,
242

LOLCODE

Характеристики , мягко говоря, отрывочные, но я сделал все, что мог. Пусть начнется голосование против! :) Я до сих пор считаю это забавным упражнением.

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
Danita
источник
28
Я не думаю, что есть какой-либо другой язык, на котором это свойство буквально могло бы заставить меня ... лол.
Ionuț G. Stan
85
Печально, что я думаю, что LOLCODE более читабелен, чем все, что я видел?
Джоэл
13
Интересно, насколько это похоже на естественный язык.
Абхинав Саркар,
19
Заявление о том, что вы ожидаете отрицательного голоса, является гарантией положительного голоса в SO, потому что обратная психология - это рефлекторное действие для программиста.
Брок Вульф,
13
PLZ? / AWSUM THX / O NOES просто потрясающе. Мне это кажется всемогущим.
Calvin1602,
43

Brain *** к

,------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-],------------------------------------------------>,------------------------------------------------>,------------------------------------------------>[-]+++++++++>[-]+++++++++>[-]+++++++++<<<<<[>>>>>>+>>>+<<<<<<<<<-]>>>>>>>>>[<<<<<<<<<+>>>>>>>>>-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<<->>>->>>>>[-]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]<<<<<[>>>>+>+<<<<<-]>>>>>[<<<<<+>>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<<->>>->>>>[-]<<<<<<<[>>>>>+>>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>][-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<[-]+<[-]+<<<<<<[>>>>>>[-]<<<<<<[-]]>>>>>>[[-]+<<<<<[>>>>>[-]<<<<<[-]]>>>>>[[-]+<<<<[>>>>[-]<<<<[-]]>>>>[[-]+<<<[>>>[-]<<<[-]]>>>[[-]+<<[>>[-]<<[-]]>>[[-]+<[>[-]<[-]]>[[-]+++++++++++++++++++++++++++++++++++++++++++++++++.-...>[-]<[-]]<>[-]]<<>>[-]]<<<>>>[-]]<<<<>>>>[-]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]]<<<<<>>>>>[-]]<<<<<<>>>>>>>[<<<<<<<<[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]>[-]++++++++++<<+<<<<<<+>>>>>>>>>>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<->>->>>[-]<<<<<[>>>+>>+<<<<<-]>>>>>[<<<<<+>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<[>[-]<[-]]>[[-]+>[<[-]>[-]]<[<<<<<<<[-]<+>>>>>>>>[-]]><[-]]<<<<<<<<[>>>>>>+>>+<<<<<<<<-]>>>>>>>>[<<<<<<<<+>>>>>>>>-]>[-]++++++++++>>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>[<<<<<<->>>->>>[-]<<<<<<[>>>>+>>+<<<<<<-]>>>>>>[<<<<<<+>>>>>>-]<<<[>>+>+<<<-]>>>[<<<+>>>-][-]<<[>>[-]<[>[-]+<[-]]<[-]]>[-]>]<<<<[-]+<<[>>[-]<<[-]]>>[[-]+>[<[-]>[-]]<[<<<<<<<<[-]<+>>>>>>>>>[-]]><[-]]<<<<<<<<<++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.>>>>>>>>[-]]
Svisstack
источник
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
Брок Вульф,
1
+1 за «Этот язык все еще существует». = D
missingfaktor
3
Будьте осторожны, пытаясь сделать это дома. Вашему компилятору кобола могут не понравиться эти современные строки переменной длины ...
Стефан Эггермонт,
Да, это возвращает старые ржавые воспоминания. Я не думаю, что это соответствует требованиям ...
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" 
Ionuț G. Stan
источник
7
Ах, "Всемогущий" Хаскелл. Спасибо за ваш вклад :)
Брок Вульф
3
@Andreas Rejbrand Я почти уверен, что он забыл 'быть'
Федерико Клез Каллока
4
Существует ряд других подходов к базовому вводу-выводу в Haskell, которые становятся полезными / важными в Haskell, когда вы создаете определенные типы приложений. Пакеты text и bytestring в cabal / hackage позволяют вам иметь дело с различными кодировками, а различные пакеты стиля iteratee, такие как iteratee и enumerate, представляют собой «наиболее известную абстракцию» для выполнения инкрементного io. Также важен синтаксический анализ библиотек, таких как parsec, и инкрементной строки байтов только attoparsec lib. Haskellers очень тщательно подошли к изучению вариантов дизайна io. Нежизнеспособные примеры включают ленивый io и продолжения
Картер Тацио Шонвальд,
4
Юджи: В основном, обманом. Haskell - это чистый функциональный язык, за исключением любого типа IO a, который имеет специальную поддержку компилятора для побочных эффектов. (Чистота сохраняется в другом месте, потому что все, что выполняет или наблюдает побочный эффект, относится к типу IO a, поэтому система типов гарантирует, что остальная часть вашей программы остается чистой.)
Сэм Стоукс,
4
Так получилось, что IOэто монада, но побочные эффекты ей разрешены не поэтому. Быть монадой - вот что позволяет вам написать этот императивно выглядящий синтаксис: он также гарантирует (также с поддержкой специального языка), что побочные эффекты происходят в разумном порядке, поэтому вы не читаете из файла, прежде чем писать в него, и т. .
Сэм 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 Красиво, но, строго говоря, вы не помещаете ввод в переменную перед записью ее в консоль.
Лассе Эспехольт,
3
@lasseespeholt, ты прав. Я починил это.
Уэйн Конрад,
5
Нет причин использовать имя переменной в верхнем регистре и говорить "ПУТЬ". Просто скажите «путь».
OTZ
2
@otz Это константа. Он мог бы назвать это «Путь», поскольку константа в Ruby просто должна начинаться с заглавной буквы.
Sirupsen
1
@Thomas Ahle: при использовании File.openс блоком файл открывается, передается в блок, а затем автоматически закрывается.
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)есть только .Net 4.0, альтернативой является File.ReadAllLines(path)[1]анализ всего файла в массив.

Лассе Эспехольт
источник
1
это довольно коротко в C #. спасибо за участие
Брок Вульф
13
ПРИМЕЧАНИЕ. File.ReadLines относится к .NET 4
kirk.burleson
5
Какой неприятный синтаксис у C #
Эйден Белл,
3
@ Эйден Белл: относительно какого языка?
zfedoran
2
@Aiden Bell - Этот ответ пытается быть кратким, а не читабельным. В C # есть много "хороших" способов добиться того же. См. Dotnetperls.com/file-handling для более реалистичных примеров.
Дэн Дипло,
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;
}
Maister
источник
Хороший ответ. Спасибо за помощь +1
Брок Вульф
Почему вы дважды вызываете fgets ()?
kirk.burleson
2
Потому что вторая строка - это та, которую мы хотим вывести на стандартный вывод
JeremyP
1
#include <stdio.h> int main (void) {FILE file; char buf [128]; file = fopen ("fileio.txt", "w"); if (! file) ошибка перехода; fputs ("привет \ п", файл); fflush (файл); fputs ("мир \ п", файл); fclose (файл); file = fopen ("fileio.txt", "r"); if (! file) ошибка перехода; fgets (buf, sizeof (buf), file); / пропустить 'привет' / fgets (buf, sizeof (buf), file); / получить слово * / 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"часть печатает вторую строку, но вопрос требует, чтобы вторая строка была сохранена в переменной, а затем распечатана, поэтому ... :)

robertbasic
источник
9
Я не знаю почему, но мне это нравится :)
Федерико Клез Каллока
Конечно, это имеет значение. Хороший ответ и спасибо за помощь +1
Брок Вульф
Почему бы не отправить стандарт в / dev / null?
Гамбо
Есть несколько более простая и быстрая версия, использующая только встроенные функции оболочки (в отличие от разделения отдельного процесса для вызова sed), здесь: stackoverflow.com/questions/3538156/…
Брайан Кэмпбелл
@Gumbo, тогда как бы ты получил вторую строчку? LINE=`foo`фиксирует вывод fooв переменную LINE.
Strager
27

ассемблер x86 (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

robertbasic
источник
Собираетесь поправить, чтобы он работал на 100%? Если нет, удалите его, чтобы его место заняла рабочая версия.
kirk.burleson
4
Что забавно, так это то, что пример на C, который должен быть языком более высокого уровня, примерно такой же длинный, как этот ... =)
Яни Хартикайнен
1
@Jani: Но, по крайней мере, это немного легче понять.
sbi
Сначала
думала, что
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
Брок Вульф,
4
@ Дэйв, это не тот JS, который можно найти в браузерах. То есть синтаксически и семантически это тот же JS, только стандартная библиотека отличается. Я использовал stdlib node.jsплатформы. См. Nodejs.org
Г. Стэн
5
Этот код требует продолжения. Я слышу его слезы.
Мэтт
2
Разве не забавно, что количество строк почти совпадает с количеством строк в решении ASM внизу?
kizzx2
1
@ Матт, да, здесь тоже могут помочь продолжения или монады.
Martijn
21

Common Lisp

(defun main ()
  (with-open-file (s "fileio.txt" :direction :output :if-exists :supersede)
    (format s "hello"))
  (with-open-file (s "fileio.txt" :direction :io :if-exists :append)
    (format s "~%world")
    (file-position s 0)
    (loop repeat 2 for line = (read-line s nil nil) finally (print line))))
twopoint718
источник
1
для языка под названием "шепелявый" должно быть задействовано намного больше букв "s" :)
iwasrobbed
18

PowerShell

sc fileio.txt 'hello'
ac fileio.txt 'world'
$line = (gc fileio.txt)[1]
$line
Лассе Эспехольт
источник
3
Это красиво и чисто. Ура, PowerShell.
Джей Базузи,
Я согласен с вашей логикой цитирования. Причина, по которой я удалил их, заключалась в том, что я понял, что этот сценарий на самом деле является лучшим из-за своей компактности, поэтому я хотел, чтобы он был еще меньше, но мы позволили ему быть ясным :). И использование gcвместо catимеет смысл :-) get-aliasдало мне catпервое (я мало использую PowerShell).
Лассе Эспехольт,
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, мы бы просто получили первую строку, так как файл был бы закрыт и снова открыт между двумя командами. Из-за идиосинкразии синтаксиса оболочки ( {и }это зарезервированные слова, а не метасимволы), нам нужно разделить {и}от остальных команд с пробелами и завершите список команд символом ;.

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

Обратите внимание, что, хотя вы можете читать строки по одной, как я здесь, гораздо более распространенным шаблоном было бы заключить их в цикл while:

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

Или, что то же самое, с помощью макроса threading ->(также известного как средство удаления пареной):

(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
@ [Сэм Стокс] В ядре есть функция slurp, которая считывает весь файл в строку и возвращает ее. плевать делает прямо противоположное. В чем проблема? Есть и другие функции, такие как line-seq, которые делают похожие вещи по-разному.
Rayne
4
@ kirk.burleson Качает больше, чем Ява, конечно. :)
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 #. Ницца. Спасибо за ваш вклад.
Брок Вульф,
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

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.
Фейсал Абид,
5
Секрет Objective-C в том, что Xcode выполняет за вас все завершение кода. Вам не нужно запоминать длинные имена методов. Однако они определенно делают ваш код более читабельным,
Брок Вульф,
7
И я думал, что синтаксис C ++ уже выглядит хуже всего.
Toad
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
То же самое касается двух открытых аргументов: вы никогда не должны использовать его при переполнении стека, и, вероятно, не на практике.
rpkelly
2
Я так часто использую открытые и лексические дескрипторы файлов с 3 аргументами, что практически считаю это синтаксической ошибкой, когда вижу это. Так и должно быть. / me думает написать модуль, чтобы сделать это так.
Кент Фредрик,
2
«Даже унарный open имеет свое применение», у него есть свои применения, да, но я чувствовал себя оскорбленным в тот день, когда я понял, как это работает, и буду повторять «Конечно, есть другой путь» каждый раз, когда я вижу кого-то, кто думает, что он им нужен. perl -we 'for (q{ps aux |}){ open _; print <_>; }'
Кент Фредрик,
15

Р:

кошка ("привет \ n", file = "fileio.txt")
cat ("мир \ n", file = "fileio.txt", append = TRUE)
line2 = readLines ("fileio.txt", n = 2) [2]
кошка (line2)
David F
источник
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
Ionuț G. Stan
источник
Замечательно. Спасибо за вклад.
Брок Вульф,
20
В качестве альтернативы вы можете взять реализацию C и добавить знаки доллара.
Кендалл Хопкинс,
@strager Понятия не имею. Есть люди, которые не знают, что это оптично и что на самом деле лучше без него.
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());
    }       
  }
}
st0le
источник
36
@Brock: В наши дни Java не тормозит. Просто многословно, но не медленно. Пожалуйста, не делайте таких комментариев; вредит нам, людям JVM. : '|
missingfaktor
9
Тот, кто сказал, что Java работает медленно, либо слепой ненавистник Java, либо живет под камнем. Java может быть такой же быстрой, если не быстрее, чем C, с независимостью от платформы для загрузки.
NullUserException
4
@Missing Faktor: И так?
Джерри Коффин,
19
скорость исполнения - самая отсталая форма соревнований, которые устраивают программисты. Речь всегда идет о выборе правильного инструмента для работы, выбор случайной метрики, такой как скорость выполнения, и присвоение ей кучи важности просто глупо, тем более, что скорость выполнения не так уж и важна для подавляющего большинства задач, если она достаточно быстра (а java подходит почти для всего)
Мэтт Бриггс,
11
«аппаратное соединение быстрее, чем машинный код», «машинный код быстрее, чем asm», «asm быстрее, чем C», «C быстрее, чем Java», «бла-бла-бла» ... У вас есть хоть одна подсказка, насколько косвенное обращение уже есть между машинным кодом и процессором? микрокод, прогнозирующий оптимизатор, кеши инструкций / данных, декодер и т. д., не говоря уже о недетерминированности, вызванной динамическим распределением в 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;
}
Potatoswatter
источник
1
Большой! Спасибо за участие +1
Брок Вульф
14
Я забыл, насколько уродливым может быть синтаксис C ++.
Toad
Это является зверским по сравнению с тем, что как и большинство C ++ код выглядит. Основная проблема - это отсутствие соответствующих констант, определенных в стандартной библиотеке, но не синтаксиса. Меня поражает то, что мне нужно включить, <limits>чтобы сказать, ignoreчто нет ограничений на размер строки.
Potatoswatter
8
@Hans: Вы хотите уточнить это? Лично я считаю, что ввод-вывод принадлежит библиотеке, а не языку, и все языки, на которых я программирую, делают это таким образом (C, C ++, Java, Python и т. Д.)
Чинмей Канчи,
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)
}
eclark
источник
23
Этот язык следует переименовать в "тип"
Эйден Белл
Этот os.O_RDWR | os.O_CREATE, 0666мусор нужен даже для базового файлового ввода-вывода в Go?
Джоуи Адамс,
1
Или, может быть, его стоит переименовать в «Стоп»
xagyg
16
Довольно удивительно, что, учитывая 30 лет эволюции и проектирования языков, им все же удалось изобрести новый язык, на котором так же сложно писать код проверки ошибок, как на C. Даже Java менее подробный!
ДК.
5
Вау ... Го кажется таким большим
провалом в
12

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).
clofresh
источник
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 обычно повторно отображает экран только при ожидании ввода пользователя (а сон - это не то же самое, что ожидание ввода), вам также нужно принудительно повторно отобразить. Это необходимо в данном примере (используйте его вместо второго sexp); на практике мне ни разу не приходилось использовать `redisplay '- так что да, это некрасиво, но ...

(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 - Оппс, должно быть неправильно прочитал требования, иначе они изменились на мне. Теперь читает последнюю строку из файла

TheLQ
источник
аккуратный. спасибо за ваш вклад.
Брок Вульф
Шаг 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: Пришлось показать операцию добавления. Вот почему я сделал это так.
missingfaktor
@Radtoo: Посмотрев на другие ответы в этой теме, я наконец решил включить этот способ в свой ответ. Проверь это. (Я не удалял исходный код.)
missingfaktor
@Missing Faktor, getLines().toList()должен быть getLines().toSeqленивый?
Элазар Лейбович
@Elazar: Хорошее предложение. Спасибо. :)
missingfaktor
11

Groovy

new File("fileio.txt").with { 
    write  "hello\n"
    append "world\n"   
    println secondLine = readLines()[1]
}
Уэйн Кинан
источник
спасибо за участие.
Брок Вульф
3
Вы изменяете "мир \ n". Это не добавление, это просто запись в тот же файловый дескриптор.
OTZ
Третье уточнение в исходном сообщении гласит: «Вам не нужно повторно открывать текстовый файл после написания первой строки»
Уэйн Кинан,