统计代码行数

C语言对文件的操作


1.前言

学校内学习的高级语言程序设计这门课程教我们的都是C语言对内存的操作,而老师布置的这份作业要求我们统计代码的行数,实际上是对文件的操作。而这个知识正是我所欠缺的,正好有博客园这一个平台我就写一篇随笔来记录自己如何实现统计代码,也来帮助自己完善这一方面的知识,也欢迎与我有相同疑问的同学借鉴。

2.需要用到的函数

1.fopen(打开文件)

表头文件:#include < stdio.h >

定义函数:FILE*fopen(const char * path,const char * mode);

函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

文件打开失败时,函数会返回null值。

mode有下列几种形态字符串:
  • r 打开只读文件,该文件必须存在。
  • r+ 打开可读写的文件,该文件必须存在。
  • rt只读打开一个文本文件,只允许读数据。
  • w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
  • w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

范例

#include<stdio.h>
int main()
{
FILE *fp;
fp=fopen(noexist,"a+"");
if(fp==NULL) return;
fclose(fp);
}

2.fclose(关闭文件)

函数说明 fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。

返回值 若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。

3.fgetc(由文件中读取一个字符)

函数说明 fgetc()从参数stream所指的文件中读取一个字符。若读到文件尾而无数据时便返回EOF。


以上便是统计行数所需要用到的函数,如需了解C语文对文件操作的全部函数,可以参考http://www.jb51.net/article/37688.htm

3.我的代码

第一版

#include<stdio.h>
int main()
{
	int t,sum=0,i;
	FILE *fp;
	char filename[100000];
	printf("请输入文件名或文件地址:");
	scanf("%s",filename);
	fp=fopen(filename,"rt"); 
	while((t=fgetc(fp))!=EOF)
	{
		if(t=='\n')
		{
			sum=sum+1;
		}
	}
	fclose(fp);
	printf("%d\n",sum);
	return 0;
}

第一版的代码已经基本可以实现对文件行数的统计,但是只能统计一次,如需多次统计需关闭exe再打开,无疑减少了程序的可用性.

第二版

#include<stdio.h>
int main()
{
	int i,t,sum=0;
	FILE *fp;
	char filename[100000];
	for(i=0;;i++)
	{
	   printf("请输入文件名或文件地址:");
	   scanf("%s",filename);
	   fp=fopen(filename,"rt"); 
	   if(fp!=NULL)
      {
	       while((t=fgetc(fp))!=EOF)
	      {
		      if(t=='\n')
		     {
			    sum=sum+1;
		     }
	       }
       }
    else continue;
    fclose(fp);
	printf("%s共%d行代码\n",filename,sum);
   } 
   return 0;
}

第二版的代码加入了一个for的无限循环来实现多次统计代码行数,同时通过一个判断语句来判断输入的文件名或者文件地址是否可行.但是我又想到,既然是统计自己C语言一共写了多少行代码,是否可以再加入一个功能,把多次统计的代码做一个加法.

第三版

#include<stdio.h>
int main()
{
	int i,t,sum=0,lines[100000];
	FILE *fp;
	char filename[100000];
	for(i=0;;i++)
	{
	   printf("请输入文件名或文件地址:");
	   scanf("%s",filename);
	   fp=fopen(filename,"rt"); 
	   if(fp!=NULL)
      {
	       while((t=fgetc(fp))!=EOF)
	      {
		      if(t=='\n')
		     {
			    lines[i]=lines[i]+1;
		     }
	      }
       }
    else 
	{
	printf("文件名或文件地址输入错误\n");continue;
	}
    fclose(fp);
	printf("%s共%d行代码\n",filename,lines[i]);
    sum=sum+lines[i];
	printf("截止目前一共%d行代码\n",sum);
   } 
   return 0;
}

第四版

#include<stdio.h>
int main()
{
	int i,t,sum=0,lines[100000];
	FILE *fp;
	char filename[261];
	for(i=0;;i++)
	{
	   printf("请输入文件名或文件地址:");
	   gets(filename);
	   fp=fopen(filename,"rt"); 
	   if(fp!=NULL)
      {
	       while((t=fgetc(fp))!=EOF)
	      {
		      if(t=='\n')
		     {
			    lines[i]=lines[i]+1;
		     }
	      }
       }
    else 
	{
	printf("文件名或文件地址输入错误\n");continue;
	}
    fclose(fp);
	printf("%s共%d行代码\n",filename,lines[i]);
    sum=sum+lines[i];
	printf("截止目前一共%d行代码\n",sum);
   } 
   return 0;
}

考虑到文件名有可能含有空格所以把scanf函数换成gets函数,

Windows 系统的文件名受两方面的限制

1、文件名长度最大为255字符(其中包括文件扩展名)。

2、文件的全路径名长度最大为260字符。

以下为github连接:https://github.com/Travaill/homework1lines

感谢畅畅学长的建议

posted @ 2017-01-15 12:33  travail  阅读(551)  评论(2编辑  收藏  举报