我想用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;
}
如果有人能帮助我,我将不胜感激。
谢谢,
答案 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 #
}