создание входного потока манипулятора - PullRequest
1 голос
/ 27 августа 2010

В качестве упражнения я пытаюсь создать манипулятор потока ввода, который будет всасывать символы и помещать их в строку до тех пор, пока он не встретит определенный символ или не достигнет eof.Идея пришла со страницы 249.

Брюса Экеля "Мышление на С ++". Вот код, который у меня есть:

#include <string>
#include <iostream>
#include <istream>
#include <sstream>
#include <fstream>
#include <iomanip>
using namespace std;

class siu 
{
    char T;
    string *S;
public:

    siu (string *s, char t)
    {
        T = t;
        S = s;
        *S = "";
    }


    friend istream& operator>>(istream& is, siu& SIU)
    {
        char N;
        bool done=false;
        while (!done)
        {
            is >> N;
            if ((N == SIU.T) || is.eof())
                done = true;
            else
                SIU.S->append(&N);
        }
        return is;
    }
};

и его проверка ....

        {
            istringstream iss("1 2 now is the time for all/");
            int a,b;
            string stuff, zork;

            iss >> a >> b >> siu(&stuff,'/');
            zork = stuff;
        }

идея в том, что siu (& stuff, '/') будет высасывать символы из iss, пока не встретит /.Я могу смотреть его с помощью отладчика, так как он получает символы 'n' 'o' 'w' через '/' и завершает цикл.Кажется, все плывет, пока я не смотрю на вещи.У материала теперь есть символы и т. Д. НО между каждым из них есть по 6 дополнительных символов. Вот пример:

  • и прочее 0x0012fba4 {0x008c1861 "nÌÌÌýoÌÌÌýwÌÌÌýiÌÌÌýsÌÌÌýtýýýý * 101 * * * * *

    Что происходит?

1 Ответ

3 голосов
/ 27 августа 2010

Эта строка:

SIU.S->append(&N);

добавляет символ как символ *. Функция append ожидает строку с нулевым символом в конце, поэтому она продолжает читать из & N, (& N) +1 ..., пока не увидит нулевой байт.

Вы можете либо создать небольшой массив символов с нулевым символом в конце и передать его, либо использовать функцию альтернативного добавления, которая принимает число и символ для добавления:

SIU.S->append(1, N);
...