C语言|文件处理|将合法C源程序每行前加上行号并删除其所有注释

#include <stdio.h>
//定义函数,实现输出新文件,同时进行在行首添加行数和去除注释操作;
void deleteAndAddLineNumber(FILE *fp_1, FILE *fp_2);
int main()
{
    FILE *fp_1 = fopen("C:\\VS Code\\C Programs\\CFilesLearning\\files\\FilesDemo2_1_1.txt", "r");
    if(fp_1==NULL)
    {
        perror("File open failed:");
        exti(0);
    }
    FILE *fp_2 = fopen("C:\\VS Code\\C Programs\\CFilesLearning\\files\\FilesDemo2_1_2.txt", "r+");
    if (fp_2 == NULL)
    {
        perror("File open failed:");
        exit(0);
    }
    deleteAndAddLineNumber (fp_1, fp_2);
    fclose(fp_1);
    fclose(fp_2);
    return 0;
}

void deleteAndAddLineNumber(FILE *fp_1,FILE *fp_2)
{
    //设定多个缓存字符,实现一次读取进行数次判断的操作;
    char load = '\0';
    char load_1 = '\0';
    char load_2 = '\0';
    int lineNumber = 1;//行数
    int enterFlag = 0;//多行注释的消除的换行和加行数的操作
    fprintf(fp_2, "%d\t", lineNumber++);
    while (1)
    {
        //常规操作,首先读取一个进入储存load,判断是否终止;
        if (fscanf(fp_1, "%c", &load) == EOF)
        {
            break;
        }
        //如果不终止,对load进行判断,先判断是否为注释;
        //判断为‘/’
        if (load == '/')
        {
            load_1 = fgetc(fp_1);//进一步判断下一个字符
            if (load_1 == '/')//若仍为‘/’,则判断为单行注释
            {
                while (1)
                {
                    if (fscanf(fp_1, "%c", &load_2) == EOF) //两种情况终止循环:遇到EOF或换行符,设置缓存_2,以便一次读取多次判断
                    {
                        break;
                    }
                    else if (load_2 == '\n')
                    {
                        fprintf(fp_2, "%c%d\t", '\n',lineNumber++);//换行,并输出行数,实现行首行数标注的原理是找到换行符'\n'
                        break;
                    }
                }
            }
            else if (load_1 == '*')//若为'*',判断为多行注释,注意多行注释结束的判断,以及换行、加行数的操作
            {
                while (1)
                {
                    if (fscanf(fp_1, "%c", &load_2) == EOF)
                    {
                        break;
                    }
                    if(load_2 == '\n')//判断多行注释是否真的为多行注释,还是在一行
                    {
                        enterFlag = 1;
                    }
                    else if (load_2 == '/')
                    {
                        if(enterFlag==1)//如为真多行,为避免*/后同一行仍有内容,加一个\n实现换行
                        {
                            fprintf(fp_2, "\n%d\t", lineNumber++);
                        }
                        break;
                    }
                }
                enterFlag = 0;//重置
            }
            else
            {
                //判断为非注释(即单个'/'),直接输出单个'/'
                fprintf(fp_2, "%c", load);
                if(load_1=='\n')//缓存_1,若为换行,还得注意加行数
                {
                    fprintf(fp_2, "%c%d\t", load_1,lineNumber++);
                }
                else
                {
                    fprintf(fp_2, "%c", load_1);
                }
                
            }
        }
        //判定为非'/'非注释,普通写入,有换行加行数
        else if(load == '\n')
        {
            fprintf(fp_2, "%c%d\t", load, lineNumber++);
        }
        else
        {
            fprintf(fp_2, "%c", load);
        }
    }
}
  • 初学编程,代码拙劣,敬请原谅和指教。该程序不能实现多行注释中嵌套有多行注释或者单行注释的情况,仍待改进,如有意见,敬请指出,期待交流进步!
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值