c++ - 将运算符>>重载到 C++ 中的字符缓冲区 - 我可以告诉流长度吗?

标签 c++ operators operator-overloading istream

我正在参加自定义 C++ 速成类。我已经了解基础知识很多年了,但我目前正在努力刷新内存并了解更多信息。为此,作为我的第二个任务(在编写基于链表的堆栈类之后),我正在编写自己的字符串类。

到现在为止还算顺利;我想重载 operator>> 以便我可以执行诸如 cin >> my_string; 之类的操作。 问题是我不知道如何正确读取 istream(或者问题可能是我不知道流......)。我尝试了一段时间 (!stream.eof()) 循环 .read()s 一次 128 个字节,但正如人们所料,它仅在 EOF 处停止。我希望它读到一个换行符,就像你用 cin >> 读到一个 std::string 一样。

我的字符串类有一个 alloc(size_t new_size) 函数可以(重新)分配内存,还有一个 append(const char *) 函数可以完成这部分工作,但我显然需要先知道要分配的内存量写入缓冲区。

关于如何实现这个的任何建议?我尝试使用 seekg() 和 tellg() 获取 istream 长度,但无济于事(它返回 -1),正如我所说的循环直到 EOF(不在换行处停止读取)一次读取一个 block 。

最佳答案

要从流中读取字符直到行尾,请使用循环。

char c;
while(istr.get(c) && c != '\n')
{
     // Apped 'c' to the end of your string.
}
// If you want to put the '\n' back onto the stream
// use istr.unget(c) here
// But I think its safe to say that dropping the '\n' is fine.

如果空间不足,请重新分配更大的缓冲区。 复制数据并继续。无需花哨的学习项目。

关于c++ - 将运算符>>重载到 C++ 中的字符缓冲区 - 我可以告诉流长度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1686385/

相关文章:

c++ - std::function 的仅 move 版本

c++ - 尝试内联函数时 Visual C++ 中的链接错误

c++ - 模板化 operator() 重载 C++

c++ - 这是获取数字字符列表并使用它们创建长整数的有效方法吗?

c++ - C++ 如何确定重载运算符的参数?

c++ - 在 C++Builder 中重载 MainForm 构造函数

c++ - 将函数模板原型(prototype)作为参数传递

java - 在带有 && 运算符的 if 语句中使用 char 数组和 boolean 数组

c++ - 访问者和模板化虚拟方法

java - c++中的运算符重载可以用在java中吗