这道题刚开始的想法就是把属于文件的名称与一个文件夹中的所有条目存入不同的数组中,然后分别输出。
但是最终做的时候如何去判断到底是ROOT下的文件还是其他的文件夹中的文件。主要还是自己还没有建立递归的思维。
认真思考的话,如果在每次递归的时候才新开数组,而统一把读入‘f’时与读入‘d时分成两种情况处理。
把所有文件都放在一个数组中,并不会改变结果。因为这是递归程序,前面的文件夹中的文件都已经被输出了,
而且因为读到的时候会新开数组,所以并不存在问题。
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
int level=0;//level记录的是文件的层次
char tem[100];//用来消耗输入空行
//解题思想:每次读入一行的时候都用cin.peek检测,然后分别决定是进入递归程序还是保存于数组中以待最后输出
int compare(const void *x,const void *y)//快排
{
	return strcmp((char*)x,(char*) y);
}
void print()
{
	char input[500][100] = {0}, temp[100]={};//input用来存储文件名,所有的读入都会用temp消耗
	int i=0,k=0;
	while(cin.peek()!='*')//当不是结束符的时候
	{
		if(cin.peek ( ) =='d')//读到文件夹的时候
		{
			level++;//用来记录层次
			gets(temp);
			for (int k=0;k<level;k++) //level是层次
				cout<<"|     ";//要求的分隔符
			cout<<temp<<endl;
			print();
		}

		while(cin.peek()  =='f')//读到文件名的时候把其放入input数组中
		{
			gets(input[i++]);
		}

		if(cin.peek ( ) ==']')//当输入结束的时候,输出结果
		{
			gets(temp);
			qsort(input,i,sizeof(input[0]),compare);//对文件排序
			for ( k = 0; k < i; k ++ )
			{
				for ( int m = 0; m < level; m ++ )
					cout << '|' << "     ";//输出代表层次的
				cout << input[k] << endl;
			}
			level--;//把层次减少
			return;
		}
	}
	//由于是递归程序,因此所有在文件夹中的问价都已经被输出,剩余的只是root中的文件
	if(cin.peek ( ) =='*')
	{
		qsort(input,i,sizeof(input[0]),compare);
		for ( k = 0; k < i; k ++ )
		{		
			cout << input[k] << endl;
		}
		return ;
	}
}

int main()
{
	int num=1;
	while(cin.peek()!='#')
	{
		while(cin.peek()!='*')//
		{
			
			level=0;//level是全局变量
			cout<<"DATA SET "<<num<<':'<<endl;
			cout<<"ROOT"<<endl;
			num++;//
			print();//调用函数
			cout<<endl;
		}
		gets(tem);//消耗空行

	}

	return 0;
}
posted on 2010-04-03 20:02  梦涵  阅读(1423)  评论(0编辑  收藏  举报