Я работал над совершенствованием эмулятора DOS и внезапно обнаружил, что достаточно тривиальная операция работает неправильно. Когда просишь COMMAND.COM сделать следующее:
echo AB> foo.txt
echo CD>> foo.txt
то вместо ABCD в файл foo.txt записывается ABBC.
Я проверил и убедился, что
fwrite()
действительно передаются правильные данные, но хитрость в том, что действия COMMAND.COM не так просты, как можно подумать:- Открываем foo.txt
- Записываем «AB»
- Закрываем foo.txt
- Открываем foo.txt
- Выполняем поиск на один байт назад от конца файла
- Считываем один байт
- Записываем «CD»
- Закрываем foo.txt
Такая сложность нужна, потому что COMMAND.COM хочет учесть случай, когда файл заканчивается символом Ctrl-Z (в нашем случае его нет): в этом случае Ctrl-Z необходимо удалить. Почему-то последовательность «поиск-чтение-запись» работала странно. Но почему?