Linux wc命令用于计算字数。利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为”-“,则wc指令会从标准输入设备读取数据。
wc自己有源码。不过有些老师会让学生用C来写源码,如果你们直接复制粘贴会被老师PASS。这里是我写的源码,可以基本实现,也请大家多多指教。
#include <stdio.h>
#include <string.h>
void wc(FILE *ofile, FILE *infile, char *inname);
int main(int argc, char *argv[]){
char *filename = NULL;
char *filename2 = NULL;
FILE *file1 = NULL;
FILE *file2 = NULL;
if(argc >= 2){ // 如果指定了输入文件
filename = argv[1];
if((file1 = fopen(filename, “rb”)) == NULL){
perror(filename);
return 0;
}
if(argc == 3){ // 如果还指定了输出文件
filename2 = argv[2];
if((file2 = fopen(filename2, “w”)) == NULL){
perror(filename2);
return 0;
}
}
}
wc(file1, file2, filename);
return 0;
}
void wc(FILE *ofile, FILE *infile, char *inname){
char buffer[1003]; //缓冲区,存储读取到的每行的内容
int bufferLen;
int i;// 当前读到缓冲区的第i个字符
char c;// 读取到的字符
int isLastBlank = 0;// 上个字符是否是空格
int charNum = 0; // 字符数
int wordNum = 0; // 单词数
int lineNum = 0;
if(ofile == NULL){// 处理标准输入
ofile = stdin;
}
// 每次读取一行数据,保存到buffer,每行最多只能有1000个字符
while(fgets(buffer, 1003, ofile) != NULL){
bufferLen = strlen(buffer);
// 遍历缓冲区的内容
for(i=0; i<bufferLen; i++){
c = buffer[i];
if( c == ‘ ‘ || c == ‘\t’){ // 遇到空格
!isLastBlank && wordNum++; // 如果上个字符不是空格,那么单词数加1
isLastBlank = 1;
}
else if(c != ‘\n’ && c != ‘\r’){ // 忽略换行符
// 如果既不是换行符也不是空格,字符数加1
isLastBlank = 0;
}
charNum++;
}
!isLastBlank && wordNum++; // 如果最后一个字符不是空格,那么单词数加1
isLastBlank = 1; // 每次换行重置为1
// 一行结束,计算总字符数、总单词数、总行数
lineNum++; // 总行数
}
if(infile == NULL){ // 若没有指定写入文件
if((infile = fopen(“file.txt”, “w+”)) == NULL){
perror(“file.txt”);
return;
}
}
// 写入文件
char p[10000]={0};
sprintf(p, “%d”, lineNum);
fputs(p, infile);
fputs(” “, infile);
sprintf(p, “%d”, wordNum);
fputs(p, infile);
fputs(” “, infile);
sprintf(p, “%d”, charNum);
fputs(p, infile);
fputs(” “, infile);
fputs(inname, infile);
fclose(ofile);
fclose(infile);
// 打印统计结果
if(inname)
printf(“%d %d %d %s\n”, lineNum, wordNum, charNum, inname);
else printf(“%d %d %d\n”, lineNum, wordNum, charNum);
return;
}
本文为原创文章,转载请注明出处!