Привет всем.
У меня возникли проблемы при работе с файловыми потоками в режиме ios_base::binary;
Например, такой вариант:
#include"stdafx.h"#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ofstream of("c:\\test.bak", ios_base::binary | ios_base::out | ios_base::trunc);
if(of)
{
of << 1L << 0L;
of.close();
}
ifstream _if("c:\\test.bak", ios_base::binary | ios_base::in);
if(_if)
{
long first, second;
_if >> first >> second; //получаю first = 10, second - бред;
_if.close();
}
return 0;
}
Так вот проблема в том, что я хочу чтобы при записи в поток числа 1 и 0 записывались именно как два числа типа long, т.е. по четыре байта, а они записываются как текст. (Я открывал файл Notepadom и смотрел там "10"). Как мне записать их в поток правильно, чтобы я мог их считать? Зачем же тогда режим ios_base::binary и чем он отличается от простого текстового режима?
Заранее спасибо.
Здравствуйте Гомон Игорь Викторович
ГИВ>Так вот проблема в том, что я хочу чтобы при записи в поток числа 1 и 0 записывались именно как два числа типа long, т.е. по четыре байта, а они записываются как текст. (Я открывал файл Notepadom и смотрел там "10"). Как мне записать их в поток правильно, чтобы я мог их считать? Зачем же тогда режим ios_base::binary и чем он отличается от простого текстового режима?
binary | text — отличаются тем, что text интерпретирует перевод строки.
Т.е. одиночный LF ('\n', endl) приводится к стандарту операционной системы.
Под Dos|Windows это CR-LF ("\r\n"), под *nix — одиночный LF.
Это не блажь авторов STL: потоки — это обертка к функциям fopen, fprintf и т.п.
Если нужно выводить бинарные данные — пользуйтесь неформатированным выводом (методом write).
Здравствуйте Кодт, Вы писали:
К>binary | text — отличаются тем, что text интерпретирует перевод строки. К>Т.е. одиночный LF ('\n', endl) приводится к стандарту операционной системы. К>Под Dos|Windows это CR-LF ("\r\n"), под *nix — одиночный LF.
Кроме различия в переводе строки, также может отличаться маркер конца файла.
Так под Dos|Windows для текстового файла, концом файла является не только физический конец файла, но и символ с кодом 26(0x1A).
Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте Кодт, Вы писали:
К>>binary | text — отличаются тем, что text интерпретирует перевод строки. К>>Т.е. одиночный LF ('\n', endl) приводится к стандарту операционной системы. К>>Под Dos|Windows это CR-LF ("\r\n"), под *nix — одиночный LF.
DG>Кроме различия в переводе строки, также может отличаться маркер конца файла.
DG>Так под Dos|Windows для текстового файла, концом файла является не только физический конец файла, но и символ с кодом 26(0x1A).
А возвращается EOF c кодом -1 (или 255 ) == 'я'. Как с этим бороться если читать файл посимвольно?
Здравствуйте Zero, Вы писали:
Z>Здравствуйте DarkGray, Вы писали:
DG>>Здравствуйте Zero, Вы писали:
Z>>>А возвращается EOF c кодом -1 (или 255 ) == 'я'. Как с этим бороться если читать файл посимвольно?
DG>>Открой файл в бинарном режиме
Z>Так всё равно будет код EOF и для конца файла и для 'я'. Как это проверить?
Что-то ты путаешь... или мы говорим о разных вещах
Следующая программа честно выводит символ с кодом 0x1A, а не -1. Только если такой символ в файле был конечно...
DG>>Кроме различия в переводе строки, также может отличаться маркер конца файла.
DG>>Так под Dos|Windows для текстового файла, концом файла является не только физический конец файла, но и символ с кодом 26(0x1A).
Z>А возвращается EOF c кодом -1 (или 255 ) == 'я'. Как с этим бороться если читать файл посимвольно?
Я на днях этот вопрос копал по крупному (Rogue Wave STL из BCB3/5) и выяснил, что в качестве eof==(-1) тебе возвращается traits_type::eof() с типом trats_type::int_type - что не тоже самое что traits_type::char_type
в частности бинарное чтение (через basic_streambuf<char>) выглядело приблизительно так