⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wc.c

📁 在linux9中实现统计文件的功能
💻 C
字号:
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>

void showhelp(void);
void showversion(void);
void showerr_s(char * s);
void showerr_c(char c);


int main(int argc, char * argv[])
{
     FILE *fp;
     int  nOver = 1;
     int cflag = 0, mflag = 0, lflag = 0, Lflag = 0, wflag = 0;
     int i = 0, j = 0, k = 0;
     char curChar,preChar;
     long noLines = 0,noWords = 0,noCharacters = 0,noBytes = 0,nomaxlen = 0;
     long tnoLines = 0,tnoWords = 0,tnoCharacters = 0,tnoBytes = 0,tnomaxlen = 0;
     long lentemp = 0;
     char * filename[30];  
     for(i = 1; i<argc; i++)  
     {
         if(argv[i][0] == '-')
         {
              if(argv[i][1] == '-')
              {
                   if(strcmp(argv[i],"--help")==0)
                   {
                       showhelp();
                       exit(0);
                   }
                   else if(strcmp(argv[i],"--version")==0)
                   {
                       showversion();
                       exit(0);
                   }
                  
                   else
                   {
                       showerr_s(argv[i]);
                       exit(1);
                   }
              }

              else    
	      {
                   for(j = 1; j<strlen(argv[i]); j++)
                   {
                       switch(argv[i][j])
                       {
                       case 'c':
                            cflag = 1;
                            break;

                       case 'm':
                            mflag = 1;

                            break;

                       case 'l':
                            lflag = 1;

                            break;

                       case 'L':
                            Lflag = 1;

                            break;

                       case 'w':
                            wflag = 1;

                            break;

                       default:
                            {
                                 showerr_c(argv[i][j]);
                                 exit(1);
                            }
                       }
		}
	  }
    }

         else              
         {                 
              filename[k] = argv[i];
              k++;
         }
     }

     if(k == 0)     
     {
         preChar = 0;
         curChar = getchar();
         noLines = 0;
         while(nOver)
         {
              switch(curChar)
              {
              case '\t':
              case ' ':
                   if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)
                       noWords++;
                       noBytes++;
                       lentemp++;
                   break;

              case '\n':
                   if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)
                       noWords++;
                       noLines++;
                       noBytes++;

                   if(lentemp>nomaxlen)
                       nomaxlen = lentemp;
                       lentemp = 0;
                    break;

              case 4:            
              case 0:            
              case 27:       
                   nOver = 0;
                   if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)
                       noWords++;
                   break;

              default:
                   noBytes++;
                   lentemp++;

                   if(isalpha(curChar))
                       noCharacters++;
              }
              preChar = curChar;
              curChar = getchar();
         }
      
         if(cflag == 0 && lflag == 0 && wflag == 0 && mflag == 0 && Lflag == 0)
              printf("\t%d\t%d\t%d\n",noLines+1,noWords,noBytes);

         else
         {
              if(lflag == 1)
                   printf("\t%d",noLines);
              if(wflag == 1)
                   printf("\t%d",noWords);
              if(cflag == 1)
                   printf("\t%d",noBytes);
              if(mflag == 1)
                   printf("\t%d",noCharacters);
              if(Lflag == 1)
                   printf("\t%d",nomaxlen);
                   printf("\n");
         }
     }

     else   
     {
         for(j = 0; j<k; j++)
         {
              noLines = 0;
              noWords = 0;
              noCharacters = 0;
              noBytes = 0;
              if( (fp = fopen(filename[j],"r"))==NULL )
              {
                   printf("mywc: %s: not exists or other errors occur\n",filename[j]);
                   continue;
              }
              preChar = 0;

              while((curChar = fgetc(fp))!=EOF)
              {
                   switch(curChar)
                   {
                   case '\t':
                   case ' ':
                       if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)

                           noWords++;
                           noBytes++;
                           lentemp++;
                       break;

                   case '\n':
                       if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)
                            noWords++;
                            noLines++;
                            noBytes++;

                       if(lentemp>nomaxlen)
                       {
                            nomaxlen = lentemp;
                            if(nomaxlen>tnomaxlen)
                                tnomaxlen = nomaxlen;
                       }
                       lentemp = 0;
                       break;

                   default:
                       noBytes++;
                       lentemp++;
                       if(isalpha(curChar))
                            noCharacters++;
                        break;
                   }
                   preChar = curChar;
              }


              if(preChar!=' '&&preChar!='\t'&&preChar!='\n'&&preChar!=0)
              {
                   noWords++;
                   if(lentemp>nomaxlen)
                   {
                       nomaxlen = lentemp;
                       if(nomaxlen>tnomaxlen)
                            tnomaxlen = nomaxlen;
                   }
              }

             fclose(fp);         

              if(cflag == 0 && lflag == 0 && wflag == 0 && mflag == 0 && Lflag == 0)
                   printf("\t%d\t%d\t%d\t%s\n",noLines,noWords,noBytes,filename[j]);

              else
              {
                   if(lflag == 1)
                       printf("\t%d",noLines);
                   if(wflag == 1)
                       printf("\t%d",noWords);
                   if(cflag == 1)
                       printf("\t%d",noBytes);
                   if(mflag == 1)
                       printf("\t%d",noCharacters);
                   if(Lflag == 1)
                       printf("\t%d",nomaxlen);
                   printf("\t%s\n",filename[j]);
              }

         tnoLines += noLines;

         tnoWords += noWords;

         tnoCharacters += noCharacters;

         tnoBytes += noBytes;

         nomaxlen = 0;
         }

     }

     if(k>1)
     {
         if(cflag == 0 && lflag == 0 && wflag == 0 && mflag == 0 && Lflag == 0)
              printf("\t%d\t%d\t%d\tgeneral\n",tnoLines,tnoWords,tnoBytes);
         else
         {
              if(lflag == 1)
                   printf("\t%d",tnoLines);
              if(wflag == 1)
                   printf("\t%d",tnoWords);
              if(cflag == 1)
                   printf("\t%d",tnoBytes);
              if(mflag == 1)
                   printf("\t%d",tnoCharacters);
              if(Lflag == 1)
                   printf("\t%d",tnomaxlen);
              printf("\tgeneral\n");
         }
     }
	 return 0;
}


void showhelp(void)
{
     printf("usage: mywc [option]...[FILE]...\n");
     printf("Print byte,word,and newline counts for each FILE,and a total line if more than one FILE is specified. With on File,read standard input, press key [Esc] to end inputting\n");
     printf("\t-c, --bytes\tPrint the byte counts.\n");
     printf("\t-m, --chars\tPrint the character counts.\n");
     printf("\t-l, --lines\tPrint the newline counts.\n");
     printf("\t-L, --max-line-length\tPrint the length of the longest line.\n");
     printf("\t-w, --words\tPrint the word counts.\n");
     printf("\t    --help\tPrint this usage message and then exit\n");
     printf("\t    --version\tPrint version information and then exit.\n");
     printf("\nReport bugs to <gary@mail.hdss.org>.\n");
}


void showversion(void)
{
     printf("mywc by imitating wc in Redhat 9.0\n");
     printf("Written by Gary(02101231).\n");
     printf("This version is free.\n");
}


void showerr_s(char * s)
{
     printf("mywc: can't identify option \"%s\"\n",s);
     printf("try \"mywc --help\" to get more infomations\n");
}


void showerr_c(char c)
{
     printf("mywc: wrong option -\"%c\"\n",c);
     printf("try \"mywc --help\" to get more infomations\n");
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -