1 /* 2 * 没能实现的功能:wc.exe -s递归处理目录下符合条件的文件 3 * wc.exe -x 显示图形界面 4 * 5 * 6 * 实现的功能: wc.exe -c显示文件的字符数、 7 * wc.exe -l行数、 8 * wc.exe -w单词、 9 * wc.exe -a空行数、代码行数、注释行数的统计测试 10 *` 11 * 12 */ 13 14 #include"iostream" 15 using namespace std; 16 void CharCount(char path[]); //字符统计函数 17 void WordCount(char path[]); //单词统计函数 18 void LineCount(char path[]); //行数统计函数 19 void Muiltiple(char path[]); //综合统计函数,包括代码行,空行,注释行 20 int main() 21 { 22 char input[100],path[50]; 23 gets(input); 24 int count=strlen(input); 25 strncpy(path, input + 10, count - 10); 26 path[count - 9] = '\0'; 27 //cout << path << endl; 28 int check = 1; 29 while (check) 30 { 31 int i = 7; 32 if ((input[i] == '-') && (input[i + 1] == 'c')) 33 { 34 CharCount(path); 35 break; 36 } 37 if ((input[i] == '-') && (input[i + 1] == 'w')) 38 { 39 WordCount(path); 40 break; 41 } 42 if ((input[i] == '-') && (input[i + 1] == 'l')) 43 { 44 LineCount(path); 45 break; 46 } 47 if ((input[i] == '-') && (input[i + 1] == 'a')) 48 { 49 Muiltiple(path); 50 break; 51 }//获取文件名 52 } 53 system("pause"); 54 return 0; 55 } 56 void CharCount(char path[]) //字符统计函数 57 { 58 FILE *fp=NULL; 59 int c = 0; 60 char ch; 61 cout << path<<endl; 62 char *path3 = path; 63 int k = strlen(path); 64 *(path3 + k-1) = '\0'; 65 //cout << path3<<endl; 66 if ((fp = fopen(path3 , "r")) == NULL) 67 { 68 printf("file read failure."); 69 exit(0); 70 } 71 ch = fgetc(fp); 72 while (ch != EOF) 73 { 74 c++; 75 ch = fgetc(fp); 76 } 77 cout << "char count is :" << c << endl; 78 c--; 79 fclose(fp); 80 } 81 82 void WordCount(char path[]) //单词统计函数 83 { 84 FILE *fp; 85 int w = 0; 86 char ch; 87 char *path3 = path; 88 int k = strlen(path); 89 *(path3 + k - 1) = '\0'; 90 if ((fp = fopen(path3, "r")) == NULL) 91 { 92 printf("file read failure."); 93 exit(0); 94 } 95 //fgetc()会返回读取到的字符,若返回EOF则表示到了文件尾,或出现了错误。 96 ch = fgetc(fp); 97 while (ch != EOF) 98 { 99 if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z') || (ch >= '0'&&ch <= '9')) 100 { 101 while ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z') || (ch >= '0'&&ch <= '9') || ch == '_') 102 { 103 ch = fgetc(fp); 104 } 105 w++; 106 ch = fgetc(fp); 107 } 108 else 109 { 110 ch = fgetc(fp); 111 } 112 } 113 printf("word count is :%d.\n", w); 114 fclose(fp); 115 116 } 117 118 void LineCount(char path[]) //行数统计函数 119 { 120 FILE *fp; 121 int l = 1; 122 char ch; 123 char *path3 = path; 124 int k = strlen(path); 125 *(path3 + k - 1) = '\0'; 126 if ((fp = fopen(path3, "r")) == NULL) 127 { 128 printf("file read failure."); 129 exit(0); 130 } 131 //fgetc()会返回读取到的字符,若返回EOF则表示到了文件尾,或出现了错误。 132 ch = fgetc(fp); 133 while (ch != EOF) 134 { 135 if (ch == '\n') 136 { 137 l++; 138 ch = fgetc(fp); 139 } 140 else 141 { 142 ch = fgetc(fp); 143 } 144 } 145 l--; 146 printf("line count is :%d.\n", l); 147 fclose(fp); 148 } 149 150 void Muiltiple(char path[]) //综合统计函数,包括代码行,空行,注释行 151 { 152 FILE *fp; 153 char ch; 154 char *path3 = path; 155 int k = strlen(path); 156 *(path3 + k - 1) = '\0'; 157 int c = 0, e = 0, n = 0; 158 if ((fp = fopen(path3, "r")) == NULL) 159 { 160 printf("file read failure."); 161 exit(0); 162 } 163 //fgetc()会返回读取到的字符,若返回EOF则表示到了文件尾,或出现了错误。 164 ch = fgetc(fp); 165 while (ch != EOF) 166 { 167 if (ch == '{' || ch == '}') 168 { 169 e++; 170 ch = fgetc(fp); 171 } 172 else if (ch == '\n') 173 { 174 ch = fgetc(fp); 175 while (ch == '\n') 176 { 177 e++; 178 ch = fgetc(fp); 179 } 180 } 181 else if (ch == '/') 182 { 183 ch = fgetc(fp); 184 if (ch == '/') 185 while (ch != '\n') 186 { 187 ch = fgetc(fp); 188 } 189 n++; 190 ch = fgetc(fp); 191 } 192 else 193 { 194 c++; 195 while (ch != '{'&&ch != '}'&&ch != '\n'&&ch != '/'&&ch != EOF) 196 { 197 ch = fgetc(fp); 198 } 199 } 200 201 } 202 printf("code line count is :%d.\n", c); 203 printf("empt line count is :%d.\n", e); 204 printf("note line count is :%d.\n", n); 205 fclose(fp); 206 }