Здесь по умолчанию используется openmode: ios::in — иными словами ios::binary не встановлен и будет использоваться text stream
Тогда почему на Outpute я получаю символы
без '\n' ?
Используя while(!ifInput.eof()) ты рискуешь получить бесконечный цикл, т.к. если по каким-то
причинам символ прочитан не будет до достижения конца файла, eof так и не взведется. Лучше
проверять так:
while(ifInput >> chReadByte)
cout << chReadByte;
p> Output: p>
p> 481114311223221314
p>
ifInput >> chReadByte; пропускает все пробельные символы, поэтому после cout << chReadByte;
ты получаешь то же, что на входе, но без пробелов, табуляций, переносов строк и т.п.
Чтобы получить все с пробелами используй метод ifInput.get():
int c;
while ((c = ifInput.get()) != std::char_traits<char>::eof())
cout << char(c);
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>ifInput >> chReadByte; пропускает все пробельные символы, поэтому после cout << chReadByte; ПК>ты получаешь то же, что на входе, но без пробелов, табуляций, переносов строк и т.п. ПК>Чтобы получить все с пробелами используй метод ifInput.get():
здесь все понятно
остоятся только загадкой, в каких ситуация влеяеет установленый флажок ? ios::binary:
при иcпользование get всегда читаются '\n' и им подобные espace-символы
при использование оператора >> наоборот всегда не читаются
так какае здесь роль ios:binary?
Здравствуйте, Kluev, Вы писали:
K>Здравствуйте, promko, Вы писали:
P>>Тогда почему на Outpute я получаю символы P>>без '\n' ?
K>Потому, что std::stream-ы самые бесполезные классы в C++ K>Кроме hellow word больше ни на что не годятся
Очень спорное заявление. Основное назначение потоков — форматированный ввод/вывод. Самая распространенная ошибка, возникающая из-за непонимания назначения потоков — попытка использовать потоковые операторы << >> для бинарного ввода/вывода.
P.S. Я не знаю, что бы я делал без std::stringstream, boost::format, boost::lexical_cast<>.
Кроме преобразования символов конца строки режимы text и binary отличаются еще "завершающимся" символом. Исторически сложилось, что символ 0xFF — это конец потока. Если файл открыт в режиме text и в нем есть этот символ, что поток на нем и прервется.
P>>так какае здесь роль ios:binary?
D>Кроме преобразования символов конца строки режимы text и binary отличаются еще "завершающимся" символом. Исторически сложилось, что символ 0xFF — это конец потока. Если файл открыт в режиме text и в нем есть этот символ, что поток на нем и прервется.
Нет. Разница text и binary mode в том, что в windows в text mode '\n' будет заменяться на "\r\n".
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, deviv, Вы писали:
P>>>так какае здесь роль ios:binary?
D>>Кроме преобразования символов конца строки режимы text и binary отличаются еще "завершающимся" символом. Исторически сложилось, что символ 0xFF — это конец потока. Если файл открыт в режиме text и в нем есть этот символ, что поток на нем и прервется.
ME>Нет. Разница text и binary mode в том, что в windows в text mode '\n' будет заменяться на "\r\n".
Правильно. Но это только одно отличие. Второе я описал выше...
Здравствуйте, deviv, Вы писали:
P>>>>так какае здесь роль ios:binary?
D>>>Кроме преобразования символов конца строки режимы text и binary отличаются еще "завершающимся" символом. Исторически сложилось, что символ 0xFF — это конец потока. Если файл открыт в режиме text и в нем есть этот символ, что поток на нем и прервется.
ME>>Нет. Разница text и binary mode в том, что в windows в text mode '\n' будет заменяться на "\r\n".
D>Правильно. Но это только одно отличие. Второе я описал выше...
Нет. Символ конца — это:
int_type char_traits::eof();
char_traits<> специализирован для char и wchar_t, и для них eof() возвращает int(-1), т.е. 0xffffffff. Символ сравнивается с eof() примерно так:
int_type char_traits<>::to_int_type() для char(0xff) == int(0x000000ff), а для wchar_t(0xffff) == int(0x0000ffff), т.е. оба этих значения никогда не равны eof().
Проблема с остановкой чтения файла при достижении первого 0xff или 0xffff может появиться только тогда, когда используются типы, для которых неспециализирован char_traits<> (например для basic_streambuf<unsigned char>).
Здравствуйте, Kluev, Вы писали:
P>>Тогда почему на Outpute я получаю символы P>>без '\n' ?
K>Потому, что std::stream-ы самые бесполезные классы в C++ K>Кроме hellow word больше ни на что не годятся
Для бинарного ввода-вывода потоки тоже очень неплохо подходят, только в этом случае read/write использовать удобнее. Зато можно абстрагироваиться от того, куда выводишь — в файл, в память (чтоб потом в реестр записать, например), или в комовский IStream.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, MaximE, Вы писали:
ME>Нет. Разница text и binary mode в том, что в windows в text mode '\n' будет заменяться на "\r\n".
Можно ли счетать что '\r' имеет значение только на UNIX машинах,
что строчный литерал "\r\n" используется для того чтобы он правильно
распознавался на разных платформах?
Здравствуйте, MaximE, Вы писали:
ME>Проблема с остановкой чтения файла при достижении первого 0xff или 0xffff может появиться только тогда, когда используются типы, для которых неспециализирован char_traits<> (например для basic_streambuf<unsigned char>).
Вынужден снять свои возражения
Спасибо за столь обстоятельный ответ.
Здравствуйте, promko, Вы писали:
P>Здравствуйте, MaximE, Вы писали:
ME>>Нет. Разница text и binary mode в том, что в windows в text mode '\n' будет заменяться на "\r\n". P>Можно ли счетать что '\r' имеет значение только на UNIX машинах, P>что строчный литерал "\r\n" используется для того чтобы он правильно P>распознавался на разных платформах?
Нет.
'\r' означает "возврат каретки"
'\n' означает "перевод на новую строку"
То, что в Windows '\n' реализуется двумя символами — это особенность конкретной платформы.
Так "\r\n" будет переводиться в "\x0D\x0D\0x0A" в Windows,
и в "\x0D\x0A" в Unix.
Здравствуйте, deviv, Вы писали:
D>Здравствуйте, MaximE, Вы писали:
ME>>Проблема с остановкой чтения файла при достижении первого 0xff или 0xffff может появиться только тогда, когда используются типы, для которых неспециализирован char_traits<> (например для basic_streambuf<unsigned char>).
D>Вынужден снять свои возражения D>Спасибо за столь обстоятельный ответ.
В противном случае std::basic_istream<> и std::basic_streambuf<> были бы абсолютно бесполезны