STL:потоки
От: Гомон Игорь Викторович Украина  
Дата: 08.05.02 06:23
Оценка:
Привет всем.
У меня возникли проблемы при работе с файловыми потоками в режиме 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 и чем он отличается от простого текстового режима?
Заранее спасибо.
Re: STL:потоки
От: Кодт Россия  
Дата: 08.05.02 06:53
Оценка: 3 (1)
Здравствуйте Гомон Игорь Викторович

ГИВ>Так вот проблема в том, что я хочу чтобы при записи в поток числа 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).
Перекуём баги на фичи!
Re[2]: STL:потоки
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 08.05.02 07:18
Оценка: 3 (1)
К>Если нужно выводить бинарные данные — пользуйтесь неформатированным выводом (методом write).

вот тут еще посмотри, может что полезное извлекёшь:

http://www.rsdn.ru/forum/message.asp?mid=22329
Автор: retalik
Дата: 17.01.02
Re[2]: STL:потоки
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 08.05.02 08:51
Оценка:
Здравствуйте Кодт, Вы писали:

К>binary | text — отличаются тем, что text интерпретирует перевод строки.

К>Т.е. одиночный LF ('\n', endl) приводится к стандарту операционной системы.
К>Под Dos|Windows это CR-LF ("\r\n"), под *nix — одиночный LF.

Кроме различия в переводе строки, также может отличаться маркер конца файла.

Так под Dos|Windows для текстового файла, концом файла является не только физический конец файла, но и символ с кодом 26(0x1A).
Re[3]: STL:потоки
От: Zero  
Дата: 08.05.02 09:55
Оценка:
Здравствуйте 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 ) == 'я'. Как с этим бороться если читать файл посимвольно?
Re[4]: STL:потоки
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 08.05.02 10:02
Оценка: 3 (1)
Здравствуйте Zero, Вы писали:


Z>А возвращается EOF c кодом -1 (или 255 ) == 'я'. Как с этим бороться если читать файл посимвольно?


Открой файл в бинарном режиме
Re[5]: STL:потоки
От: Zero  
Дата: 08.05.02 10:07
Оценка:
Здравствуйте DarkGray, Вы писали:

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



Z>>А возвращается EOF c кодом -1 (или 255 ) == 'я'. Как с этим бороться если читать файл посимвольно?


DG>Открой файл в бинарном режиме
Re[5]: STL:потоки
От: Zero  
Дата: 08.05.02 10:27
Оценка:
Здравствуйте DarkGray, Вы писали:

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



Z>>А возвращается EOF c кодом -1 (или 255 ) == 'я'. Как с этим бороться если читать файл посимвольно?


DG>Открой файл в бинарном режиме


Так всё равно будет код EOF и для конца файла и для 'я'. Как это проверить?
Re[6]: STL:потоки
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 08.05.02 10:38
Оценка: 3 (1)
Здравствуйте Zero, Вы писали:

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


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



Z>>>А возвращается EOF c кодом -1 (или 255 ) == 'я'. Как с этим бороться если читать файл посимвольно?


DG>>Открой файл в бинарном режиме


Z>Так всё равно будет код EOF и для конца файла и для 'я'. Как это проверить?


Что-то ты путаешь... или мы говорим о разных вещах

Следующая программа честно выводит символ с кодом 0x1A, а не -1. Только если такой символ в файле был конечно...

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
void main()
{
  std::ifstream ifs ("a.txt", std::ios::binary | std::ios::in);
  for (;!ifs.eof();)
  {
    char ch;
    ifs >> ch;
    std::cout << std::hex << std::setw(2) << std::setfill('0') << (int)ch << " ";

  }
}
Re[4]: STL:потоки
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 08.05.02 12:07
Оценка:
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>) выглядело приблизительно так

 typedef streambuf::traits_type traits_type

 streambuf::int_type  i_c;
 streambuf::char_type c;

 while(!traits_type::eq_int_type(i_c=in_buf.sbumpc(),traits_type::eof()))
 {
  c=ansi_traits_type::to_char_type(i_c);

  //...
 }//while
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.