C - 读取文本文件时忽略尾随注释

时间:2014-09-20 20:17:27

标签: c parsing

我有一个文本文件,格式如下:

1 // Comment
2 // Comment
3 
4 // Comment
5
6 // Comment
7 // Comment
8 // Comment
9 
etc.....

我正在使用C来尝试解析数字,同时完全忽略注释,并将整数读入数组。该数组具有预定的大小,因此文本文件中的数字量不会超过该数量。我刚刚开始学习C,我尝试使用以下程序使用fgets()和strtok():

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

int main(int argc, char *argv[])
{
    FILE *file;
    char buf[1000];

    if (argc == 2)
        file = fopen(argv[1], "r");
    else {
        fprintf(stderr, "Incorrect number of arguments.\n");
        return 1;
    }

    if (!file)
        return 1;

    while (fgets(buf, sizeof(buf), file) != NULL)

        printf("%s\n", strtok(buf, "//"));


    fclose(file);
    return 0;
}

我还没有尝试将整数放入数组中,因为我仍然只是试图以某种方式隔离数字。这是我的输出:

1 
2 
3 

4 
5

6 
7 
8 
9

所以,我在编号后处理空白区时遇到问题。据我所知,可能有一种更简单的方法来实现这一目标,但这是我在经过几个小时的讨论后所拥有的。我如何解释这个空间,或者,有没有更好的方法来解析这个文件中的整数并进入数组?

2 个答案:

答案 0 :(得分:2)

由于每一行以数字开头,并且该行的其余部分应被忽略,请执行以下操作:

int number;
while(1 == fscanf(file, "%d%*[^\n]\n", &number)) {
    // Work with number here
}

格式为:

  • %d:符合int
  • 的带符号十进制数字
  • %*[^\n]:由于*
  • ,不会分配不是换行符的无限制字符数
  • \n:换行符终止

fscanf返回分配的输出数量,如果无法匹配则会停止。

答案 1 :(得分:2)

如果存在,则fgets()会在行上留下换行符(\ n)。所以带注释的行是:      ## //评论\ n 没有评论的行是:      ## \ n

当你调用strtok()时,它会根据你的情况&#34; //&#34;将这行分成基于分隔符的标记。所以带注释的行返回&#34; ##&#34;和&#34;注释\ n&#34;和没有注释的行只返回&#34; ## \ n&#34;。因此,当您打印它们时,没有注释的行最终会有两个换行符。

以这种格式检索号码的简单方法是atoi(buf)。由于atoi()跳过前导空格,解析前导+或 - 符号的选项,然后解析所有数字,如果是注释行和没有注释行,它将返回数字的整数值。