text stream - not binary
От: promko Украина  
Дата: 08.07.03 16:59
Оценка:
Hello, All!

"alchemy.dat":
4 3 1 4
8
1 1
1 4
3
1 1
2 2 3
2 
2 1 3
1 4


ifstream ifInput("alchemy.dat");

Здесь по умолчанию используется openmode:
ios::in — иными словами ios::binary не встановлен и будет использоваться text stream
Тогда почему на Outpute я получаю символы
без '\n' ?
while(!ifInput.eof()){
ifInput >> chReadByte; 
cout << chReadByte; }

Output:
481114311223221314


With best regards, Roman Panas
Posted via RSDN NNTP Server 1.6
Re: text stream - not binary
От: Павел Кузнецов  
Дата: 08.07.03 17:33
Оценка: 6 (1)
Здравствуйте, promko, Вы писали:

p> "alchemy.dat":

p>
p> 4 3 1 4
p> 8
p>


p>
p> ifstream ifInput("alchemy.dat");
p>


p>
p> while(!ifInput.eof()){
p>   ifInput >> chReadByte;
p> cout << chReadByte; }
p>


Используя 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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: text stream - not binary
От: Павел Кузнецов  
Дата: 08.07.03 17:43
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>
ПК> int c;
ПК> while ((c = ifInput.get()) != std::char_traits<char>::eof())
ПК>   cout << char(c);
ПК>


Или чуть проще:

char c;
while (ifInput.get(c))
  cout << c;
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: text stream - not binary
От: promko Украина  
Дата: 08.07.03 18:07
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>ifInput >> chReadByte; пропускает все пробельные символы, поэтому после cout << chReadByte;

ПК>ты получаешь то же, что на входе, но без пробелов, табуляций, переносов строк и т.п.
ПК>Чтобы получить все с пробелами используй метод ifInput.get():
здесь все понятно
остоятся только загадкой, в каких ситуация влеяеет установленый флажок ?
ios::binary:
ifstream ifInput("alchemy.dat", ios::in|ios::binary);

при иcпользование get всегда читаются '\n' и им подобные espace-символы
при использование оператора >> наоборот всегда не читаются
так какае здесь роль ios:binary?
Re[3]: text stream - not binary
От: Павел Кузнецов  
Дата: 08.07.03 19:26
Оценка:
Здравствуйте, promko, Вы писали:

p> остоятся только загадкой, в каких ситуация влеяеет установленый

p> флажок ? ios::binary:

Преобразование "\r\n" (или "\n\r" ? ) в '\n' при вводе и наоборот
при выводе.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: text stream - not binary
От: Kluev  
Дата: 09.07.03 04:54
Оценка:
Здравствуйте, promko, Вы писали:

P>Тогда почему на Outpute я получаю символы

P>без '\n' ?

Потому, что std::stream-ы самые бесполезные классы в C++
Кроме hellow word больше ни на что не годятся
Re[2]: text stream - not binary
От: MaximE Великобритания  
Дата: 09.07.03 07:23
Оценка:
Здравствуйте, Kluev, Вы писали:

K>Здравствуйте, promko, Вы писали:


P>>Тогда почему на Outpute я получаю символы

P>>без '\n' ?

K>Потому, что std::stream-ы самые бесполезные классы в C++

K>Кроме hellow word больше ни на что не годятся

Очень спорное заявление. Основное назначение потоков — форматированный ввод/вывод. Самая распространенная ошибка, возникающая из-за непонимания назначения потоков — попытка использовать потоковые операторы << >> для бинарного ввода/вывода.

P.S. Я не знаю, что бы я делал без std::stringstream, boost::format, boost::lexical_cast<>.
Re[3]: text stream - not binary
От: deviv  
Дата: 09.07.03 07:24
Оценка:
P>так какае здесь роль ios:binary?

Кроме преобразования символов конца строки режимы text и binary отличаются еще "завершающимся" символом. Исторически сложилось, что символ 0xFF — это конец потока. Если файл открыт в режиме text и в нем есть этот символ, что поток на нем и прервется.
... << RSDN@Home 1.1 beta 1 >>
WBR,
Влад Волосюк
Re[4]: text stream - not binary
От: MaximE Великобритания  
Дата: 09.07.03 07:34
Оценка:
Здравствуйте, deviv, Вы писали:


