用了递归的思想 参考了一下其他人写的代码写的。。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string tem;
int lev = 0;
void myTab()
{
for(int i = 0;i < lev;++i)
cout<<"| ";
}
void myPrint()
{
//cout<<"myPrint"<<endl;
vector<string> inputData;
while(cin.peek() != '*')
{
if(cin.peek() == 'd')
{
//cout<<"mydir"<<endl;
lev++;
//cin>>tem;
getline(cin,tem);
myTab();
cout<<tem<<endl;
myPrint();
}
while(cin.peek() == 'f')
{
// char ch_tem[100] = {};
// gets(ch_tem);
// tem = ch_tem;
getline(cin,tem);
//cin>>tem;
inputData.push_back(tem);
//getchar();//吃掉回车符号。。。。也可以改成用getline来读取文件名 cin.getline 的参数是字符数组 。。。getline的参数才是string的
}
//if(cin.peek()== 10)cout<<"daasd"<<endl;//换行符的asc是 10(LF line feed - new line) 回车的asc是 13(CR carriage return)
if(cin.peek() == ']')
{
//cout<<"my ]"<<endl;
//cin>>tem;
getline(cin,tem);
sort(inputData.begin(),inputData.end());
for(unsigned k = 0; k < inputData.size(); ++k)
{
myTab();
cout<<inputData[k]<<endl;
}
lev--;
return;
}
}
if(cin.peek() == '*')
{
//cout<<"my*"<<endl;
sort(inputData.begin(),inputData.end());
for(unsigned k = 0; k < inputData.size(); ++k)
{
cout<<inputData[k]<<endl;
}
return;
getline(cin,tem);
}
}
int main()
{
freopen("in.txt","r",stdin);
freopen("outMy.txt","w",stdout);
int num = 1;
while(cin.peek() != '#')
{
while(cin.peek() != '*')
{
lev = 0;
cout<<"DATA SET "<<num<<":"<<endl;
cout<<"ROOT"<<endl;
num++;
myPrint();
cout<<endl;
}
//cin>>tem;//把 * 吃掉
getline(cin,tem);
}
return 0;
}
参考一
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
char input[200][20]; //输入保存
char str[20]; //每项的输入
char files[200][20]; //保存要输出的文件(只保存最近目录下的,用来排序用)
int blank;//空格的次数
int dirs[200]; //用来表示嵌套的第几次文件,每项纪录的是当前目录在input中的排序
int dnum; //当前在哪个目录下,和dirs搭配使用
/**
输出空格
*/
void printBlank(){
for(int i=0;i<blank;i++){
printf("| ");
}
}
/**
排序的函数,搭配qsort
*/
int compare(const void *elem1,const void *elem2)
{
return (strcmp((char*)elem1,(char*)elem2));
}
//对输入的项进行处理
void process(int pos){
switch(input[pos][0]){
case '*':{ //遇到结尾的处理,从当前位置向上数到头,遇到file就保存,准备输出
int i=pos;
int j=0;
while(i>=0){
if(input[i][0]=='f'){
strcpy(files[j++],input[i]);
}
i--;
}
qsort(files,j,20,compare);
for(i=0;i<j;i++){
printBlank();
puts(files[i]);
}
break;
}
case 'd': //遇到目录就输出
blank++;
printBlank();
printf("%s/n",input[pos]);
dirs[dnum++]=pos;
process(pos+1);
break;
case 'f': //遇到文件就跳过
process(pos+1);
break;
case ']':{ //愈大]准备打印当前目录下的文件
int i=pos;
int j=0;
while(i>dirs[dnum-1]){
if(input[i][0]=='f'){
strcpy(files[j++],input[i]);
input[i][0]='s';
}
i--;
}
qsort(files,j,20,compare);
for(i=0;i<j;i++){
printBlank();
puts(files[i]);
}
if(dnum>1) dnum--;
blank--;
process(pos+1);
break;
}
}
return;
}
int main(){
int i=0;
int flag=0;
int n=1;
while(scanf("%s",str)!=EOF){ //读入字符串
if(str[0]=='#') break; //结束
if(str[0]!='*'){ //一直输入
strcpy(input[i++],str);
}else{
strcpy(input[i],"*"); //遇到一组结束,准备处理
printf("DATA SET %d:/n",n++);
printf("ROOT/n");
blank=0;
process(0);
i=0;
puts("");
}
}
system("pause");
return 0;
}
参考二
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct Dir
{
string name;
vector<string> files;
vector<Dir> dirs;
};
Dir input(string name)
{
Dir dir;
string str;
cin >> str;
if(str == "#") return dir;
dir.name = name;
while(str != "*" && str != "]")
{
if(str[0] == 'f') dir.files.push_back(str);
else dir.dirs.push_back(input(str));
cin >> str;
}
return dir;
}
void iprintf(int level,string str)
{
int i;
for(i = 0; i < level; ++i)
{
cout << "| ";
}
cout << str << endl;
return;
}
void output(Dir dir,int level)
{
iprintf(level,dir.name);
int v_i;
for(v_i = 0; v_i != dir.dirs.size(); ++v_i) output(dir.dirs[v_i],level + 1);
sort(dir.files.begin(),dir.files.end());
for(v_i = 0; v_i != dir.files.size(); ++v_i) iprintf(level,dir.files[v_i]);
return;
}
int main()
{
//freopen("C://input.txt","r",stdin);
int count = 1;
Dir dir = input("ROOT");
while(dir.name == "ROOT")
{
cout << "DATA SET " << count++ << ":" << endl;
output(dir,0);
cout << endl;
dir = input("ROOT");
}
return 0;
}
参考三
这道题刚开始的想法就是把属于文件的名称与一个文件夹中的所有条目存入不同的数组中,然后分别输出。
但是最终做的时候如何去判断到底是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;
}