C ++ - getline是否具有最大字符串或字符容量?

时间:2011-12-10 23:13:41

标签: c++ getline

我的问题是提到我正在进行的任务。似乎有多种方法来处理任务。

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

要求:

  1. 阅读一个文本文件(任何可能的方式,不必一次全部)
  2. 写入单独的文本文件(任何可能的方式,可以逐个字符地附加或写入)
  3. 假设每个句子以句号结尾。
  4. 每个句子的第一个字母必须是大写的。
  5. 除了每个句子的第一个字母之外的所有内容都必须是小写的。 (专有名词也是 - 这是一个微不足道的例子)
  6. 我有一份我写过的程序的工作草案,但是getline在阅读我的文本文件方面有不一致的地方。基本上,它会以字符串形式读取一行,这就是我想要的。正如它在第二行中读到的那样;但是,该程序在该行的中途抛出一个运行时错误,Windows将其关闭。

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

    我的程序伪代码:

    1. 使用getline从行x中读取字符串(。)。
    2. 迭代字符串字符,大写第一个字母,然后小写其余字符。
    3. 在文本文件中的最后一个句点(。)之后继续读取另一个字符串。
    4. 重复阅读文本文件。
    5. 写入第二个文本文件。
    6. 我用这种方式实现getline:

      getline(fileIN, str1, '.')
      

      str1是从每一行读取的字符串。

      我是否正确使用了getline?我是否通过正确有效地思考这个问题?

      * 我意识到,当我完成这个扩展的问题/部分时,getline可能会在行的末尾为'\ r'或'\ n'字符使用更多内存,或者出于无关的原因对于记忆,getline没有正确处理(根据我的目的)包裹到新行的句子。 getline不能很好地处理句子/自动换行吗?

      另外,有没有办法动态指定getline来读取第一个字符串,直到句号(。)或换行符('\ n'),这是第一个?

      感谢您的时间和考虑。

2 个答案:

答案 0 :(得分:6)

是的,您正确使用getline。请务必将其用作while循环或其他条件的条件:

while(std::getline(fileIN, str1, '.')) {
    // process str1
}

并且不要犯这么多其他人试图使用fileIN.good()!fileIN.eof()或其他任何事情的错误(这只会导致头痛和心痛)。

str1的缓冲区不需要由您清理,因为它由string类管理。它将根据需要进行扩展,并在变量超出范围时解除分配。这就是为什么我们喜欢标准库类并在使用原始数组之前三思而后的原因之一。

此外,string的容量没有人为限制。唯一的限制因素是系统的可用内存,因此对于虚拟内存,它在32位系统上可能略低于4GB,或者在64位上略低于2 64 字节系统

答案 1 :(得分:1)

getline(来自C库)的限制受资源(即内存)的限制,所以你不必担心(除非你有一个十亿字节的单行文件)。 / p>

STL C ++ getline也有类似的限制。

所以你可能不应该那么在乎,除非你想制作一个防弹程序(然后你可能会关心其他事情,比如I / O错误,磁盘满状态......)。