我在一个定制的C ++速成课程。我知道的基本知识很多年了,但我目前正试图刷新我的记忆和了解更多信息。为此,作为我的第二个任务(编写基于链表堆栈下课后),我写我自己的字符串类。

它不见了相当顺利到现在为止;我想重载运算符>>,我可以做喜欢的东西CIN >> my_string ;. 问题是,我不知道如何正确读取的istream的(或者也许问题是,我不知道流...)。我尝试了一段时间(!stream.eof())循环,.read()第128个字节的时间,但正如人们所期望的,它只能在EOF停止。我希望它读给换行,就像你与CIN >>到的std :: string。

我的串类都有一个页头(为size_t new_size)函数(重新)分配内存,而且确实这部分追加(为const char *)函数,但我显然需要知道的内存量之前,我可以分配写入到缓冲器。

这是如何实现这有什么建议?我试图获得与seekg()和所以tellg()的长度的IStream,但没有成功(它-1返回),并且正如我所说循环,直到EOF(不停止读取在一个换行)一次读出一个块。

有帮助吗?

解决方案

要从流读取字符,直到行末使用一个循环。

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.

如果您运行的空间具有更大的尺寸重新分配你的缓冲区。 在数据复制和延续。无需华丽的学习项目。

其他提示

可以使用CIN ::函数getline(缓冲器*,BUFFER_SIZE); 那么你将需要检查的坏,EOF和失败的标志:

的std :: cin.bad(),标准:: cin.eof(),标准:: cin.fail()

除非坏或EOF设定,设定失败的标志通常表示缓冲区溢出,所以你应该重新分配你的缓冲,并继续读入新的缓冲区调用的std :: cin.clear()后

一个侧面说明:在STL的的istream的操作者>>被重载以提供这种功能或(作为* CHAR)是全局函数。也许这将是更明智的做法是提供一个自定义的过载,而不是在你的类重载运算符。

检查杰里棺材的回答这个问题

他所使用的第一种方法是非常简单的(只是一个辅助类),并允许你写输入在所述向量的每个元素表示一个线的原始输入的std::vector<std::string>

这真的让事情变得简单,当谈到处理算帐!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top