P>>так какае здесь роль ios:binary?


D>Кроме преобразования символов конца строки режимы text и binary отличаются еще "завершающимся" символом. Исторически сложилось, что символ 0xFF — это конец потока. Если файл открыт в режиме text и в нем есть этот символ, что поток на нем и прервется.


Нет. Разница text и binary mode в том, что в windows в text mode '\n' будет заменяться на "\r\n".
Re[5]: text stream - not binary
От: deviv  
Дата: 09.07.03 07:40
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, deviv, Вы писали:



P>>>так какае здесь роль ios:binary?


D>>Кроме преобразования символов конца строки режимы text и binary отличаются еще "завершающимся" символом. Исторически сложилось, что символ 0xFF — это конец потока. Если файл открыт в режиме text и в нем есть этот символ, что поток на нем и прервется.


ME>Нет. Разница text и binary mode в том, что в windows в text mode '\n' будет заменяться на "\r\n".


Правильно. Но это только одно отличие. Второе я описал выше...
... << RSDN@Home 1.1 beta 1 >>
WBR,
Влад Волосюк
Re[6]: text stream - not binary
От: MaximE Великобритания  
Дата: 09.07.03 08:17
Оценка: 6 (2)
Здравствуйте, 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() примерно так:

template<class C>
bool is_eof(C c)
{
    typedef std::char_traits<C> tr;
    return tr::eq_int_type(tr::eof(), tr::to_int_type(c));
}


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>).
Re[2]: text stream - not binary
От: Sergey Россия  
Дата: 09.07.03 09:23
Оценка:
Здравствуйте, Kluev, Вы писали:

P>>Тогда почему на Outpute я получаю символы

P>>без '\n' ?

K>Потому, что std::stream-ы самые бесполезные классы в C++

K>Кроме hellow word больше ни на что не годятся

Для бинарного ввода-вывода потоки тоже очень неплохо подходят, только в этом случае read/write использовать удобнее. Зато можно абстрагироваиться от того, куда выводишь — в файл, в память (чтоб потом в реестр записать, например), или в комовский IStream.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[5]: \r - только для UNIX?
От: promko Украина  
Дата: 09.07.03 22:23
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Нет. Разница text и binary mode в том, что в windows в text mode '\n' будет заменяться на "\r\n".

Можно ли счетать что '\r' имеет значение только на UNIX машинах,
что строчный литерал "\r\n" используется для того чтобы он правильно
распознавался на разных платформах?
Re[7]: text stream - not binary
От: deviv  
Дата: 10.07.03 06:03
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Проблема с остановкой чтения файла при достижении первого 0xff или 0xffff может появиться только тогда, когда используются типы, для которых неспециализирован char_traits<> (например для basic_streambuf<unsigned char>).


Вынужден снять свои возражения
Спасибо за столь обстоятельный ответ.
... << RSDN@Home 1.1 beta 1 >>

Удалено избыточное цитирование. -- ПК.
WBR,
Влад Волосюк
Re[6]: \r - только для UNIX?
От: deviv  
Дата: 10.07.03 06:24
Оценка:
Здравствуйте, 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.
... << RSDN@Home 1.1 beta 1 >>
WBR,
Влад Волосюк
Re[8]: text stream - not binary
От: MaximE Великобритания  
Дата: 10.07.03 08:29
Оценка:
Здравствуйте, deviv, Вы писали:

D>Здравствуйте, MaximE, Вы писали:


ME>>Проблема с остановкой чтения файла при достижении первого 0xff или 0xffff может появиться только тогда, когда используются типы, для которых неспециализирован char_traits<> (например для basic_streambuf<unsigned char>).


D>Вынужден снять свои возражения

D>Спасибо за столь обстоятельный ответ.

В противном случае std::basic_istream<> и std::basic_streambuf<> были бы абсолютно бесполезны
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.