如何使用fopen跳过c+编程中的注释

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我想在使用时忽略/跳过文本文件中的注释fgets

问题是如果一行开头的第一个字符是#,我只能跳过评论。评论从#我的文本文件开始。但是#我的file.txt一些不是第一个字符,就像这样;

#Paths
A B #Path between A and B.
D C #Path between C and D.

A是我的第一个节点,B是我的第二个节点,当#来到时,我想忽略其余的文本直到下一行。我的新节点应该是D和C等。我只能在fopen函数中使用“r”。我试过fgets但是它逐行读取并且fgetc也没有帮助。

    bool ignore_comments(const char *s)
    {
        int i = 0;
        while (s[i] && isspace(s[i])) i++;
        return (i >= 0 && s[i] == '#');
    }
    FILE *file;
    char ch[BUFSIZE];
    file = fopen("e.txt", "r");
    if (file == NULL) {
        printf("Error\n");
        fprintf(stderr, "ERROR: No file input\n");
        exit(EXIT_FAILURE);
    }
    while(fgets(ch, BUFSIZE, file) != NULL)
    {
              if (line_is_comment(ch)) {
                        // Ignore comment lines.
                        continue;
                printf("%c",*ch);
                }
     fscanf(file, "%40[0-9a-zA-Z]s", ch);
....
}
提问于
用户回答回答于

您还可以strcspn在一个简单的调用中使用修剪所有注释(如果不存在,则修剪缓冲区中的行结尾)。你通常会修改读取缓冲区的行结尾fgets()

        ch[strcspn (ch, "\r\n")] = 0;  /* trim line-ending */

您可以简单地将该"#"字符添加到拒绝列表中,如果存在注释,则将其终止。这将减少删除注释的完整任务,并将'#'新格式化的行输出到:

    while (fgets (ch, BUFSIZE, fp)) {   /* read every line */
        ch[strcspn (ch, "#\r\n")] = 0;  /* trim comment or line-ending */
        puts (ch);                      /* output line w/o comment */
    }

将文件作为程序的第一个参数读取的简短示例(stdin如果没有给出参数,则默认读取),您可以这样做:

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

#define BUFSIZE 1024    /* if you need a constant, #define one (or more) */

int main (int argc, char **argv) {

    char ch[BUFSIZE];
    /* use filename provided as 1st argument (stdin by default) */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        perror ("file open failed");
        return 1;
    }

    while (fgets (ch, BUFSIZE, fp)) {   /* read every line */
        ch[strcspn (ch, "#\r\n")] = 0;  /* trim comment or line-ending */
        puts (ch);                      /* output line w/o comment */
    }

    if (fp != stdin) fclose (fp);       /* close file if not stdin */

    return 0;
}

示例输入文件

借用Tom的示例文件 :)

$ cat dat/comments_file.txt
#Paths
A B #Path between A and B.
D C #Path between C and D.
E F
G H

示例使用/输出

$ ./bin/comments_remove <dat/comments_file.txt

A B
D C
E F
G H

仔细看看,如果您有其他问题,请告诉我。

用户回答回答于

以下提议的代码:

  1. 执行所需的功能
  2. 干净利落地编译
  3. 正确检查错误
  4. 这个答案使用状态机,基于:'InComment'

现在,建议的代码:

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

int main( void )
{
    int InComment = 0;

    FILE *fp = fopen( "file.txt", "r" );
    if( !fp )
    {
        perror( "fopen to read -file.txt- failed" );
        exit( EXIT_FAILURE );
    }

    int ch;

    while( (ch = fgetc(fp)) != EOF )
    {
        if( ch == '#' )
        {
            InComment = 1;
        }

        else if( ch == '\n' )
        {
            InComment = 0;
            fputc( ch, stdout );
        }

        else if( !InComment )
        {
            fputc( ch, stdout );
        }
    }
    fclose( fp );
}

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问5 回答
  • uncle_light

    5 粉丝518 提问3 回答
  • 学生

    2 粉丝477 提问3 回答
  • 军哥

    重庆雷驰信息技术有限公司 · 经理 (已认证)

    5 粉丝1 提问3 回答

扫码关注云+社区

领取腾讯云代金券