字符串string头文件中有个getline函数,看命名似乎是获取一行的意思。但对于输入流而言,getline并不意味所获取的数据必须以行结束符结尾。
getline函数可以有三个参数,第一个为输入流(如istream、ifstream或stringstream等)对象,第二个参数为需要保存到的对象,第三个参数即自定义的分隔符。
有了自定义的能力,getline便可以拓展抽象的行的概念。比如我们把逗号(,)作为一个行分隔符。
这有什么用呢?
比如我们把一张excel表的数据导出到文本文件中,使用了TAB字符作为每列数据的分隔符,那么我们就可以在一个数据行内,以处理行的类似方式循环处理每个列数据。比如一个成绩表:
姓名 性别 数学 语文 英语
张三 男 100 80 85
小李 女 100 92 90
小王 女 80 88 78
保存至内存的简单办法就是:
// 假定 成绩.txt 文件中不存在列名那一行
ifstream ifs("成绩.txt");
// 保存所有成绩记录
vector<vector<string> > records;
// 保存一行字符串
string row;
// 第一个getline,使用默认的换行符。
while(getline(ifs, row)) {
stringstream ss(row);
string col;
vector<string> record;
// 第二个getline,使用tab跳格符即\t
while(getline(ss, col, '\t')) {
record.push_back(col);
}
records.push_back(record);
}