C - 如何从代码文件中提取特定注释行

时间:2017-05-13 23:23:03

标签: c file-io comments

我想编写一个代码来从代码文件中提取待办事项任务列表。它基本上是扫描代码文件并检测包含“TODO”字符串的行,然后将这些行写入文本文件。

到目前为止,我的代码是这样的:

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

int main()
{
    FILE* f;
    char line[200];
     f = fopen("someFile.c", "r");
     char c;
     char str;
     while(!feof(f)){
        fgets(line,sizeof(line),f);
        if(strstr(line, "TODO") != NULL)//Extracts every line with TODO
        {
            c=fgetc(f);//c = lines with TODO
        }

         }
     fclose(f);

     f= fopen("todoListFile.txt","w");

     while(!feof(f))
     {
         fputs(c,f);//Writing the content of the c in to the text file.
     }
    fclose(f);

    return 0;
}

当我运行此代码时,它会在1-2秒后崩溃。 我的错误可能在第二部分是获取那些“TODO”行并将其写入文本行。但我非常坚持那部分,不知道该怎么做。

注意:someFile.c的内容基本上是一些带有“// TODO :

的评论行

1 个答案:

答案 0 :(得分:0)

规范几乎表明你必须打开两个文件,一个用于阅读,一个用于写入。当您从输入文件中读取一行时,如果该行包含TODO,则需要将该行写入输出文件。这导致了直接的代码:

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

int main(void)
{
    char file1[] = "someFile.c";
    char file2[] = "todoListFile.txt";
    FILE *fp1 = fopen(file1, "r");
    if (fp1 == NULL)
    {
        fprintf(stderr, "Failed to open file %s for reading\n", file1);
        return 1;
    }
    FILE *fp2 = fopen(file2, "w");
    if (fp2 == NULL)
    {
        fprintf(stderr, "Failed to open file %s for writing\n", file2);
        return 1;
    }
    char line[200];
    while (fgets(line, sizeof(line), fp1) != 0)
    {
        if (strstr(line, "TODO") != NULL)
            fputs(line, fp2);
    }
    fclose(fp1);
    fclose(fp2);

    return 0;
}

请注意,它会检查文件是否已成功打开,并在文件名失败时报告文件名,并以非零状态退出(如果您愿意,可以添加<stdlib.h>并使用EXIT_FAILURE )。

当运行(自己的)副本时,它会使todoListFile.txt包含一行:

        if (strstr(line, "TODO") != NULL)

对程序的简单修改将:

  • 写入标准输出而不是固定名称文件。
  • 获取命令行参数并处理所有名为。
  • 的输入文件
  • 如果没有命名输入文件,请阅读标准输入。
  • 增加线长。 200优于80,但线可以比这长。我倾向于使用4096作为行长,除非有理由允许更长的行。