C++ 自定义IO操作符

标签: IO QT
21人阅读 评论(0) 收藏 举报
分类:

C++ operator >> 与 <<

写一个结构体,需要进行文本的读取和输出。需要给结构体定义操作符<<, >>。
如下是结构体的部分内容:

typedef struct __wordUnit{
    string word;
    string translation;
    __wordUnit(){
        word = "";
        translation = "";
    }
    __wordUnit(string _word, string _translation){
        word = _word;
        translation = _translation;
    }
    int size(){
        return word.length()+translation.length();
    }
    bool operator ==(const __wordUnit another){
        return word == another.word && translation == another.translation ;
    }
    friend __wordUnit operator +(const __wordUnit lw, const __wordUnit rw){
        __wordUnit ret(lw.word,lw.translation);
        ret.word = ret.word+rw.word;
        ret.translation = ret.translation+rw.translation;
        return ret;
    }
}wordUnit;

在程序中需要将结构体内容写入文件中,自定义operator >>如下:

friend ofstream& operator <<(ofstream &out,__wordUnit &myWord){
    out<<myWord.word<<"\n";
    out<<myWord.translation;
    return out;
}

相应的,输出到stdout非常类似:

friend ostream& operator <<(ostream &out, __wordUnit &myWord){
    out<<myWord.word<<"\n";
    out<<myWord.translation;
    return out;
}

在编写输入操作的时候考虑到可能因为空格、换行符等特殊字符造成输入不完整,在这个简单的场景下直接人工处理:

friend ifstream& operator >>(ifstream &in,__wordUnit &myWord){
    in>>myWord.word;
    string str;
    in>>myWord.translation;
    while(!in.eof()){
        in>>str;
        myWord.translation += " ";
        myWord.translation += str;
    }
    return in;
}

接着,可以编写上层文件读取函数:

wordUnit readWordFile(const char *path)
{
    ifstream in(path);
    if(!in.is_open()){
        LOGDBG("open failed for %s: %s", path, strerror(errno));
        return wordUnit();
    }
    wordUnit myWord;
    in>>myWord;
    in.close();
    return myWord;
}

最后,可以正常应用IO函数:

int main(int argc, char *argv[])
{
    wordUnit word1("hello","ni hao");
    wordUnit word2;
    ofstream outStream("./txt");
    outStream<<word1;
    outStream.close();

    word2 = readWordFile("./txt");
    cout<<word2;
    return 0;
}

QT 自定义QDebug输出流

还是使用上面的结构体,不过,我们需要一点修改,将string改成QString,重载Debug流需要用到QDebugStateSaver对象保存相关的设置。
如:

friend QDebug operator <<(QDebug debug,const __wordUnit another){
    QDebugStateSaver saver(debug);
    debug.nospace() << another.word << " " << another.translation;
    return debug;
}

最后,可以试试效果:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    wordUnit word1("hello","ni hao");
    wordUnit word2(" word"," shi jie");
    qDebug()<<(word1 == word2);
    qDebug()<<(word1+word2);
    return a.exec();
}
查看评论

C++自定义插入操作符和提取操作符

#include #include /* run this program using the console pauser or add your own getch, system("paus...
  • u011702002
  • u011702002
  • 2017年08月21日 13:09
  • 190

C++ 自定义比较:仿函数、函数与重载操作符

cpp 模板泛型编程 cpp 比 c 方便不少不光因为其支持面向对象支持class,同样还因为其支持泛型编程,有方便的STL库。泛型要比宏强大的多,是一种设计更巧妙的编译期动态机制,类型安全,使得一...
  • thisinnocence
  • thisinnocence
  • 2016年04月04日 20:31
  • 2503

C++IO操作总结

C++语言 IO库
  • Kings_World
  • Kings_World
  • 2015年05月25日 01:11
  • 937

RxJava操作符(十)自定义操作符

Rxjava允许我们来自定义操作符来满足我们特殊的需求。如果我们的自定义操作符想要作用到Observable发射出来的数据上,我们就要使用lift操作符;如果我们的自定义操作符想要改变整个的Obser...
  • lizubing1992
  • lizubing1992
  • 2016年05月05日 11:28
  • 787

RxJava(10-操作符原理&自定义操作符)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51692493 本文出自:【openXu的博客】目录:自定义创建操作符 数据序列操作符...
  • u010163442
  • u010163442
  • 2016年06月30日 15:59
  • 2657

C++重载[]数组操作符

#include #include using namespace std; class CharPair{ public: CharPair(){ } CharPair(char f...
  • w397090770
  • w397090770
  • 2012年03月18日 14:46
  • 6422

swift3.0自定义运算符

swift3.0自定义运算符
  • Pointee
  • Pointee
  • 2016年09月28日 14:41
  • 1443

自定义数据结构想要使用 std::set 需要重载哪些操作符

一、引言最近在自己的项目中,定义了一个自定义数据结构,在使用这个数据结构的过程中,创建了许多该结构对象,想要使用 std::set 去重处理,然而此时就发生了编译错误: error C2678:...
  • u012814856
  • u012814856
  • 2017年09月20日 23:59
  • 214

C++运算符重载(3) - 什么时候需要自定义赋值操作符

答案与拷贝构造函数一样。如果一个类不包含指针,则不需要自定义赋值操作符与拷贝构造函数。编译器会给每个类创建一个默认的拷贝构造函数和默认的赋值操作符。但是,当类中包含有指针或任何运行时分配的资源时,编译...
  • shltsh
  • shltsh
  • 2015年05月26日 09:32
  • 1247

RxJava 自定义操作符(实现自己的操作符)

你可以实现你自己的Observable操作符,本文展示怎么做。如果你的操作符是被用于创造一个Observable,而不是变换或者响应一个Observable,使用 create( ) 方法,不要试图手...
  • jdsjlzx
  • jdsjlzx
  • 2016年07月29日 09:30
  • 2093
    个人资料
    持之以恒
    等级:
    访问量: 37万+
    积分: 9420
    排名: 2417
    我的链接
    最新评论