我的问题是关于我正在处理的作业。似乎有多种方法可以完成任务。
我正在编写的程序将是文本文件的过滤器。作业的目的是获得使用 fstream 和 getline 的经验。
要求:
- 读取一个文本文件(任何可能的方式,不必一次全部读取)
- 写入一个单独的文本文件(任何可能的方式,可以逐字符追加或写入)
- 假定每个句子都以句号结尾。
- 每个句子的第一个字母必须大写。
- 每个句子中除第一个字母外的所有字母都必须小写。 (专有名词也是如此——这是一个微不足道的例子)
我有一个我编写的程序的工作草稿,但 getline 读取我的文本文件的方式不一致。基本上,它会将一行作为字符串读入,这就是我想要的。正如它在第二行中所读的那样;然而,该程序在行的中途抛出运行时错误,Windows 将其关闭。
getline 是否有缓冲区填满并需要在每行读取后清理?
我的程序伪代码:
- 使用 getline 从以句点 (.) 停止的第 x 行读取字符串。
- 迭代字符串字符,将第一个字母大写,然后将其余字母小写。
- 读入文本文件中最后一个句点 (.) 之后的另一个字符串。
- 重复直到读取文本文件。
- 写入第二个文本文件。
我正在以这种方式实现 getline:
getline(fileIN, str1, '.')
str1 是从每一行读取的字符串。
我是否正确使用了 getline?我是否正确有效地思考了这个问题?
* 当我完成这个扩展问题/部分时,我意识到 getline 可能正在为行尾的“\r”或“\n”字符使用更多内存,或者出于不相关的原因根据内存,getline 没有正确处理(根据我的目的)换行的句子。 getline 不能很好地处理句子/自动换行吗?
还有,有没有办法动态指定 getline 读取第一个字符串,直到句点 (.) 或换行符 ('\n'),哪个先到?
感谢您的时间和考虑。
最佳答案
是的,您正确地使用了 getline
。确保将其用作 while
循环或其他条件的条件:
while(std::getline(fileIN, str1, '.')) {
// process str1
}
并且不要犯很多其他人试图使用 fileIN.good()
或 !fileIN.eof()
或其他任何东西(这只会导致头痛和心痛)。
str1
的缓冲区不需要你清理,因为它是由string
类管理的。它将根据需要扩展并在变量超出范围时自行释放。这就是我们喜欢标准库类并在使用原始数组之前三思而后行的原因之一。
此外,string
的容量也没有人为限制。唯一的限制因素是系统的可用内存,因此对于虚拟内存,它可能在 32 位系统上略小于 4GB 或在 64 位系统上略小于 264 字节系统。
关于C++ - getline 是否有最大字符串或字符容量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8460666/