Извините за частичное совпадение с другими ответами, но ради полноты:
Миф: endl
является «более переносимым», так как записывает окончание строки в зависимости от платформысоглашение.
Правда: endl
определено для записи '\ n' в поток, а затем вызова flush
.Так что на самом деле вы почти никогда не хотите его использовать.
Заблуждение: Вы должны открывать файлы в текстовом режиме для записи текста и в двоичном режиме для записи двоичных данных.
Правда: Текстовый режим существует в первую очередь потому, что некоторое время назад существовали файловые системы, которые различали текстовые файлы и двоичные файлы.Это больше не верно для любой здравомыслящей платформы, которую я знаю.Вы также можете писать текст в бинарные файлы.Фактически это то, что вы хотите сделать, так как он имеет более определенную семантику и приводит к более переносимому коду.Обратите внимание, что POSIX не не различает двоичный и текстовый режим.
Как сделать текст: Откройте все в двоичном режиме и используйте обычный старый \ n,Вам также нужно будет позаботиться о кодировке.Стандартизировать UTF-8 для Unicode-корректности. Используйте для внутреннего использования узкие строки в кодировке UTF-8 вместо wchar_t
, который отличается на разных платформах.Ваш код станет проще для переноса.
Совет: Вы можете заставить MSVC по умолчанию открывать все файлы в двоичном режиме.Он должен работать следующим образом:
#include <stdio.h>
#include <iostream>
int main() {
_fmode = _O_BINARY;
std::ofstream f("a.txt"); // opens in binary mode
}
В качестве альтернативы используйте любой из способов , описанных здесь .