【问题标题】:creating input stream manipulator创建输入流操纵器
【发布时间】:2010-08-27 00:56:49
【问题描述】:

作为练习,我正在尝试创建一个输入流操纵器,它将吸收字符并将它们放入一个字符串中,直到它遇到特定字符或直到它到达 eof。这个想法来自 Bruce Eckel 的“Thinking in c++”第 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' 并终止循环。在我看到 Stuff 之前,这一切似乎都在顺风顺水。 Stuff 现在有字符等但每个字符之间有 6 个额外字符。这是一个示例:

  • &东西0x0012fba4 {0x008c1861“nìììýìììýwìììýiìììýsìììýtìììýhìììýeìììýtəiìììýmìììýeìììýfìììýoìììýrəaìììýlìììýlə”}

发生了什么事?

【问题讨论】:

    标签: c++ iostream


    【解决方案1】:

    这一行:

    SIU.S->append(&N);
    

    将字符附加为 char *。 append 函数需要一个以 null 结尾的字符串,因此它会一直从 &N、(&N)+1... 读取,直到它看到一个零字节。

    您可以组成一个小的以空字符结尾的字符数组并将其传入,或者您可以使用另一个附加函数,该函数需要一个计数和一个要附加的字符:

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

    【讨论】:

    • 谢谢!如此接近,但没有雪茄。我将其更改为 SIU.S->append(&N,1) 并且由于我确实想包含空格,因此我将其替换为 is >> N; N = is.get()。似乎可以像我现在希望的那样工作。
    • 更简单:while (is >> n) siu.s += n;注意:按照惯例,全大写标识符是为预处理器定义保留的……使用它们可能会导致很难追踪的错误。 (虽然奇怪的是,单字母的ala模板,U等是常见的做法)
    • @Tony:不以下划线开头的东西不会被语言保留用于任何东西。不过,任何好的风格指南都包含这条规则。
    • 好吧,这一切都让我思考为什么不能使用 iostream 成员函数 getline 或字符串成员函数 getline 来代替上面的 siu。除了运营商业务外,它们具有相似的定义。只是大声思考。好像你需要像我一样定义一个临时实例,你不能用函数做。不过应该可以在 siu 运算符 >> 的定义中使用。
    • @tony: S 是一个指向字符串的指针,所以我需要 *siu.S +=N;我想停在但不存储终止符,所以我将 while 更改为“while (!is.eof())”,消除了完成的杂物,并在遇到终止符时添加了一个中断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多