l***e 发帖数: 480 | 1 有一文件存有大量对象记录,前面问过。
每行一个记录,记录有两种:
一种是两个string和两个int,中间是'\t';串中有空格。
另一种是开头一个固定字符串以'?'结尾,然后是两个串,和一个int,中间也是'\t';
记录/行之间有空行。
我要定义这个对象的extractor(>>)
我的问题是,空行在哪里处理?
如果在对象>>函数里处理,那就要产生空对象返回。
如果在对象>>函数外处理,主程序先从文件里读一行,判断是否空行,是,跳过;不是
,送给对象,这时传的就是string了,而不是输入流了。
所以请教大家,集思广益。 |
l***e 发帖数: 480 | 2 例子:
aaa\tbbb\t3\t5
bbb\tccc\t7\t4
aaa\tbb bb\t6\t2
bb bb\tddd\t8\t3
zzz?\tdd dd\tbb bb\t6
zzz?\tccc\taaa\t8
zzz?\tee ee\tbbb\t3
zzz?\aaa\tccc\t9 |
S**I 发帖数: 15689 | 3 在>>函数里,如果是空行,跳过读下一行
【在 l***e 的大作中提到】 : 有一文件存有大量对象记录,前面问过。 : 每行一个记录,记录有两种: : 一种是两个string和两个int,中间是'\t';串中有空格。 : 另一种是开头一个固定字符串以'?'结尾,然后是两个串,和一个int,中间也是'\t'; : 记录/行之间有空行。 : 我要定义这个对象的extractor(>>) : 我的问题是,空行在哪里处理? : 如果在对象>>函数里处理,那就要产生空对象返回。 : 如果在对象>>函数外处理,主程序先从文件里读一行,判断是否空行,是,跳过;不是 : ,送给对象,这时传的就是string了,而不是输入流了。
|
l***e 发帖数: 480 | 4 like this?:
friend istream & operator>>(istream &stream, class & obj) {
i=getline(stream, obj.a, '\t');
if(i>0){
getline(stream, obj.b, '\t');
stream >> obj.c >> obj.d >> ws;
return stream;
}
}
mail()
{
while(!cin.eof()) cin>>obj;
} |
S**I 发帖数: 15689 | 5 得用while,除非没有连续的空行
【在 l***e 的大作中提到】 : like this?: : friend istream & operator>>(istream &stream, class & obj) { : i=getline(stream, obj.a, '\t'); : if(i>0){ : getline(stream, obj.b, '\t'); : stream >> obj.c >> obj.d >> ws; : return stream; : } : } : mail()
|
l***e 发帖数: 480 | 6 搞定了,多谢。
能不能自己定义分隔符,然后,直接
stream>>obj.a>>obj.b>>obj.c>>obj.d>>ws;
return stream;
? |