鱼C论坛

 找回密码
 立即注册
查看: 1375|回复: 1

[技术交流] 读取文件并输出不含某些注释的内容

[复制链接]
发表于 2020-2-28 01:05:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Ranbo_ 于 2020-2-28 01:06 编辑

这是2019年华中科技大学的研究生入学考试的上机测试题的第二题。一共有三问。先将第一题的代码复制成文本文档。
(1)输出文本文档内的内容
(2)输出文本文档内去除了由//注释过的内容
(3)输出文本文档内不含任何注释的内容

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

#define MAX 1024

int main()
{
    FILE *fp;
    char txt[MAX];
    //1.原样输出文件内容
    if((fp = fopen("1.txt", "r")) == NULL)
    {
        printf("文件打开失败!\n");
        exit(EXIT_FAILURE);
    }

    while(!feof(fp))
    {
        if(fgets(txt, MAX, fp) != NULL)//以免将最后一行输出两次
            printf("%s", txt);
    }
    printf("\n");
    fclose(fp);

    //2.输出删去了文件中的"//"注释的内容
    if((fp = fopen("1.txt", "r")) == NULL)
    {
        printf("文件打开失败!\n");
        exit(EXIT_FAILURE);
    }

    while(!feof(fp))
    {
        if(fgets(txt, MAX, fp) != NULL)
        {
            int i = 0;
            while(txt[i] != '\n')
            {
                if(txt[i] != '/' || txt[i+1] != '/')
                {
                    printf("%c", txt[i]);
                    i++;
                }
                else
                    break;
            }
            printf("\n");
        }
    }
    printf("\n");
    fclose(fp);

    //3.输出删去了所有注释的内容
    if((fp = fopen("1.txt", "r")) == NULL)
    {
        printf("文件打开失败!\n");
        exit(EXIT_FAILURE);
    }

    int temp = 0;   //temp=1时说明遇到了"/*"
    while(!feof(fp))
    {
        if(fgets(txt, MAX, fp) != NULL)
        {
            int i = 0;
            while(txt[i] != '\n')
            {
                if(temp == 1)//若temp=1,则暂停输出,找"*/"
                {
                    if(txt[i] == '*' && txt[i+1] == '/')
                    {
                        temp = 0;//找到匹配字符串"*/",temp初始化
                        i += 2;  //从注释之后开始继续输出
                        continue;
                    }
                    else//没找到匹配的就继续找
                    {
                        i++;
                        continue;
                    }
                }
                if(txt[i] == '/' && txt[i+1] == '/')//若遇到"//"则剩下的整行都不用输出
                    break;
                else if(txt[i] == '/' && txt[i+1] == '*')//若遇到"/*"则置temp为1,继续向后查找"*/"
                {
                    temp = 1;
                    i++;
                    continue;
                }
                else
                {
                    printf("%c", txt[i]);
                }
                i++;
            }
            printf("\n");
        }
    }

    printf("\n");
    fclose(fp);

    return 0;
}
我刚学不久,可能代码写的一团糟,但是总之是可以运行的,输出结果与预想相同。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-28 10:04:56 From FishC Mobile | 显示全部楼层
棒棒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 22:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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