1777:文件結構“圖”
- 查看
- 提交
- 統計
- 提問
- 總時間限制:?
- 1000ms 內存限制:?
- 65536kB
- 描述
-
在計算機上看到文件系統的結構通常很有用。Microsoft Windows上面的"explorer"程序就是這樣的一個例子。但是在有圖形界面之前,沒有圖形化的表示方法的,那時候最好的方式是把目錄和文件的結構顯示成一個"圖"的樣子,而且使用縮排的形式來表示目錄的結構。比如:
ROOT
| dir1
| file1
| file2
| file3
| dir2
| dir3
| file1
file1
file2這個圖說明:ROOT目錄包括三個子目錄和兩個文件。第一個子目錄包含3個文件,第二個子目錄是空的,第三個子目錄包含一個文件。
輸入 - 你的任務是寫一個程序讀取一些測試數據。每組測試數據表示一個計算機的文件結構。每組測試數據以'*'結尾,而所有合理的輸入數據以'#'結尾。一組測試數據包括一些文件和目錄的名字(雖然在輸入中我們沒有給出,但是我們總假設ROOT目錄是最外層的目錄)。在輸入中,以']'表示一個目錄的內容的結束。目錄名字的第一個字母是'd',文件名字的第一個字母是'f'。文件名可能有擴展名也可能沒有(比如fmyfile.dat和fmyfile)。文件和目錄的名字中都不包括空格,長度都不超過30。一個目錄下的子目錄個數和文件個數之和不超過30。 輸出
- 在顯示一個目錄中內容的時候,先顯示其中的子目錄(如果有的話),然后再顯示文件(如果有的話)。文件要求按照名字的字母表的順序顯示(目錄不用按照名字的字母表順序顯示,只需要按照目錄出現的先后顯示)。對每一組測試數據,我們要先輸出"DATA SET x:",這里x是測試數據的編號(從1開始)。在兩組測試數據之間要輸出一個空行來隔開。
你需要注意的是,我們使用一個'|'和5個空格來表示出縮排的層次。 樣例輸入 -
file1 file2 dir3 dir2 file1 file2 ] ] file4 dir1 ] file3 * file2 file1 * #
樣例輸出 -
DATA SET 1: ROOT | dir3 | | dir2 | | file1 | | file2 | dir1 file1 file2 file3 file4DATA SET 2: ROOT file1 file2
提示 - 一個目錄和它的子目錄處于不同的層次
一個目錄和它的里面的文件處于同一層次 來源 - 翻譯自 Pacific Northwest 1998 的試題
?
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 using namespace std; 5 string a; 6 int cc;//輸出深度 7 int now=1;//記錄當前*數量 8 int flag=0; 9 void work() 10 { 11 string str[50];//儲存該目錄下的文件 12 int l=0; 13 while(cin>>a) 14 { 15 if(flag==0&&a[0]!='#') 16 { 17 cout<<"DATA SET "<<now<<":"<<endl; 18 cout<<"ROOT"<<endl; 19 flag=1; 20 } 21 if(a[0]=='#') 22 return; 23 else if(a[0]=='*') 24 { 25 cc=0; 26 sort(str+0,str+l); 27 for(int i=0;i<l;i++) 28 { 29 cout<<str[i]<<endl; 30 } 31 cout<<endl; 32 now++; 33 //cout<<"DATA SET "<<now<<":"<<endl; 34 //cout<<"ROOT"<<endl; 35 flag=0; 36 work(); 37 } 38 else if(a[0]=='d') 39 { 40 //cc++; 41 //str[l]=a; 42 //l++; 43 cc++; 44 for(int i=1;i<=cc;i++) 45 { 46 cout<<"|"; 47 for(int j=1;j<=5;j++) 48 cout<<" "; 49 } 50 cout<<a<<endl; 51 work(); 52 } 53 else if(a[0]=='f') 54 { 55 56 str[l]=a; 57 l++; 58 continue; 59 } 60 else if(a[0]==']') 61 { 62 63 sort(str+0,str+l); 64 for(int i=0;i<l;i++) 65 { 66 for(int k=1;k<=cc;k++) 67 { 68 cout<<"|"; 69 for(int j=1;j<=5;j++) 70 cout<<" "; 71 } 72 cout<<str[i]<<endl; 73 } 74 cc--; 75 return; 76 } 77 } 78 } 79 int main() 80 { 81 //freopen("r.txt","r",stdin); 82 //freopen("w.txt","w",stdout); 83 work(); 84 return 0; 85 }
?