getline有最大字符串或字符容量吗?

C++ - Does getline have a maximum string or character capacity?

本文关键字:字符 容量 字符串 getline      更新时间:2023-10-16

我的问题是关于我正在做的一项任务。似乎有很多方法来完成这个任务。

我正在编写的程序将是文本文件的过滤器。作业的目的是获得使用fstream和getline的经验。

要求:

  1. 读取一个文本文件(任何可能的方式,不需要一次全部)
  2. 写入单独的文本文件(任何可能的方式,可以附加或逐个字符写入)
  3. 假定每个句子以句点结尾。
  4. 每句话的第一个字母必须大写。
  5. 每句话的第一个字母以外的所有内容必须是小写的。(专有名词-这是一个微不足道的例子)

我有一个我写的程序的工作草案,但是getline在读取我的文本文件时不一致。基本上,它会以字符串的形式读入一行,这就是我想要的。就像第二行读到的那样;但是,程序在行到一半时抛出运行时错误,Windows将其关闭。

getline是否有一个缓冲区,在每次读取后填充并需要清理?

程序的伪代码:

  1. 使用getline从x行读取字符串,以句号(.)结尾。
  2. 遍历字符串字符,首字母大写,其余字母小写。
  3. 从文本文件的最后一个句点(.)之后读入另一个字符串
  4. 重复,直到文本文件被读取。
  5. 写入第二个文本文件

我这样实现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字节。

getline(来自C库)的限制受资源(即内存)的限制,因此您不应该担心太多(除非您的文件只有一行十亿字节)。

STL c++ getline有类似的限制。

因此,您可能不应该关心那么多,除非您想要制作一个防弹程序(然后您可能会关心其他事情,如I/O错误,磁盘满条件,…)。