我有一个文本文件,格式如下:
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
所以,我在编号后处理空白区时遇到问题。据我所知,可能有一种更简单的方法来实现这一目标,但这是我在经过几个小时的讨论后所拥有的。我如何解释这个空间,或者,有没有更好的方法来解析这个文件中的整数并进入数组?
答案 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()跳过前导空格,解析前导+或 - 符号的选项,然后解析所有数字,如果是注释行和没有注释行,它将返回数字的整数值。