0

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

到目前为止一切都很顺利;我想重载运算符>>,我可以做像 cin >> my_string; 这样的事情。问题是我不知道如何正确读取 istream(或者问题可能是我不知道流......)。我尝试了一个 while (!stream.eof()) 循环,一次 .read()s 128 个字节,但正如人们所预料的那样,它只在 EOF 上停止。我希望它读到换行符,就像你用 cin >> 读到 std::string 一样。

我的字符串类有一个(重新)分配内存的 alloc(size_t new_size) 函数和一个执行该部分的 append(const char *) 函数,但我显然需要知道要分配的内存量才能写入缓冲。

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

4

4 回答 4

1

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

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.

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

于 2009-11-06T11:30:11.850 回答
0

你可以使用 cin::getline(buffer*, buffer_size); 那么您将需要检查 bad、eof 和 fail 标志:

std::cin.bad()、std::cin.eof()、std::cin.fail()

除非设置了 bad 或 eof,否则设置失败标志通常表示缓冲区溢出,因此您应该重新分配缓冲区并在调用 std::cin.clear() 后继续读取新缓冲区

于 2009-11-06T09:29:28.760 回答
0

附注:在 STL 中, istream 的 operator>> 被重载以提供这种功能,或者(对于 *char )是全局函数。也许提供自定义重载而不是重载类中的运算符会更明智。

于 2009-11-06T09:42:10.423 回答
0

查看 Jerry Coffin 对此问题的回答。

他使用的第一个方法非常简单(只是一个辅助类),并允许您将输入写入std::vector<std::string>其中向量的每个元素代表原始输入的一行。

在事后处理方面,这真的让事情变得容易!

于 2009-11-06T09:44:34.013 回答