2016-06-05 1 views
2

я загрузил файл в GHCI со следующим:Почему параметр Haskell NoBuffering по-прежнему кажется буферным?

h <- openFile "somefile.txt" ReadMode 
hSetBuffering h NoBuffering 

Я тогда изменен и сохранен somefile.txt в текстовом редакторе. Когда я вызываю hGetChar несколько раз в ghci, я получаю старые символы файла (как будто весь файл был буферизирован, когда я его открыл). Я ожидал, что вызовет hGetChar, чтобы вернуть измененное содержимое. Почему это не так?

Редактировать: Причина, по которой она не отображает измененное содержимое в случае, описанном выше, действительно из-за текстового редактора. Если вместо этого используется команда cat (cat> somefile.txt), то возвращается измененное содержимое файла.

Однако он все еще, кажется, выполняет буферизацию. Скажем, содержимое файла выглядит следующим образом:

ABCDEFGHI 
123456789 

Если я бегу hGetChar я получаю «A», как и ожидалось.

Теперь, если я использую кошку (кошка> Somefile.txt), чтобы изменить содержимое к следующему, и снова запустить hGetChar, я бы ожидать, «Z», но это возвращение «B»:

AZZZZZZZZ 
+3

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

+0

Хорошо, я изменил вопрос с более конкретным сценарием – CeilingHoles

+1

Как вы используете 'cat'? 'cat' записывает только на стандартный вывод, поэтому он не изменит файл, если вы не перенаправите stdout из' cat' в файл. –

ответ

1

BufferMode применим только при записи на ручку, а не при чтении.

От [note Buffered Reading] в GHC.IO.Handle.Types:

Note that the buffering mode (haBufferMode) makes no difference when 
reading data into a Handle. When reading, we can always just read all 
the data there is available without blocking, decode it into the Char 
buffer, and then provide it immediately to the caller. 

документация для ввода BufferMode кажется устаревшим.

Смежные вопросы