Hello World,
我是C ++的新手,我正在尝试逐行阅读文本文件。我在网上进行了一些研究,偶然发现了ifstream。
令我不安的是getLine方法。 参数是istream& getline(char * s,streamsize n);
我知道变量s是保存读取行的位置。 (如果我错了,请纠正我)
我不理解的是streamize n用于什么。
文件说明:
Maximum number of characters to write to s (including the terminating null character).
但是,如果我不知道给定的行有多长,我将streamize n设置为什么?
此外,
ifstream和istream有什么区别?
是不是更适合阅读线?性能有差异吗?
感谢您的时间
答案 0 :(得分:3)
您几乎不想使用此getline
函数。它是在定义std::string
之前的遗留物。它是用于读入固定大小的缓冲区,因此您可以执行以下操作:
static const int N = 1024;
char mybuffer[N];
myfile.getline(mybuffer, N);
... N
用于阻止getline
在您分配的空间结束后写入内存。
对于新代码,通常想要使用std::string
,并让它扩展以容纳正在读入的数据:
std::string input;
std::getline(myfile, input);
在这种情况下,您不需要指定最大大小,因为字符串可以/将根据输入中行的大小的需要进行扩展。警告:在少数情况下,这可能是一个问题 - 如果(例如)您正在读取数据被送入网站,它可能是攻击者通过提供巨大的数据来进行DoS攻击的一种方式字符串,并让你的系统试图分配过多的内存。
在istream和ifstream之间:istream主要是一个基类,它定义了一个可用于处理各种派生类(包括ifstream对象)的接口。当/如果要从磁盘(或类似的东西)打开文件时,您想要使用ifstream对象。