如果确定了字符,则跳过线

时间:2014-07-02 18:34:06

标签: c file io

我正在尝试读取文件的第一个字符,只要它等于'('我就应该跳过该行,否则从该行获取第一个字符。我在Mac下,我可以使用fgetln

FILE *file = fopen("test.txt", "r");

char c;
while(fscanf(file, "%s", &c) != EOF) {
  if (c != '(')
    printf("%c", c);
}

这是我目前的代码。我不知道如何跳过行,虽然我试图获得整行并且仅检查解决跳过问题的第一个字符。然而,这不起作用我在我的控制台而不是test.txt内的字符中得到奇怪的字符。我该怎么做?

4 个答案:

答案 0 :(得分:1)

使用%s fscanf格式说明符的问题在于空格上的分割,而不仅仅是在行尾字符上。此外,在单字符缓冲区中读取它将几乎总是产生未定义的行为。

使用不同的API有几种方法可以解决这个问题:

  • 您可以将%s替换为%200[^\n],并传递201个字符的缓冲区而不是c
  • fgets与正确大小的缓冲区一起使用,然后选择初始字符或
  • 使用基于字符的API,并设置"接下来"每次看到'\n'字符时都会标记:

以下是如何实施第三种方法:

bool takeNext = true;
int ch;
while ((ch = fgetc(file)) != EOF) {
    if (takeNext && ch != '(') {
        printf("%c", ch);
    }
    takeNext = (ch == '\n');
}

答案 1 :(得分:0)

将c更改为字符串,因为fscanf读取字符串。查看c的第一个字符是否与(匹配。

如果没有,则打印该行,否则跳过该行。

FILE *file = fopen("test.txt", "r");

char c[100];
while(fscanf(file, "%s", c)) {
if (c[0] != '(')
    printf("%s", c);
}

答案 2 :(得分:0)

使用fgets读取整行。它也比fscanf更安全,因为它将读数限制为缓冲区大小。

检查第一个字符是否为'('您可以直接引用它:

if (buf[0]=='(')

if (*buf=='(')

答案 3 :(得分:0)

这是一个稍微长一些的基于字符的方法,它决定一行中的第一个字符是否为(

如果是(,那么我们会消耗所有内容,包括下一个换行符而不输出。

如果不是,那么我们会做同样的事情,但是在我们阅读时输出字符。

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