繁体   English   中英

如果确定字符则跳过行

[英]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与适当大小的缓冲区一起使用,并选择初始字符,或者
  • 使用基于字符的API,并在每次看到'\\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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM