【问题标题】:C++ - Does getline have a maximum string or character capacity?C++ - getline 是否有最大字符串或字符容量?
【发布时间】:2012-01-17 15:23:24
【问题描述】:

我的问题是关于我正在处理的一项任务。似乎有多种方法可以处理任务。

我正在编写的程序将是文本文件的过滤器。作业的目的是获得使用 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'),哪个先出现?

感谢您的时间和考虑。

【问题讨论】:

    标签: c++ getline


    【解决方案1】:

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

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

    不要犯许多其他人所犯的错误,尝试使用 fileIN.good()!fileIN.eof() 或其他任何东西(这只会导致头痛和心痛)。

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

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

    【讨论】:

    • 抱歉吹毛求疵,但std::string 没有max_size() 成员返回它可以增长的最大大小(我很确定std::vector 有它)。所以实际上有一个指定的人为限制,虽然它通常只是(size_t)-1 或类似的东西,因此等于你提到的实际硬件限制。但当然是 +1。
    • @ChristianRau 是的,但我认为这只是为了方便,根据en.cppreference.com/w/cpp/string/basic_string/max_size,它是“由于系统或库实现限制,字符串能够容纳的最大元素数,即​std::distance(begin(), end())​为最大的字符串”。如果您认为我的答案由于不正确或模棱两可而需要改进,请告诉我。我认为这是因为wstring 或字符可能占用超过一个字节的原因,max_size 不仅仅是~(size_t)0 - 1
    【解决方案2】:

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

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

    所以你可能不应该太在意,除非你想制作一个防弹程序(然后你可能会关心其他事情,比如 I/O 错误、磁盘已满情况……)。

    【讨论】:

    • Linux getline 是 POSIX(我什至相信它在定义它的 POSIX 2008 标准之前就已经存在,GNU getline 可能启发了 POSIX 2008)。原始海报提到了 C++ 并且似乎在使用它(在 iostreams 中,而不是在 POSIX 中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2017-10-12
    相关资源
    最近更新 更多