如何忽略C中输入文件中不必要的注释行

时间:2015-06-23 00:24:56

标签: c

我想用C编写代码,以便从输入文件中读取数据。但我想忽略以#和@开头的行。我知道可以使用fgets完成并继续但我无法对其进行编码。我试图理解已经问过的问题的答案,但我无法理解。所以,我分别问我的问题。

我的输入文件如下所示: -

 #random lines
 #comment                
 @comment 
 @comment

 1234   1.01  2.02   3.02
 1453   1.02  20.04  3.01

这是我写的: -

 #include<stdio.h>

 int main()
 {

  FILE *fp;
  char line[1000];
  char s1[13];

  fp = fopen ("test.txt","r");

  while (fgets(line, sizeof line, stdin))    

  {

   if (*line == '#') 

   continue;

   else

   sscanf(line, "%s", s1);

   }
    printf("line = %s\n", s1);
    return 0;
    }

如果有人能帮助我,我将不胜感激。

谢谢,

3 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点,但是使用fgets你需要考虑三件事:(1)找到要测试的行中的第一个非空白字符,(2)如何处理空白行(看起来您只是想要数据,因此我已将其删除)和(3)处理/删除'\n'所包含的每行末尾的fgets。解决这个问题的一个非常基本的方法是:

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

#define MAXS 256

int main (void)
{
    char line[MAXS] = {0};

    while (fgets (line, MAXS, stdin) != NULL) 
    {
        char *p = line;

        size_t len = strlen (line);

        while (len > 0 && (line[len-1] == '\n' || line[len-1] == '\r'))
            line[--len] = 0;    /* strip newline or carriage rtn    */


        while (isspace (*p))    /* advance to first non-whitespace  */
            p++;

        /* skip lines beginning with '#' or '@' or blank lines  */
        if (*p == '#' || *p == '@' || !*p)
            continue;

        printf ("%s\n", line);
    }

    return 0;
}

<强>输入

$ cat dat/cmmt.dat
 #random lines
 #comment
 @comment
 @comment

 1234   1.01  2.02   3.02
 1453   1.02  20.04  3.01

使用/输出

$ ./fgets_skip_comment <dat/cmmt.dat
 1234   1.01  2.02   3.02
 1453   1.02  20.04  3.01

要停止在开始的行&#34; 2106&#34;

您要做的是比较从p开始的第一个四个字符。现在还不清楚是否要打印包含 2106 的行,然后停止 - 或 - 停止,然后打印该行。如果是后者,那么只需将printf移到下面的测试下面:

        printf ("%s\n", line);

        /* stop at line that begins with 2106 */
        if (strncmp (p, "2106", 4) == 0)
            break;
    }

答案 1 :(得分:1)

我看到的主要问题是您打开文件test.txt,但

  • 未能执行任何错误检查(如果找不到该文件,fopen将返回NULL
  • 请勿使用fgets中的文件指针(您使用stdin代替fp
  • 从不关闭文件(完成文件后fclose(fp)的良好做法)

其他问题

  • s1应该与line一样大,以避免任何缓冲区溢出的可能性(或者您必须限制sscanf中的字符串长度。)
  • 代码检查#但不检查@
  • else是不必要的,因为continue会使循环短路
  • printf应该在循环中
  • sscanf从行中提取第一个单词(不确定这是否是您想要的)
  • 您需要检查sscanf的返回值,因为sscanf将在空白行返回0

所以代码看起来应该是这样的

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

#define MAXL 1000

int main( void )
{
    FILE *fp;
    char line[MAXL];
    char s1[MAXL];

    if ( (fp = fopen ("test.txt","r")) == NULL )
    {
        fprintf( stderr, "Unable to open file: test.txt\n" );
        exit( 1 );
    }

    while ( fgets(line, sizeof line, fp) )
    {
        if (*line == '#' || *line == '@')
            continue;

        if ( sscanf(line, "%s", s1) == 1 )
            printf("1st word on this line = '%s'\n", s1);
    }

    fclose(fp);
    return 0;
}

答案 2 :(得分:0)

下次使用fgets显示您尝试过的内容会更好,但无论如何我会帮助您,例如说

while (fgets(inputFile, sizeof inputFile, stdin)) {
    if (*inputFile == '#') // What action do you want it to do if it reaches a     #
}