я загрузил файл в 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
Это возможно, если ваш текстовый редактор записывает в временный файл, а затем переименовывает его поверх 'somefile.txt'. В этом случае все существующие дескрипторы все равно будут ссылаться на (теперь безымянный) старый файл. – melpomene
Хорошо, я изменил вопрос с более конкретным сценарием – CeilingHoles
Как вы используете 'cat'? 'cat' записывает только на стандартный вывод, поэтому он не изменит файл, если вы не перенаправите stdout из' cat' в файл. –