getline有最大字符串或字符容量吗?
C++ - Does getline have a maximum string or character capacity?
我的问题是关于我正在做的一项任务。似乎有很多方法来完成这个任务。
我正在编写的程序将是文本文件的过滤器。作业的目的是获得使用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字节。
getline(来自C库)的限制受资源(即内存)的限制,因此您不应该担心太多(除非您的文件只有一行十亿字节)。
STL c++ getline有类似的限制。
因此,您可能不应该关心那么多,除非您想要制作一个防弹程序(然后您可能会关心其他事情,如I/O错误,磁盘满条件,…)。
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 将stl字符串缩小到小于15个字符的容量
- 确定动态内存分配中的字符指针的最大容量
- getline有最大字符串或字符容量吗?