Это должен быть общий вопрос, который время от времени задают все программисты. Как прочитать строку из текстового файла? Тогда следующий вопрос: как мне его написать?
Конечно, большинство из вас используют высокоуровневую структуру в повседневном программировании (которую можно использовать в ответах), но иногда приятно знать, как это делать и на низком уровне.
Я сам знаю , как сделать это в C
, C++
и Objective-C
, но он уверен , было бы удобно , чтобы увидеть , как это делается во всех популярных языках, если только , чтобы помочь нам сделать лучшее решение о том, что язык , чтобы сделать наш файл ИО. В частности , Я думаю , было бы интересно посмотреть , как его сделали на языках манипуляций со строками, как: python
, ruby
и, конечно же perl
.
Итак, я полагаю, что здесь мы можем создать ресурс сообщества, который мы все можем пометить в наших профилях и ссылаться, когда нам нужно выполнить файловый ввод-вывод на каком-то новом языке. Не говоря уже о том, что мы все столкнемся с языками, с которыми мы не сталкиваемся каждый день.
Вот как вам нужно ответить:
- Создайте новый текстовый файл с именем " fileio.txt "
- Напишите в текстовом файле первую строку «привет».
- Добавьте в текстовый файл вторую строку «world».
- Прочтите вторую строку «world» во входной строке.
- Распечатайте строку ввода в консоль.
Разъяснение:
- Вы должны показать, как это сделать, только на одном языке программирования за каждый ответ.
- Предположим, что текстовый файл заранее не существует
- Вам не нужно повторно открывать текстовый файл после написания первой строки
Нет особых ограничений по языку.
C
, C++
, C#
, Java
, Objective-C
Все замечательно.
Если вы знаете , как сделать это в Prolog
, Haskell
, Fortran
, Lisp
, или Basic
, пожалуйста , идите прямо вперед.
источник
Ответы:
Python 3
Разъяснения
readlines () возвращает список всех строк в файле. Следовательно, вызов readlines () приводит к чтению каждой строки файла. В этом конкретном случае можно использовать readlines (), потому что мы все равно должны прочитать весь файл (нам нужна его последняя строка). Но если наш файл содержит много строк, и мы просто хотим распечатать его n-ю строку, нет необходимости читать весь файл. Вот несколько лучших способов получить n-ю строку файла в Python: Что заменяет xreadlines () в Python 3? ,
Что это с заявлением? Оператор with запускает блок кода, в котором вы можете использовать переменную f в качестве объекта потока, возвращаемого вызовом open (). Когда блок with заканчивается, python автоматически вызывает f.close (). Это гарантирует, что файл будет закрыт при выходе из блока with независимо от того, как и когда вы выйдете из блока (даже если вы выйдете из него через необработанное исключение). Вы можете вызвать f.close () явно, но что, если ваш код вызывает исключение, а вы не перейдете к вызову f.close ()? Вот почему полезно использовать оператор with.
Вам не нужно повторно открывать файл перед каждой операцией. Вы можете написать весь код внутри одного с блоком.
Я использовал три блока with, чтобы подчеркнуть разницу между тремя операциями: запись (режим 'w'), добавление (режим 'a'), чтение (режим 'r', по умолчанию).
источник
readlines()[1]
пример кода. В этом случае вы можете знать, что файл состоит только из двух строк, но кто-то другой, беспечно полагающий, что это хорошее решение, может попробовать его в файле с миллионами строк и получить довольно неприятный сюрприз.readlines()
возврата итератора (не списка) Просто примечание: вы обычно не можете индексировать итератор.range
объекта есть специальная поддержка индексации, которая выполняется в O (1).LOLCODE
Характеристики , мягко говоря, отрывочные, но я сделал все, что мог. Пусть начнется голосование против! :) Я до сих пор считаю это забавным упражнением.
источник
Brain *** к
источник
Кобол
Поскольку никто другой не сделал ...
источник
Haskell
Если вы просто хотите прочитать / записать файл:
источник
IO a
, который имеет специальную поддержку компилятора для побочных эффектов. (Чистота сохраняется в другом месте, потому что все, что выполняет или наблюдает побочный эффект, относится к типуIO a
, поэтому система типов гарантирует, что остальная часть вашей программы остается чистой.)IO
это монада, но побочные эффекты ей разрешены не поэтому. Быть монадой - вот что позволяет вам написать этот императивно выглядящий синтаксис: он также гарантирует (также с поддержкой специального языка), что побочные эффекты происходят в разумном порядке, поэтому вы не читаете из файла, прежде чем писать в него, и т. .D
источник
Рубин
источник
File.open
с блоком файл открывается, передается в блок, а затем автоматически закрывается.C #
File.ReadLines(path).ElementAt(1)
есть только .Net 4.0, альтернативой являетсяFile.ReadAllLines(path)[1]
анализ всего файла в массив.источник
ANSI C
источник
Сценарий оболочки (UNIX)
На самом деле
sed -n "2p"
часть печатает вторую строку, но вопрос требует, чтобы вторая строка была сохранена в переменной, а затем распечатана, поэтому ... :)источник
sed
), здесь: stackoverflow.com/questions/3538156/…LINE=`foo`
фиксирует выводfoo
в переменнуюLINE
.ассемблер x86 (NASM) в Linux
Я не трогал asm 7 лет, поэтому мне пришлось немного использовать Google, чтобы взломать это вместе, но все же он работает;) Я знаю, что это не на 100% правильно, но эй: D
ОК, не работает. извините за это. в то время как он печатает
world
в конце, он печатает его не из файла, а из файла,ecx
который установлен в строке 27.Использованные ссылки: 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
источник
JavaScript - node.js
Во-первых, множество вложенных обратных вызовов.
Немного чище:
источник
node.js
платформы. См. Nodejs.orgCommon Lisp
источник
PowerShell
источник
gc
вместоcat
имеет смысл :-)get-alias
дало мнеcat
первое (я мало использую PowerShell).Сценарий оболочки
Вот сценарий оболочки, использующий только встроенные команды, а не вызывающие внешние команды, такие как
sed
или,tail
как это делали предыдущие ответы.При написании важных сценариев оболочки рекомендуется использовать как можно больше встроенных функций, поскольку создание отдельного процесса может быть медленным; Судя по быстрому тесту на моей машине,
sed
решение примерно в 20 раз медленнее, чем при использованииread
. Если вы собираетесь позвонитьsed
один раз, как в этом случае, на самом деле это не имеет большого значения, так как он будет выполняться быстрее, чем вы можете заметить, но если вы собираетесь выполнить его сотни или тысячи раз, это может складывать.Для тех , кто не знаком с синтаксисом,
{
и}
выполнить список команд в среде текущей оболочки (в противоположность(
и)
которые создают подоболочку, мы должны работать в среде текущей оболочки, так что мы можем использовать значение переменной позже) , Нам нужно сгруппировать команды вместе, чтобы они обе работали с одним входным потоком, созданным путем перенаправления изfileio.txt
; если бы мы просто запустилиread < fileio.txt; read input < fileio.txt
, мы бы просто получили первую строку, так как файл был бы закрыт и снова открыт между двумя командами. Из-за идиосинкразии синтаксиса оболочки ({
и}
это зарезервированные слова, а не метасимволы), нам нужно разделить{
и}
от остальных команд с пробелами и завершите список команд символом;
.read
Встроенный принимает в качестве аргумента имена переменных для чтения в. Он потребляет строку ввода, разбивает ввод на пробелы (технически, он разбивает его в соответствии с содержимым$IFS
, которое по умолчанию является символом пробела, где символ пробела означает разделение его на любое из пробелов, табуляции или новой строки), назначает каждое слово присваивается именам переменных, указанным по порядку, а остаток строки присваивается последней переменной. Поскольку мы просто предоставляем одну переменную, она просто помещает в нее всю строку. Мы повторно используем$input
переменную, поскольку нам все равно, что находится в первой строке (если мы используем Bash, мы могли бы просто не указывать имя переменной, но для обеспечения переносимости вы всегда должны указывать хотя бы одно имя).Обратите внимание, что, хотя вы можете читать строки по одной, как я здесь, гораздо более распространенным шаблоном было бы заключить их в цикл while:
источник
Clojure
Или, что то же самое, с помощью макроса threading
->
(также известного как средство удаления пареной):источник
spit
это действительно имя функции записи в файл?F #
источник
Бейсик
Я не использовал BASIC почти 10 лет, но этот вопрос дал мне повод быстро освежить свои знания. :)
источник
Objective-C
источник
Perl
источник
perl -we 'for (q{ps aux |}){ open _; print <_>; }'
Р:
источник
PHP
источник
?>
: framework.zend.com/manual/en/…Ява
источник
C ++
или несколько менее педантично,
источник
<limits>
чтобы сказать,ignore
что нет ограничений на размер строки.Идти
источник
os.O_RDWR | os.O_CREATE, 0666
мусор нужен даже для базового файлового ввода-вывода в Go?Erlang
Наверное, не самый идиоматичный Эрланг, но:
источник
Emacs Lisp
Несмотря на то, что некоторые говорят, что Emacs - это в основном текстовый редактор [1]. Итак, хотя Emacs Lisp можно использовать для решения всех видов проблем, он оптимизирован для нужд текстового редактора. Поскольку текстовые редакторы (очевидно) имеют довольно специфические потребности, когда дело доходит до обработки файлов, это влияет на функциональность, связанную с файлами, которую предлагает Emacs Lisp.
В основном это означает, что Emacs Lisp не предлагает функций для открытия файла как потока и чтения его по частям. Точно так же вы не можете добавить файл, не загрузив сначала весь файл. Вместо этого файл полностью [2] считывается в буфер [3], редактируется и затем снова сохраняется в файл.
Для обязательных задач вы должны использовать Emacs Lisp, поскольку это подходит, и если вы хотите сделать что-то, что не требует редактирования, можно использовать те же функции.
Если вы хотите добавлять в файл снова и снова, это связано с огромными накладными расходами, но это возможно, как показано здесь. На практике вы обычно завершаете внесение изменений в буфер вручную или программно перед записью в файл (просто объедините первые два s-выражения в примере ниже).
[1] По крайней мере, я бы не стал называть это ОС; альтернативный интерфейс да, ОС нет.
[2] Вы можете загружать только части файла, но это можно указывать только побайтно.
[3] Буфер - это и тип данных, чем-то похожий на строку, а также на «то, что вы видите при редактировании файла». При редактировании буфер отображается в окне, но не обязательно, чтобы буферы были видны пользователю.
Изменить: если вы хотите, чтобы текст вставлялся в буфер, вы, очевидно, должны сделать его видимым и спать между действиями. Поскольку Emacs обычно повторно отображает экран только при ожидании ввода пользователя (а сон - это не то же самое, что ожидание ввода), вам также нужно принудительно повторно отобразить. Это необходимо в данном примере (используйте его вместо второго sexp); на практике мне ни разу не приходилось использовать `redisplay '- так что да, это некрасиво, но ...
источник
Пакетные файлы Windows - Версия №2
Чтобы объяснить этот последний ужасный цикл поиска, он предполагает, что в файле есть только мир приветствия (новой строки). Таким образом, он просто пропускает первую строку и отображает только вторую.
Изменения
2 - Оппс, должно быть неправильно прочитал требования, иначе они изменились на мне. Теперь читает последнюю строку из файла
источник
Scala:
Используя стандартную библиотеку:
Использование библиотеки Scala-ARM Джоша Суэрета :
Поскольку многие люди использовали один и тот же дескриптор файла для записи двух строк, я также включаю этот способ в свой ответ.
Используя стандартную библиотеку:
Использование библиотеки Scala-ARM Джоша Суэрета :
источник
getLines().toList()
должен бытьgetLines().toSeq
ленивый?Groovy
источник