C++中流重载使用方法
-
codelist_0.cpp
#include<iostream> #include<iomanip> #include<fstream> #include<string> #include<stdlib.h> #include<set> using namespace std; class type { private: int str1; int str2; int str3; public: type() { str1 = 0, str2 = 0, str3 = 0; } ~type() {}; friend istream & operator>>(istream & in, type &cu ) { in >> cu.str1 >> cu.str2 >> cu.str3; return in; } friend ostream & operator<<(ostream & out, const type &st) { out << st.str1 << st.str2 << st.str3 << endl; return out; } }; int main() { type type0; cin >> type0; cout << type0; }
这应该是最简单的重载流示例了
-
那么有什么实用价值呢
如下
codelist_1.cpp// codelist_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include<iostream> #include<iomanip> #include<fstream> #include<string> #include<stdlib.h> #include<set> using namespace std; class type { private: int str1; int str2; int str3; public: type() { str1 = 0, str2 = 0, str3 = 0; } ~type() {}; friend istream & operator>>(istream & in, type &cu ) { in >> cu.str1 >> cu.str2 >> cu.str3; return in; } friend ostream & operator<<(ostream & out, const type &st) { out << st.str1 << st.str2 << st.str3 << endl; return out; } int getstr1() { return str1; } int getstr2() { return str2; } int getstr3() { return str3; } }; int main() { type type0; ofstream fkb("fkb.txt"); cin >> type0; fkb << type0.getstr1() << type0.getstr2() << type0.getstr3() << endl; return 0; }
实际作用大概是省下了从键盘cin到文件整个过程的文字量,而且这份代码是示例,class只有3个私有成员,如果是大型工程,一个一个cin写那必然是要出人命的
-
还可以拓展一下 虽然用了臭名昭著的goto,(但是)对于这种规模的东西也没必要上那些高端操作
其实就是偷懒
codelist_2.cpp// codelist_2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include<iostream> #include<iomanip> #include<fstream> #include<string> #include<stdlib.h> #include<set> using namespace std; class type { protected: int str1; int str2; int str3; public: type() { str1 = 0, str2 = 0, str3 = 0; } ~type() {}; friend istream & operator>>(istream & in, type &cu ) { in >> cu.str1 >> cu.str2 >> cu.str3; return in; } friend ostream & operator<<(ostream & out, const type &st) { out << st.str1 << st.str2 << st.str3 << endl; return out; } int getstr1() { return str1; } int getstr2() { return str2; } int getstr3() { return str3; } }; void readFile() { type type0; ifstream fkb("fkb.txt"); fkb >> type0; cout << type0 << endl; fkb.close(); } void writeFile() { type type0; ofstream fkb("fkb.txt"); cin >> type0; fkb << type0 << endl; fkb.close(); } int main() { int choice; MAIN: { system("cls"); cout << "1=read/2=write/0=exit" << endl; cin >> choice; if (choice == 1) goto READ; else { if (choice == 2) goto WRITE; else return 0; } } READ: { readFile(); system("pause"); goto MAIN; } WRITE:{ writeFile(); system("pause"); goto MAIN; } return 0; }
-
还有个问题,就是如果私有或者受保护成员是字符串或者数组的话怎么整
(史前大坑) -
还有,我是不写注释人,自己的代码只要自己看得懂即可
-
还可以拓展一下 虽然用了臭名昭著的goto,(但是)对于这种规模的东西也没必要上那些高端操作
其实就是偷懒
codelist_2.cpp// codelist_2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include<iostream> #include<iomanip> #include<fstream> #include<string> #include<stdlib.h> #include<set> using namespace std; class type { protected: int str1; int str2; int str3; public: type() { str1 = 0, str2 = 0, str3 = 0; } ~type() {}; friend istream & operator>>(istream & in, type &cu ) { in >> cu.str1 >> cu.str2 >> cu.str3; return in; } friend ostream & operator<<(ostream & out, const type &st) { out << st.str1 << st.str2 << st.str3 << endl; return out; } int getstr1() { return str1; } int getstr2() { return str2; } int getstr3() { return str3; } }; void readFile() { type type0; ifstream fkb("fkb.txt"); fkb >> type0; cout << type0 << endl; fkb.close(); } void writeFile() { type type0; ofstream fkb("fkb.txt"); cin >> type0; fkb << type0 << endl; fkb.close(); } int main() { int choice; MAIN: { system("cls"); cout << "1=read/2=write/0=exit" << endl; cin >> choice; if (choice == 1) goto READ; else { if (choice == 2) goto WRITE; else return 0; } } READ: { readFile(); system("pause"); goto MAIN; } WRITE:{ writeFile(); system("pause"); goto MAIN; } return 0; }
@rnatlance203 在 C++中流重载使用方法 中说:
还可以拓展一下 虽然用了臭名昭著的goto,(但是)对于这种规模的东西也没必要上那些高端操作
其实就是偷懒
codelist_2.cpp// codelist_2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include<iostream> #include<iomanip> #include<fstream> #include<string> #include<stdlib.h> #include<set> using namespace std; class type { protected: int str1; int str2; int str3; public: type() { str1 = 0, str2 = 0, str3 = 0; } ~type() {}; friend istream & operator>>(istream & in, type &cu ) { in >> cu.str1 >> cu.str2 >> cu.str3; return in; } friend ostream & operator<<(ostream & out, const type &st) { out << st.str1 << st.str2 << st.str3 << endl; return out; } int getstr1() { return str1; } int getstr2() { return str2; } int getstr3() { return str3; } }; void readFile() { type type0; ifstream fkb("fkb.txt"); fkb >> type0; cout << type0 << endl; fkb.close(); } void writeFile() { type type0; ofstream fkb("fkb.txt"); cin >> type0; fkb << type0 << endl; fkb.close(); } int main() { int choice; MAIN: { system("cls"); cout << "1=read/2=write/0=exit" << endl; cin >> choice; if (choice == 1) goto READ; else { if (choice == 2) goto WRITE; else return 0; } } READ: { readFile(); system("pause"); goto MAIN; } WRITE:{ writeFile(); system("pause"); goto MAIN; } return 0; }
我是不知道我拓展了个什么玩意,我只知道大半夜很容易出错
函数
void readFile()
只能读第一行而且会把所有数据连在一起,一眼就能看出;
函数void writeFile()
写入的时候会把所有数据都连在一起,再读取的话就gg;修复的方法也很简单
//在class type里的插入流重载中-------------------- friend ostream & operator<<(ostream & out, blu &cu) { out << cu.s << '\t' << cu.c << '\t' << cu.p; return out; } //----------------------------------------------- void readFile() { char str[100]; ifstream fkb("fkb.txt"); while (fkb.getline(str, 100)) { cout << str << endl; } } void writeFile() { type type0; ofstream fkb("fkb.txt", ios::app); cin >> type0; fkb << type0 << endl; fkb.close(); }
-
还有个问题,就是如果私有或者受保护成员是字符串或者数组的话怎么整
(史前大坑)@rnatlance203 在 C++中流重载使用方法 中说:
还有个问题,就是如果私有或者受保护成员是字符串或者数组的话怎么整
(史前大坑)我发现我就是个人才,就算挖坑都不会把自己坑到
class blu { protected: char s[100]; char c[100]; char p; public: blu() { strcpy(s, "fsk"); strcpy(c, "fkb"); p = 'z'; } ~blu() { } friend istream & operator>>(istream & in, blu &cu) { in >> cu.s >> cu.c >> cu.p; return in; } friend ostream & operator<<(ostream & out, blu &cu) { out << cu.s << '\t' << cu.c << '\t' << cu.p; return out; } };
这不是跟上面的整型变量一样了吗 成员函数都不用写了,爽死