wc.exe命令行程序——c语言实现

时间:2020-12-09 23:23:17
  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 }