c语言之文件操作程序

本文介绍了一个C语言程序,该程序能够对C源代码进行多种处理,包括检查main函数的存在性、调整大括号的位置使其独占一行以及将指定范围内的代码转换为注释形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*

 题目要求:
用 C 语言写的源程序是一种文本文件。本项目以 C 语言的源程序为操作对象,完成对源程序的一系列处理,如判断是否有 main 函数、将某些行加上注释等。各功能可以分别编制一个程序实现(建议用这种简单的方案),也可以编制一个程序文件,各功能作为程序中的模块。
(1)读入一个 C 程序,判断其中是否只有一个 main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,或者“不能定义多个 main()函数”。
提示 1:简单处理,可以只比较判断“main()”,考虑实际上的各种可能,main 后面的括号中有任意多个空格及 void 的都应该算在内。建议按最简单的情形处理。
提示 2:建议设计一个函数 is_sub_sring(char *s1, char* s2),函数用于判断 s1 是否“包含”在读入的一行 s2 中。调用时,用“main()”与读到的代码与字符串进行比较,形参 s1 对应的实参用“main()”即可。这样写提升了“抽象”级别,更容易实现,对应更高的代码质量。
(2)读入一个 C 语言程序,使程序中的所有左花括号“{”和右花括号“}”都单独占一行,修改后的程序保存到另一个.c 文件中,并在屏幕上显示处理过的程序,显示时加上行号。
(3)读入一个 C 语言程序,输入 m、n 两个数字,从第 m 行起的 n 行代码将作为注释使用(即在这些行前面加上“//”),修改的程序保存到另一个.c 文件中,并在屏幕上显示处理过的程序,显示时加上行号。*/



#include<stdio.h>
#include<string.h>
#include<stdlib.h>

FILE *file_open(char *filename,char *mode)   // 按照指定mode打开文件filename
{
    FILE *fp=fopen(filename,mode);
    if(fp==NULL)                            // 打开文件失败
{
        fprintf(stderr,"error open file\n");
        exit(-1);
    }
    return fp;
}


int is_sub_sring(char s1[], char s2[]) //判断函数中是否有main()
{
int i;
for(i=0;i<10;i++)
if(s1[i]!=s2[i])
break;
if(i==10)
return 1;
else
return 0;
}


void pd_main(FILE *fp1) //判断main函数
{
char string1[256],string2[15]="int main()";
int count=0;
fgets(string1, 256, fp1);                     // 从源文件中读入字符串
    while(!feof(fp1))                           // 若未结束
    {
if(is_sub_sring(string1,string2)==1)//判断函数中的main()
count++;
        fgets(string1, 256, fp1);                 // 继续从源文件中读入字符串
    }
if(count==0)
printf("\t没有main()函数\n");
else if(count==1)
printf("\t暂时没有发现问题\n");
else
printf("\t不能定义多个 main()函数\n");
}




void show_all(FILE *fp) // 显示文件所有程序 
{  
int count=0;
char string[256];
    printf("所有程序\n");
fgets(string, 256, fp);                     // 从源文件中读入字符串 
     while(!feof(fp))
    {
count++;
printf("%d.",count);
printf("%s",string);
fgets(string, 256, fp);                     // 从源文件中读入字符串 
    }
    return ;
}


void change_braces(FILE *fp1) //修改括号
{
FILE *fp2;
char str1='\n',str2;
fp2 =file_open("vc2.c","w");// 打开文件写
    while(!feof(fp1))                           // 若未结束 
    {
str2=fgetc(fp1);                     // 从源文件中读入字符
if((str2=='{'||str2=='}')&&(str1!='\n'))
fputc('\n', fp2);//读入一个字符
else if((str1=='{'||str1=='}')&&(str2!='\n'))
fputc('\n', fp2); 
fputc(str2, fp2);
str1=str2;


    }
fclose(fp2);
fp2=file_open("vc2.c","r");
show_all(fp2);// 显示文件所有程序
fclose(fp2);
}




void change_cx(FILE *fp1) //注释代码
{
FILE *fp2;
int i,k,m,n,count=0;
char string1[256];
fp2 =file_open("vc3.c","w");// 打开文件写
printf("请输入要注释的行m和n\n");
scanf("%d%d",&m,&n);
fgets(string1, 256, fp1);                     // 从源文件中读入字符串 
    while(!feof(fp1))                           // 若未结束 
    {
count++;
if(count>=m&&count<=n+m)
{
k=strlen(string1);
for(i=k+2;i>=2;i--)
string1[i]=string1[i-2];
string1[1]='/';
string1[0]='/';
}
fputs(string1, fp2);    
        fgets(string1, 256, fp1);                 // 继续从源文件中读入字符串 
    }
fclose(fp2);
fp2=file_open("vc3.c","r");
show_all(fp2);// 显示文件所有程序
fclose(fp2);
}


int main()
{
int a;
FILE *fp1;
while(1)
{
system("cls");//执行控制台命令cls,就是CMD下面的cls,功能是清屏,清除所有显示的信息
printf("\t\t\t\t请选择:\n\t\t\t\t0--退出\n\t\t\t\t");
printf("1--判断其中是否只有一个 main()函数\n\t\t\t\t2--修改括号\n\t\t\t\t3--注释代码\n");
fflush(stdin);//用来清空输入缓存,以便不影响后面输入的东西
fp1 =file_open("vc1.c","r");  // 打开文件读 
scanf("%d",&a);
if(a==0)
break;
switch(a)
{
case 1: pd_main(fp1); break; //判断main函数
case 2: change_braces(fp1); break; //修改括号
case 3: change_cx(fp1); break;//注释代码
default : printf("\t输入无效,请重新输入:\n"); break;
}
fclose(fp1);
system("pause");
}
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值