struct tree
{
friend istream& operator>>( istream& is, tree& t );
friend ostream& operator<<( ostream& os, const tree& t );
tree( const char* name_="", size_t level_=0 );
string name;
size_t level;
vector<tree> subs;
};
tree::tree( const char* name_, size_t level_ ) : name(name_),
level(level_)
{
}
istream& operator>>( istream& is, tree& t )
{
if( is.fail() ) return is;
t = tree();
vector<tree*> cols;
for( string sline; getline(is,sline); )
{
if( sline.empty() ) continue;
size_t level = sline.find_first_not_of('\t');
if( level > cols.size() ) // format error
{
is.setstate( ios::failbit );
t = tree();
return is;
}
if( level==0 && !cols.empty() ) // second root found
{
for( size_t i=0; i<=sline.size(); ++i )
is.unget();
return is;
}
cols.resize( level );
if( cols.empty() )
{
t = tree( sline.substr(level).c_str(), level );
cols.push_back( &t );
}
else
{
cols.back()->subs.push_back( tree(
sline.substr(level).c_str(), level ) );
cols.push_back( &cols.back()->subs.back() );
}
}
if( !is.bad() && is.eof() && !t.name.empty() )
is.clear();
return is;
}
ostream& operator<<( ostream& os, const tree& t )
{
os << setw(t.level) << setfill('\t') << "" << t.name << '\n';
for( vector<tree>::const_iterator itor=t.subs.begin();
itor!=t.subs.end(); ++itor )
os << *itor;
return os;
}
int main()
{
ifstream file( "test.txt" );
for( tree a; file>>a; cout<<a );
}
测试数据:
Root
V:\
FolderX
FolderA1
FolderD2
FolderB
FolderW1
FolderB2
D:\
FolderM
FolderQ1
FolderC2
Root2
V:\
FolderX
FolderA1
FolderD2
FolderB
FolderW1
FolderB2
D:\
FolderM
FolderQ1
FolderC2
输出:
Root
V:\
FolderX
FolderA1
FolderD2
FolderB
FolderW1
FolderB2
D:\
FolderM
FolderQ1
FolderC2
Root2
V:\
FolderX
FolderA1
FolderD2
FolderB
FolderW1
FolderB2
D:\
FolderM
FolderQ1
FolderC2