fork download
  1. /*
  2.   プログラミングのお題スレ Part15
  3.   https://m...content-available-to-author-only...h.net/test/read.cgi/tech/1564310397/588
  4.  
  5.   588デフォルトの名無しさん2019/09/28(土) 01:09:55.39ID:HcOq9X6n>>590>>596>>602
  6.   お題: 指定のディレクトリ以下にある全てのファイルの更新日時を取得し、曜日毎、及び時間毎にしてグラフにして出せ。
  7.  
  8.   これは同じ曜日の同じ時間で更新されているファイルのカウントということね。例えば今週と先週の土曜日の7:00代の更新ファイルが一つづつあれば土曜日7時代のカウントが2になる。
  9.   で、グラフにする時は表示方法はなんでもいいので例えばテキストでアスタリスク2個で出す。(後でこちらでもプログラム作るのでそれ参考にしてもいい)。
  10.   ディレクトリの指定方法は普通なら引数での指定が良いだろうけどプログラムに埋め込んでも標準入力やファイルから読み込んでも何でもいい。それはこのお題では肝心な事ではないので。
  11. */
  12. /*
  13. - 実行環境
  14.   Ubuntu 18.04.3 LTS (VMware Workstation 15 Player で仮想化)
  15.   gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
  16.  
  17. - 実行例
  18.   user@ubuntu:~$ ./a.out
  19.   . を読み込み中
  20.   ./Documents を読み込み中
  21.   :
  22.   :
  23.   :
  24.   ./Pictures を読み込み中
  25.   ./Downloads を読み込み中
  26.   データ取得完了
  27.  
  28. HOUR : SUN MON TUE WED THU FRI SAT
  29.   00 : 3* 0 0 0 0 0 0
  30.   01 : 3* 0 0 0 0 0 0
  31.   02 : 0 0 0 0 0 0 0
  32.   03 : 0 0 0 0 0 0 0
  33.   04 : 0 0 0 0 0 0 0
  34.   05 : 0 0 0 0 0 0 0
  35.   06 : 0 0 0 0 0 0 0
  36.   07 : 0 0 0 0 0 0 0
  37.   08 : 0 0 0 0 0 0 0
  38.   09 : 0 0 0 0 0 0 0
  39.   10 : 1 0 0 0 0 0 0
  40.   11 : 1 0 0 0 0 0 0
  41.   12 : 4* 0 0 0 1 0 1
  42.   13 : 1 0 0 0 0 0 0
  43.   14 : 0 0 0 0 0 0 0
  44.   15 : 0 0 0 0 2 0 0
  45.   16 : 2 0 0 0 0 0 3*
  46.   17 : 1 0 0 0 0 0 5**
  47.   18 : 2 1 0 0 6** 0 6**
  48.   19 : 0 2 2 0 3* 2 9***
  49.   20 : 0 0 1 2 0 2 7**
  50.   21 : 0 4* 3* 24********** 0 3* 0
  51.   22 : 4* 0 5** 3* 1 2 1
  52.   23 : 3* 1 2 2 2 1 4*
  53. sum = 138
  54. */
  55.  
  56. #include <stdio.h>
  57. #include <stdlib.h>
  58. #include <string.h>
  59. #include <time.h>
  60. #include <sys/types.h>
  61. #include <sys/stat.h>
  62. #include <unistd.h>
  63. #include <dirent.h>
  64.  
  65. #define BUFLEN 256
  66. #define MAXBAR 10 //グラフバーの最大表示文字列数
  67.  
  68. typedef struct{
  69. int n[7][24]; //week, hour
  70. //week;(sun == 0, mon == 1, ...)
  71. }hoge_t;
  72.  
  73. void foo(char [], hoge_t *);
  74. void foo(char ppath[], hoge_t *data){
  75. printf("%s を読み込み中\n",ppath);
  76. DIR *dir;
  77. if((dir = opendir(ppath)) == NULL){
  78. return;
  79. }
  80. struct dirent *dp;
  81. struct stat info;
  82. struct tm *tm;
  83. int wday,hour;
  84. char cpath[BUFLEN];
  85.  
  86. while ((dp = readdir(dir)) != NULL){
  87. if(dp->d_name[0] != '.'){
  88. memset(cpath, 0, BUFLEN);
  89. strncpy(cpath, ppath, BUFLEN);
  90. strncat(cpath, "/", BUFLEN);
  91. strncat(cpath, dp->d_name, BUFLEN);
  92. if(stat(cpath, &info) == 0){
  93. if(S_ISDIR(info.st_mode)){
  94. foo(cpath, data);
  95. }else if(S_ISREG(info.st_mode)){
  96. tm = localtime((time_t*)&info.st_atim.tv_sec);
  97. wday = tm->tm_wday;
  98. hour = tm->tm_hour;
  99. data->n[wday][hour]++;
  100. }
  101. }
  102. }
  103. }
  104. closedir(dir);
  105. }
  106.  
  107. void hoge_init(hoge_t *hoge){
  108. int i,j;
  109. for(i = 0; i < 24; i++){
  110. for(j = 0; j < 7; j++){
  111. hoge->n[j][i] = 0;
  112. }
  113. }
  114. }
  115.  
  116. void printch(int len, char c){
  117. int i;
  118. for(i = 0; i < len; i++){
  119. putchar(c);
  120. }
  121. }
  122.  
  123. void show_hoge_matrix(hoge_t *data){
  124. int i,j;
  125. int sum = 0, max = data->n[0][0], maxbar = MAXBAR;
  126. const int offset = 1;
  127.  
  128. for(i = 0; i < 24; i++){
  129. for(j = 0; j < 7; j++){
  130. if(max < data->n[j][i]){
  131. max = data->n[j][i];
  132. }
  133. sum += data->n[j][i];
  134. }
  135. }
  136. char week[7][4] = {"SUN","MON","TUE","WED","THU","FRI","SAT"};
  137. printf("HOUR : ");
  138. for(i = 0; i < 7; i++){
  139. printf("%s", week[i]);
  140. printch(maxbar + offset, ' ');
  141. }
  142. puts("");
  143.  
  144. for(i = 0; i < 24; i++){
  145. printf(" %02d :" , i);
  146. for(j = 0; j < 7; j++){
  147. printf("%3d", data->n[j][i]);
  148. //printf(",%4.1f%%", (double)data->n[j][i]/sum*100.0);
  149.  
  150. printch(maxbar * data->n[j][i] / max, '*');
  151. printch(maxbar - maxbar * data->n[j][i] / max, ' ');
  152. printf(" ");
  153. }
  154. puts("");
  155. }
  156. printf("sum = %d\n",sum);
  157. }
  158.  
  159. int main(int argc, char *argv[]){
  160. char path[BUFLEN] = {};
  161. if(argc <= 1){
  162. strncpy(path, ".", BUFLEN);
  163. }else{
  164. strncpy(path, argv[1], BUFLEN);
  165. }
  166. hoge_t data;
  167. hoge_init(&data);
  168. foo(path, &data);
  169. puts("データ取得完了\n");
  170. show_hoge_matrix(&data);
  171. return 0;
  172. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.c: In function ‘foo’:
prog.c:96:51: error: ‘struct stat’ has no member named ‘st_atim’; did you mean ‘st_atime’?
                     tm = localtime((time_t*)&info.st_atim.tv_sec);
                                                   ^~~~~~~
                                                   st_atime
stdout
Standard output is empty