###ランダムにディレクトリを移動するプログラム
まず,ホームディレクトリに移動し,そのディレクトリ内部のファイルやディレクトリを検索.
'.'を含まないものはカレント,親ディレクトリでもなく,ファイルでもないので,strchr関数でd_nameに'.'を含まないものだけをピックアップし,randを使ってそのうちのどれかに移動(または移動しない)を繰り返すプログラムを書きました.
Macでは動作するのですが,windowsでは次のようにうまくいきません
###動作の詳細
HomePath関数でホームディレクトリのパスを取得し.chdir(home)で移動.
RandomChange関数の中のforループに入りCountFile関数で'.'を含まないものをカウント,このカウント数+1の値で乱数の割り算のあまりを求めてnumに代入.
numとfile数が一致するとき移動をやめる.それ以外のときはCountFile関数で検索したどれかのディレクトリに移動.これをforループで回すを繰り返す.
###Windowsでの動作
コンパイルは通りますが,エラーメッセージが出ずに動かないのでどうしたら良いかこまっています.
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <dirent.h> 5#include <time.h> 6#include <unistd.h> 7 8DIR *DirOpen(DIR **dp); 9//FILE *FileOpen(FILE **fp, const char *filename, const char *mode); 10void getPWD(size_t size); 11 12char pwd[1024]; 13int fcount = 0; 14 15void HomePath(char home[]) { 16 if ((getenv("HOMEPATH")) != NULL) { 17 strcpy(home, getenv("HOMEPATH")); 18 } else if ((getenv("HOME")) != NULL) { 19 strcpy(home, getenv("HOME")); 20 } else { 21 fprintf(stderr, "No Exist\n"); 22 exit(1); 23 } 24 return; 25} 26 27int GetRandom(int max) { 28 return rand() % (max + 1); 29} 30int CountFile(void) { 31 DIR *dp; 32 struct dirent *dir; 33 int cnt = 0; 34 DirOpen(&dp); 35 puts("\nFile list"); 36 while ((dir = readdir(dp)) != NULL) { 37 if (strchr(dir->d_name, '.') != NULL) continue; 38 printf("# %d\t%s\n", cnt, dir->d_name); 39 cnt++; 40 } 41 closedir(dp); 42 return cnt; 43} 44 45void ChangeDir(int num) { 46 DIR *dp; 47 struct dirent *dir; 48 char RelPath[256]; 49 int i = 0; 50 51 DirOpen(&dp); 52 while ((dir = readdir(dp)) != NULL) { 53 if (strchr(dir->d_name, '.') != NULL) continue; 54 if (i == num) { 55// strtok(dir->d_name, ":"); 56 sprintf(RelPath, "./%s", dir->d_name); 57 closedir(dp); 58 chdir(RelPath); 59 return; 60 } 61 i++; 62 } 63 closedir(dp); 64 return; 65} 66 67void RandomChange(void) { 68 char home[256]; 69 int i, num, file; 70 HomePath(home); 71 chdir(home); 72 getPWD(sizeof(pwd) - 1); 73 printf("Home directly path -> %s\n", pwd); 74 puts("Start move."); 75 for (i=0; i<32; i++) { 76 file = CountFile(); 77 if (!file) { 78 puts("None"); 79 exit(1); 80 } 81 num = GetRandom(file); 82 83 printf("num: %d\n", num); 84 85 if (num == file) { 86 puts("Stop moving"); 87 exit(1); 88 } 89 ChangeDir(num); 90 getPWD(sizeof(pwd) - 1); 91 printf("\nMove %2d\n", i + 1); 92 printf("pwd -> %s\n", pwd); 93 } 94 getPWD(sizeof(pwd) - 1); 95 96 return; 97} 98 99int main(int argc, const char *argv[], char *envp[]) { 100 srand((unsigned int)time(NULL)); 101 RandomChange(); 102 return 0; 103} 104 105DIR *DirOpen(DIR **dp) { 106 const char *path = "."; 107 if ((*dp = opendir(path)) == NULL) { 108 fprintf(stderr, "Directly open error.\n"); 109 exit(1); 110 } 111 return *dp; 112} 113/* 114FILE *FileOpen(FILE **fp, const char *filename, const char *mode) { 115 if ((*fp = fopen(filename, mode)) == NULL) { 116 fprintf(stderr, "Fileopen error %d\n", fcount); 117 exit(1); 118 } 119 fcount++; 120 return *fp; 121} 122 */ 123void getPWD(size_t size) { 124 char *p; 125 p = getcwd(pwd, size); 126 if (p == NULL) { 127 fprintf(stderr, "PWD error.\n"); 128 exit(1); 129 } 130 return; 131} 132
回答4件
あなたの回答
tips
プレビュー