LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2198|回复: 30

我想写个给程序统计行数的程序,大家有什么建议?

[复制链接]
发表于 2004-3-17 21:14:57 | 显示全部楼层 |阅读模式
主要是我的php程序,在网上找了找,居然没有这种东西,有个用VC写的一个程序不错,可以数c,c++,vb,perl,java,偏偏就没有php,于是今天用了半天时间自己用php写了一个,不过目前只能统计总文件大小,总行数,空行数和注释行数,剩下的就是实际代码行数。不过功能似乎太简单了。我想加上函数个数,变量个数,php和html代码的行数,再增强一下对注释的处理。
如果做的顺手,就做成插件样子的,增加插件以处理不同的语言。
不知道大家有没有兴趣?还有什么建议?
发表于 2004-3-18 07:36:11 | 显示全部楼层
统计\0的数量。
发表于 2004-3-20 18:37:57 | 显示全部楼层
\n
发表于 2004-3-20 21:10:04 | 显示全部楼层
到底是\0 还是 \n呢?
写了不行的,请大家指教:rolleyes: :rolleyes:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #define MAXLINE 1
  6. int
  7. main(void)
  8. {
  9.     int  fd,n,count ;
  10.     char buf[MAXLINE];
  11.     if((fd=open("abcd",O_RDONLY))<0) {
  12.            printf(" open abcd error\n");
  13.            return(-1);
  14.     }
  15.     while((n=read(fd,buf,MAXLINE))>0)
  16.            if(n=='\0')
  17.                count +=1 ;
  18.     if(n<0) {
  19.            printf("read error\n");
  20.            return(1);
  21.     }
  22.     printf("lines count is %d\n",count);
  23.     return(0);
  24. }

  25. /forum/c/tmp# cat abcd
  26. 12323
  27. 232

  28. /forum/c/tmp# ./a.out
  29. lines count is 134513734
  30. /forum/c/tmp#

复制代码

:help :help
这是正确的程序:

  1. #define MAXLINE 2
  2. #define RDONLY 00
  3. int main()
  4. {
  5.     int  fd,n,count=0 ;
  6.     char buf[MAXLINE];
  7.     if((fd=open("abcd",RDONLY))<0) {
  8.            printf(" open abcd error\n");
  9.            return(-1);
  10.     }
  11.     while((n=read(fd,buf,1))>0)
  12.     {
  13.         if(buf[0]==0x0A)
  14. /*   or if(buf[0]=='\0') */
  15.                 count +=1 ;
  16.     }
  17.     printf("lines count is %d\n",count);
  18.     close(fd);
  19.     return(0);
  20. }

复制代码

发表于 2004-3-20 21:24:28 | 显示全部楼层
if(n== '\n') 应该是 if(c== '\n')
楼主说的东西没这么简单,用你这个程序肯定是不行,这个程序用perl写应该好写一点。

有些东西应该先明确一下,程序里的一行到底应该是文本的一行还是程序的一条语句(表达式加分号)?
比如:
i =
20;
这个算一行还是两行?等等的还有很多问题,明确了以后程序就好写了。
发表于 2004-3-20 21:32:36 | 显示全部楼层
谢谢libinary!!写了个新的,结果怎么是这样?你说的我都不懂。:rolleyes: :rolleyes:
发表于 2004-3-20 22:00:37 | 显示全部楼层
首先,你的count没有初始化 count = 0;
另外:

  1. while((n=read(fd,buf,MAXLINE))>0)
  2.            if(n=='\0')
  3.                count +=1 ;
复制代码

这里是错的,read返回的是读入的字符数,你读入的内容是在buf里,应该比较的是 buf[0] == '\0'

注意,字符串里的'\0'是对内存里的char *说的,文件里一般没有'\0',如果你这样读入一个文件并查找'\0'的话,应该是一个都找不到
发表于 2004-3-20 22:06:08 | 显示全部楼层
要统计文本文件行数,简单的就用:

  1. #! /usr/bin/perl -w

  2. @doc = <>;
  3. print @doc+0, "\n";
复制代码
发表于 2004-3-20 22:43:28 | 显示全部楼层
谢谢!! CU的hoxide提供了另一种方法:
buf[0]==0x0A

谢谢大家!!
我把上面的修改正确。。
发表于 2004-3-22 22:44:54 | 显示全部楼层
写一个简单的行统计程序,只考虑物理上的行,不考虑逻辑上几行合为一行,可以从文件或标准输入得到输入.

  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.   FILE *fp;  
  5.   int c, nl;

  6.   if (argc > 2) {  /* error input */
  7.     printf("Usage: lc or lc filename\n");
  8.     return 1;
  9.   }

  10.   if (argc == 1)  /* no args: use standard input */
  11.     fp = stdin;
  12.   else  /* 2 args */
  13.     fp = fopen(*++argv, "r");  /* else open the file */

  14.   if (fp == NULL) {
  15.     printf("lc: Can't open %s\n", *argv);
  16.     return 1;
  17.   }

  18.   nl = 0;
  19.   while ((c = getc(fp)) != EOF)
  20.     if (c == '\n')
  21.       ++nl;
  22.   
  23.   printf("Total line(s): %d\n", nl);
  24.   return 0;
  25. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表