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

C-读取文本文件时忽略尾随注释,c,parsing,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 <

我有一个以下格式的文本文件:

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;
}

所以,我很难处理数字后面的空白。据我所知,可能有一个更简单的方法来实现这一点,但这是我在几个小时的胡闹后得到的。我如何解释这个空间,或者,是否有更好的方法只解析这个文件中的整数并将其放入数组

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

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

  • %d
    :适合
    int
  • %*[^\n]
    :由于
    *
  • \n
    :终止该行的换行符

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

由于每一行都以一个数字开头,而该行的其余部分将被忽略,请执行以下操作:

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

  • %d
    :适合
    int
  • %*[^\n]
    :由于
    *
  • \n
    :终止该行的换行符
fscanf
返回分配的输出数,如果某些输出不匹配,则停止。

fgets()将换行符(\n)保留在行上(如果存在)。因此,带有注释的行是: ##//注释\n 没有注释的行是: ##\n

调用strtok()时,它会根据分隔符将行拆分为标记,在您的情况下为“/”。因此,带注释的行返回“##”和“Comment\n”,而不带注释的行只返回“##\n”。因此,当您打印它们时,没有注释的行最终会有两个换行符

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

fgets()将换行符(\n)保留在行上(如果有)。因此,带有注释的行是: ##//注释\n 没有注释的行是: ##\n

调用strtok()时,它会根据分隔符将行拆分为标记,在您的情况下为“/”。因此,带注释的行返回“##”和“Comment\n”,而不带注释的行只返回“##\n”。因此,当您打印它们时,没有注释的行最终会有两个换行符


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

格式是否始终为“数字[空格][可选注释]”?您是否阅读了的文档;你用错了!另外,使用所有警告和调试信息(
gcc-Wall-g
)进行编译,并使用调试器(
gdb
)@templatetypedef是,格式将始终为数字[space][可选注释]格式到底是什么?是:
数字[非数字非换行非换行]换行符
?该空格也是可选的吗?@Deduplicator根据是一个单位数还是两位数,第一个数字后面会有3到4个空格。然后在注释后面加上可选注释,注释后面加上一个空格,注释本身的格式总是“number[空格][可选注释]”?您是否阅读了的文档;你用错了!另外,使用所有警告和调试信息(
gcc-Wall-g
)进行编译,并使用调试器(
gdb
)@templatetypedef是,格式将始终为数字[space][可选注释]格式到底是什么?是:
数字[非数字非换行非换行]换行符
?该空格也是可选的吗?@Deduplicator根据是一个单位数还是两位数,第一个数字后面会有3到4个空格。然后是一个可选的注释,注释后面有一个空格,注释本身有不同的长度。我以前没有注意到关于我的.txt文件的这一点,但是有些行是空白的,当使用aoti()时,这些空白行被读入为零。我在将有效的0放入数组并忽略空行时遇到问题(没有将它们作为0读入数组)。我通过检查“\n”找到了忽略空行的方法,但现在我正在尝试处理间隔超过6个空格左右的注释(“//”类型)。我的理解是,第一个文件是您的输入,并且没有空行,第二个文件是使用strtok()尝试获取数字后的输出。我的建议是不要使用strtok(),而是使用atoi()。如果你在该文件中有空行,那么你确实需要检查BUF [0 ]=`````我已经使用BUF [0 ]='\n '来解释空白行,但是也有注释行不跟踪一个整数。例如,有一个类似上面发布的输入的行块,后跟一个空行,然后是一个开头没有整数的注释行,间隔大约6个空格(非制表符)。所以“//”在几个空格后开始。我无法解释这一点,atoi()将继续以零的形式读取此注释行。除非找到数字,否则atoi()将返回0。现在,你说你的输入行是:“没有空格,数字,空格,和