Почему должен я .read () файл, который я написал перед способностью на самом деле произвести содержание к терминалу?

Я изучаю Руби и связываюсь с чтением/письмом файлов прямо сейчас. Когда я создаю файл, 'имя файла', я могу написать ему с .write() метод. Однако я не могу произвести содержание к терминалу, не вновь открыв его после управления .read() на нем (см. линию 8: помещает write_txt.read() ). Я попробовал бегущую линию 8 многократно, но все, что делает, произведено больше пустых строк. Без линии 8, помещает txt.read() просто производит пустую строку. Следующий код также работает без , помещает в линии 8 (просто write_txt.read() )

# Unpacks first argument to 'filename'
filename = ARGV.first

# Lets write try writing to a file
write_txt = File.new(filename, 'w+')
write_txt.write("OMG I wrote this file!\nHow cool is that?")
# This outputs a blank line THIS IS THE LINE IN QUESTION
puts write_txt.read()

txt = File.open(filename)
# This actually outputs the text that I wrote
puts txt.read()

Почему это необходимо? Почему файл, который был ясно написан тому, чтобы быть прочитанным столь же чистый, пока он не вновь открыт, будучи прочитанным как бланк, по крайней мере, однажды?

3
добавлено
Просмотры: 1
de

3 ответы

Когда вы читаете или пишете файлу, есть внутренний указатель, названный "курсором", который отслеживает то, где в файле вы в настоящее время. Когда вы пишете файл, курсор установлен в пункт после последнего байта, который вы написали, так, чтобы, если вы выступаете дополнительный, написал, они происходят после того, как ваши предыдущие пишут (а не сверху его). Когда вы выполняете прочитанный, вы читаете от текущего положения до конца файла, который... ничего не содержит!

Можно открыть файл (позиция курсора 0), затем написать, что последовательность "Привет" (позиция курсора 6), и пытающийся читать от курсора заставит Руби говорить, "О, эй, больше нет содержания в этом файле прошлой позиции курсора 6" и просто не возвратит пустую строку.

Можно перемотать курсор файла с IO#rewind , чтобы перезагрузить курсор к началу файла. Можно тогда прочитать файл (который будет читать от курсора до конца файла), обычно.

Обратите внимание, что, если вы выступаете, любой пишет после перемотки, вы перепишете свое ранее написанное содержание.

# Unpacks first argument to 'filename'
filename = ARGV.first

# Lets write try writing to a file
write_txt = File.new(filename, 'w+')
write_txt.write("OMG I wrote this file!\nHow cool is that?")

write_txt.rewind
puts write_txt.read()

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

5
добавлено
Ничего себе, Спасибо! После чтения этого я играл с кодом и думал, что могло бы быть полезно добавить, что каждый указывает/добавляет один вопрос. Обе перемотки (как упомянуто) и закрытие write_txt делают его так, Линия 8 не необходима для курсора, чтобы перезагрузить, когда файл вновь открыт с новой ручкой (не уверенный, что я использую то право термина; я обращаюсь к txt назначение). Вопрос: почему действительно Выравнивает 8, перезагружает курсор для новой ручки, но не для оригинальной ручки? Почему это перезагружает курсор вообще?
добавлено автор mattmattmatt, источник
Если вы управляете кодом, я первоначально имел без Линии 8, помещает txt.read() </ код> производит пустую строку, как будто курсор в конце файла. Это решено или включением линии 8 или перемоткой/закрытием write_txt . Если второй дескриптор файла начинается в начале файла, то, почему это происходит? Спасибо за всю вашу помощь, Криса, я изучаю много!
добавлено автор mattmattmatt, источник
You' ре, открывающееся второй дескриптор файла там, не перезагружая первое. Когда вы открываете новую ручку, она начинается в начале файла. У каждого дескриптора файла есть курсор, таким образом, у вас может быть столько же дескрипторов файлов, открытых для данного файла сколько you' d как, с их курсорами в различных положениях, независимых друг от друга.
добавлено автор Chris Heald, источник

Когда вы читаете или пишете файлу, есть внутренний указатель, названный "курсором", который отслеживает то, где в файле вы в настоящее время. Когда вы пишете файл, курсор установлен в пункт после последнего байта, который вы написали, так, чтобы, если вы выступаете дополнительный, написал, они происходят после того, как ваши предыдущие пишут (а не сверху его). Когда вы выполняете прочитанный, вы читаете от текущего положения до конца файла, который... ничего не содержит!

Можно открыть файл (позиция курсора 0), затем написать, что последовательность "Привет" (позиция курсора 6), и пытающийся читать от курсора заставит Руби говорить, "О, эй, больше нет содержания в этом файле прошлой позиции курсора 6" и просто не возвратит пустую строку.

Можно перемотать курсор файла с IO#rewind , чтобы перезагрузить курсор к началу файла. Можно тогда прочитать файл (который будет читать от курсора до конца файла), обычно.

Обратите внимание, что, если вы выступаете, любой пишет после перемотки, вы перепишете свое ранее написанное содержание.

# Unpacks first argument to 'filename'
filename = ARGV.first

# Lets write try writing to a file
write_txt = File.new(filename, 'w+')
write_txt.write("OMG I wrote this file!\nHow cool is that?")

write_txt.rewind
puts write_txt.read()

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

5
добавлено
Ничего себе, Спасибо! После чтения этого я играл с кодом и думал, что могло бы быть полезно добавить, что каждый указывает/добавляет один вопрос. Обе перемотки (как упомянуто) и закрытие write_txt делают его так, Линия 8 не необходима для курсора, чтобы перезагрузить, когда файл вновь открыт с новой ручкой (не уверенный, что я использую то право термина; я обращаюсь к txt назначение). Вопрос: почему действительно Выравнивает 8, перезагружает курсор для новой ручки, но не для оригинальной ручки? Почему это перезагружает курсор вообще?
добавлено автор mattmattmatt, источник
Если вы управляете кодом, я первоначально имел без Линии 8, помещает txt.read() </ код> производит пустую строку, как будто курсор в конце файла. Это решено или включением линии 8 или перемоткой/закрытием write_txt . Если второй дескриптор файла начинается в начале файла, то, почему это происходит? Спасибо за всю вашу помощь, Криса, я изучаю много!
добавлено автор mattmattmatt, источник
You' ре, открывающееся второй дескриптор файла там, не перезагружая первое. Когда вы открываете новую ручку, она начинается в начале файла. У каждого дескриптора файла есть курсор, таким образом, у вас может быть столько же дескрипторов файлов, открытых для данного файла сколько you' d как, с их курсорами в различных положениях, независимых друг от друга.
добавлено автор Chris Heald, источник

Продукция не обязательно немедленно написана файлу. Кроме того, указатель в конце файла, если вы хотите читать, в то время как в прочитанном режиме записи необходимо перезагрузить его. Можно просто близко , если вы хотите вновь открыть его для чтения. Попробуйте:

write_txt.write("OMG I wrote this file!\nHow cool is that?")
# This outputs a blank line THIS IS THE LINE IN QUESTION
write_txt.close
txt = File.open(filename)
puts txt.read()
0
добавлено