-
Notifications
You must be signed in to change notification settings - Fork 0
/
wc.cpp
198 lines (192 loc) · 4.62 KB
/
wc.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
void CharCount(char path[]); //字符统计
void WordCount(char path[]); //单词统计
void LineCount(char path[]); //行数统计
void AllCount(char path[]); //综合统计(代码行,空行,注释行)
int main()
{
char input[100],path[50];
printf("-c 文件地址 返回字符数\n");
printf("-w 文件地址 返回单词数\n");
printf("-l 文件地址 返回行数\n");
printf("-a 文件地址 返回代码行、空行、注释行数\n");
printf("请输入命令:");
gets(input);
int count=strlen(input);
strncpy(path, input + 10, count - 10);//将命令行输入的地址赋值给path
path[count - 9] = '\0';//路径结尾添加结束符,避免统计类型时出错
int check = 1;
//检查类型
while (check)
{
int i = 7;
if ((input[i] == '-') && (input[i + 1] == 'c'))
{
CharCount(path);
break;
}
if ((input[i] == '-') && (input[i + 1] == 'w'))
{
WordCount(path);
break;
}
if ((input[i] == '-') && (input[i + 1] == 'l'))
{
LineCount(path);
break;
}
if ((input[i] == '-') && (input[i + 1] == 'a'))
{
AllCount(path);
break;
}
}
return 0;
}
void CharCount(char path[]) //字符统计函数
{
FILE *fp=NULL;
int a = 0;
char ch;
char *path_1 = path;
int k = strlen(path);
*(path_1 + k-1) = '\0';
if ((fp = fopen(path_1 , "r")) == NULL)
{
printf("文件读取失败");
exit(0);
}
ch = fgetc(fp);
while (ch != EOF)
{
a++;
ch = fgetc(fp);
}
printf("字符数 :%d\n", a);
fclose(fp);
}
void WordCount(char path[]) //单词统计函数
{
FILE *fp;
int b = 0;
char ch;
char *path_1 = path;
int k = strlen(path);
*(path_1 + k - 1) = '\0';
if ((fp = fopen(path_1, "r")) == NULL)
{
printf("文件读取失败");
exit(0);
}
//fgetc()会返回读取到的字符,若返回EOF则表示到了文件尾,或出现了错误。
ch = fgetc(fp);
while (ch != EOF)
{
if ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z') || (ch >= '0'&&ch <= '9'))//非空
{
while ((ch >= 'a'&&ch <= 'z') || (ch >= 'A'&&ch <= 'Z') || (ch >= '0'&&ch <= '9') || ch == '_')
{
ch = fgetc(fp);//直到遇见非字母/数字/下划线
}
b++;
ch = fgetc(fp);
}
else
{
ch = fgetc(fp);
}
}
printf("单词数:%d.\n", b);
fclose(fp);
}
void LineCount(char path[]) //行数统计函数
{
FILE *fp;
int c = 1;
char ch;
char *path_1 = path;
int k = strlen(path);
*(path_1 + k - 1) = '\0';
if ((fp = fopen(path_1, "r")) == NULL)
{
printf("文件读取失败");
exit(0);
}
//fgetc()会返回读取到的字符,若返回EOF则表示到了文件尾,或出现了错误。
ch = fgetc(fp);
//如果是换行符则l(line)++,否则继续读取下一个字符
while (ch != EOF)
{
if (ch == '\n')
{
c++;
ch = fgetc(fp);
}
else
{
ch = fgetc(fp);
}
}
printf("行数:%d.\n", c);
fclose(fp);
}
void AllCount(char path[]) //综合统计函数,包括代码行,空行,注释行
{
FILE *fp;
char ch;
char *path_1 = path;
int k = strlen(path);
*(path_1 + k - 1) = '\0';
int d = 0, e = 0, f = 0;
if ((fp = fopen(path_1, "r")) == NULL)
{
printf("文件读取失败");
exit(0);
}
//fgetc()会返回读取到的字符,若返回EOF则表示到了文件尾,或出现了错误。
ch = fgetc(fp);
while (ch != EOF)
{
if (ch == '{' || ch == '}')
{
e++;
ch = fgetc(fp);
}
else if (ch == '\n')
{
ch = fgetc(fp);
while (ch == '\n')
{
e++;
ch = fgetc(fp);
}
}
else if (ch == '/')
{
ch = fgetc(fp);
if (ch == '/')
while (ch != '\n')
{
ch = fgetc(fp);
}
f++;
ch = fgetc(fp);
}
else
{
d++;
while (ch != '{'&&ch != '}'&&ch != '\n'&&ch != '/'&&ch != EOF)
{
ch = fgetc(fp);
}
}
}
printf("代码行数 :%d.\n", d);
printf("空行数 :%d.\n", e);
printf("注释行数 :%d.\n", f);
fclose(fp);
}