basic_istream >> string
От: loknalori Россия  
Дата: 14.07.08 14:07
Оценка:
Есть basic_istream (по честному — это stringstream), надо вычитать из него ЗАДАННОЕ колличество символов и отправить в строку.

Выражение basic_istream >> string не катит т.к. вычитается произвольное колл-во символов, промежуточный буфер тоже не катит,
а запись вида
str.resize(4);//Не обязательно так, но суть такова
stream.read(&str[0],4);

тоже не катит, т.к. на ресайзинге может кто-то поправить значение, да и вобще криво с элементами контейнеров на прямую работать.

Как быть?
Re: basic_istream >> string
От: Conr Россия  
Дата: 14.07.08 14:16
Оценка:
Здравствуйте, loknalori, Вы писали:

L>Выражение basic_istream >> string не катит т.к. вычитается произвольное колл-во символов, промежуточный буфер тоже не катит,

L>а запись вида
L>
L>str.resize(4);//Не обязательно так, но суть такова
L>stream.read(&str[0],4);
L>

L>тоже не катит, т.к. на ресайзинге может кто-то поправить значение, да и вобще криво с элементами контейнеров на прямую работать.

L>Как быть?
    std::istream_iterator<unsigned char> iter(stream);

    int count = 4;
    while( count-- )
        str += *iter++;
Re: basic_istream >> string
От: ulong Россия  
Дата: 14.07.08 16:51
Оценка:
с извращениями вариант:

namespace use_fixed_str
{
    std::basic_istream<char>& operator>>( std::basic_istream<char>& stream, std::string& str )
    {
        for( std::string::iterator it = str.begin(); str.end() != it; ++ it )
        {
            stream >> *it;
        }
        return stream;
    }
};

....

std::string str;
std::cin >> str; // читаем всю строку
using namespace use_fixed_str;
str.resize( 4 );
std::cin >> str; // читаем по 4 символа
std::cin >> str;
Re: basic_istream >> string
От: Vamp Россия  
Дата: 14.07.08 20:05
Оценка:
L>Как быть?
Мне кажется, неправильно выбран тип контейнера. Если вам требуется прочесть 4 и только четыре символа, то это не строка в общепринятом смысле. Это некая последовательность символов, и значит, хранить их нужно в vector<char> и пользоваться для чтения функцией read.
Да здравствует мыло душистое и веревка пушистая.
Re: basic_istream >> string
От: Аноним  
Дата: 15.07.08 06:59
Оценка:
Здравствуйте, loknalori, Вы писали:

L>Есть basic_istream (по честному — это stringstream), надо вычитать из него ЗАДАННОЕ колличество символов и отправить в строку.


L>Выражение basic_istream >> string не катит т.к. вычитается произвольное колл-во символов, промежуточный буфер тоже не катит,

L>а запись вида
L>
L>str.resize(4);//Не обязательно так, но суть такова
L>stream.read(&str[0],4);
L>

L>тоже не катит, т.к. на ресайзинге может кто-то поправить значение, да и вобще криво с элементами контейнеров на прямую работать.

L>Как быть?


мысль возникла: а может подойдёт переделка std::getline() ?
тока поменять _Delim на количество, типа так:

template<class _Elem,
class _Traits,
class _Alloc> inline
    basic_istream<_Elem, _Traits>& __CLRCALL_OR_CDECL get_nchars_line(
    basic_istream<_Elem, _Traits>& _Istr,
    basic_string<_Elem, _Traits, _Alloc>& _Str,
    const size_t _Count)
Re[2]: basic_istream >> string
От: loknalori Россия  
Дата: 15.07.08 07:08
Оценка:
Здравствуйте, Vamp, Вы писали:

L>>Как быть?

V>Мне кажется, неправильно выбран тип контейнера. Если вам требуется прочесть 4 и только четыре символа, то это не строка в общепринятом смысле. Это некая последовательность символов, и значит, хранить их нужно в vector<char> и пользоваться для чтения функцией read.
Все правильно. Так и есть. Но после введения контейнера , к примеру вектор, вам придется совершать определенные телодвижения по преобразования в строку в общепринятом смысле. А эти телодвижения, тоже, чего-то стоят.

Вобщем вопрос достойный обсуждения, но конкретно я решил этот вопрос в сторону стринга
Re[3]: basic_istream >> string
От: Conr Россия  
Дата: 15.07.08 09:31
Оценка:
Здравствуйте, loknalori, Вы писали:

V>>Мне кажется, неправильно выбран тип контейнера. Если вам требуется прочесть 4 и только четыре символа, то это не строка в общепринятом смысле. Это некая последовательность символов, и значит, хранить их нужно в vector<char> и пользоваться для чтения функцией read.

L>Все правильно. Так и есть. Но после введения контейнера , к примеру вектор, вам придется совершать определенные телодвижения по преобразования в строку в общепринятом смысле. А эти телодвижения, тоже, чего-то стоят.

L>Вобщем вопрос достойный обсуждения, но конкретно я решил этот вопрос в сторону стринга

только тогда не стоит писать &str[0] — для строк нет гарантии, что данные лежат последовательно в памяти.
Re: basic_istream >> string
От: gear nuke  
Дата: 15.07.08 15:17
Оценка:
Здравствуйте, loknalori, Вы писали:

L>Есть basic_istream (по честному — это stringstream), надо вычитать из него ЗАДАННОЕ колличество символов и отправить в строку.


21.3.7.9
1 Effects: Begins by constructing a sentry object k as if k were constructed by typename
basic_istream<charT,traits>::sentry k(is). If bool(k) is true, it calls
str.erase() and then extracts characters from is and appends them to str as if by calling
str.append(1,c). If is.width() is greater than zero, the maximum number n of characters
appended is is.width()
; otherwise n is str.max_size(). Characters are extracted and
appended until any of the following occurs:
— n characters are stored;
— end-of-file occurs on the input sequence;
— isspace(c,is.getloc()) is true for the next available input character c.


#include <sstream>
#include <iostream>

using namespace std;

int main()
{
  stringstream ss;
  ss << "0123456789";

  string s;

  streamsize old = ss.width(4);
  ss >> s;
  cout << s;

  ss.width(old);
  ss >> s;

  cout << '\n' << s;
}

0123
456789


People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: basic_istream >> string
От: gear nuke  
Дата: 15.07.08 15:21
Оценка:
Хотя вот это

isspace(c,is.getloc()) is true for the next available input character c.

может дать "произвольное колл-во символов", а насиловать фасеты я еще не научился
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: basic_istream >> string
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 17.07.08 16:22
Оценка:
Здравствуйте, loknalori, Вы писали:
L>Как быть?

Используй потоковые буферы и их итераторы.
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.