[英]Skip line in config parser if character is # commented with fscanf
[英]Skip line if is determined character
我试图读取一个文件的第一个字符,只要它是等于'('
我应该跳过该行从其他该行获得的第一个字符。我是Mac下,我可以利用fgetln
。
FILE *file = fopen("test.txt", "r");
char c;
while(fscanf(file, "%s", &c) != EOF) {
if (c != '(')
printf("%c", c);
}
那是我当前的代码。 我不知道如何跳过行,尽管我尝试获取整行并仅检查了解决跳过问题的第一个字符。 但是,这不起作用,我的控制台中出现了奇怪的字符,而不是test.txt
字符。 我应该怎么做?
使用fscanf
%s
格式说明符的fscanf
在于,不仅在行尾字符上,而且还在空格上进行拆分。 此外,在单字符缓冲区中读取它几乎总是会产生未定义的行为。
有多种使用不同的API解决此问题的方法:
%s
替换为%200[^\\n]
,并传递201个字符的缓冲区而不是c
, fgets
与适当大小的缓冲区一起使用,并选择初始字符,或者 '\\n'
字符时设置一个“ take next”标志: 这是实现第三种方法的方法:
bool takeNext = true;
int ch;
while ((ch = fgetc(file)) != EOF) {
if (takeNext && ch != '(') {
printf("%c", ch);
}
takeNext = (ch == '\n');
}
将c更改为字符串,因为fscanf读取字符串。 查看c的第一个字符是否与(
匹配。
如果没有,则打印该行,否则跳过该行。
FILE *file = fopen("test.txt", "r");
char c[100];
while(fscanf(file, "%s", c)) {
if (c[0] != '(')
printf("%s", c);
}
使用fgets读取整行。 它也比fscanf安全,因为它将读数限制为缓冲区大小。
要检查第一个字符是否为'(',可以直接引用它:
if (buf[0]=='(')
要么
if (*buf=='(')
这是一种稍长的基于字符的方法,该方法取决于行中的第一个字符是否为(
。
如果是(
,那么我们消耗掉直到下一个换行符的所有内容,包括下一个换行符,而不会输出。
如果不是,那么我们做同样的事情,但是我们在读取字符时输出字符。
#include <stdio.h>
int main(){
FILE *file = fopen("test.txt", "r");
int c;
while((c = getc(file)) != -1) {
if (c == '(') {
// Skip until the next newline
do {
c = getc(file);
} while (c != -1 && c != '\n');
continue;
}
else {
putchar(c);
do {
c = getc(file);
putchar(c);
} while (c != -1 && c != '\n');
}
}
fclose(file);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.