STL中getline的设计大旨
STL中getline的设计疏忽
方法getline,顾名思义,是获取流中的一行出来,在STL中全局方法getline的定义是:
在basic_istream中的定义是:
既然是获去流中的一行出来,为什么basic_istream中的getline还得加个_Count限制,如果仅是考虑到内存空间的限制,那这种接口的设置不够合理,不知道大家怎么看?
------解决方案--------------------
如果我输入一个1TB字节的a,帖主怎么看?
------解决方案--------------------
istream的成员函数getline的第一个参数是char数组,不管是静态还是动态肯定是有限的,不能自动增长,因此getline时就不能超过这个数组的长度,必须加count限定
全局getline的第二个参数数string,可以自动增长,因此不需要限制长度
------解决方案--------------------
全局的 getline 是定义在 string 头文件里面的.
basic_istream 类是不依赖于 std::string 的, 它都不知道有 std::string 可用, 就只能按传统的字符串方式了.
------解决方案--------------------
同样的还有 fstream 的构造函数和 open 函数, 都是用 char* 做参数的, 而不是用 std::string, 因为不想引入过多的依赖性.
------解决方案--------------------
不只是不想引入依赖性, 由于 std::string 重载了从 istream, ostream 输入输出的, 是 std::string 已经依赖于流了, 如果流在去依赖 std::string 就造成循环依赖了.
看来不是不想, 是不能.
------解决方案--------------------
这说法不对的
流输入输出的重载是在string类外部的,没有对string有依赖
实际上c++11中fstream的open已经支持string作为参数了
------解决方案--------------------
在string头文件里啊
cout<<str;这种不是很常用的么
------解决方案--------------------
虽然是在类外部, 但是标准库只有头文件, 没有 cpp, 还是会在头文件之间引入循环包含的.
fstream 可以使用 std::string 了, 那可能是因为 std::string 依赖的是 istream, 而不是 ifstream 所以依赖关系成了: istream <-- string <-- ifstream 还是能保持单向. 但是要在 istream 的 getline 函数里引入 string 就恼火了, 会造成循环依赖的.
方法getline,顾名思义,是获取流中的一行出来,在STL中全局方法getline的定义是:
getline(basic_istream<,>& _Istr, basic_stream<,>& _Str);
在basic_istream中的定义是:
getline(_Elem* _Str, streamsize _Count);
既然是获去流中的一行出来,为什么basic_istream中的getline还得加个_Count限制,如果仅是考虑到内存空间的限制,那这种接口的设置不够合理,不知道大家怎么看?
STL
getline
疏忽
------解决方案--------------------
如果我输入一个1TB字节的a,帖主怎么看?
------解决方案--------------------
istream的成员函数getline的第一个参数是char数组,不管是静态还是动态肯定是有限的,不能自动增长,因此getline时就不能超过这个数组的长度,必须加count限定
全局getline的第二个参数数string,可以自动增长,因此不需要限制长度
------解决方案--------------------
全局的 getline 是定义在 string 头文件里面的.
basic_istream 类是不依赖于 std::string 的, 它都不知道有 std::string 可用, 就只能按传统的字符串方式了.
------解决方案--------------------
同样的还有 fstream 的构造函数和 open 函数, 都是用 char* 做参数的, 而不是用 std::string, 因为不想引入过多的依赖性.
------解决方案--------------------
不只是不想引入依赖性, 由于 std::string 重载了从 istream, ostream 输入输出的, 是 std::string 已经依赖于流了, 如果流在去依赖 std::string 就造成循环依赖了.
看来不是不想, 是不能.
------解决方案--------------------
这说法不对的
流输入输出的重载是在string类外部的,没有对string有依赖
实际上c++11中fstream的open已经支持string作为参数了
------解决方案--------------------
在string头文件里啊
cout<<str;这种不是很常用的么
------解决方案--------------------
这说法不对的
不只是不想引入依赖性, 由于 std::string 重载了从 istream, ostream 输入输出的, 是 std::string 已经依赖于流了, 如果流在去依赖 std::string 就造成循环依赖了.
看来不是不想, 是不能.
流输入输出的重载是在string类外部的,没有对string有依赖
实际上c++11中fstream的open已经支持string作为参数了
虽然是在类外部, 但是标准库只有头文件, 没有 cpp, 还是会在头文件之间引入循环包含的.
fstream 可以使用 std::string 了, 那可能是因为 std::string 依赖的是 istream, 而不是 ifstream 所以依赖关系成了: istream <-- string <-- ifstream 还是能保持单向. 但是要在 istream 的 getline 函数里引入 string 就恼火了, 会造成循环依赖的.