【问题标题】:Skip line if is determined character如果确定字符则跳过行
【发布时间】:2014-07-03 02:47:43
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c file io


    【解决方案1】:

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

    有几种方法可以解决这个问题,使用不同的 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');
    }
    

    【讨论】:

      【解决方案2】:

      这是一个稍长的基于字符的方法,它以一行中的第一个字符是否为( 为条件。

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        FILE *file = fopen("test.txt", "r");
        
        char c[100];
        while(fscanf(file, "%s", c)) {
        if (c[0] != '(')
            printf("%s", c);
        }
        

        【讨论】:

        • 您需要添加一些解释性文字来说明为什么这是解决方案。此处不鼓励仅使用代码回答。
        【解决方案4】:

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

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

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

        if (*buf=='(')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多