【问题标题】:How to get fscanf to scan the next Line in C如何让 fscanf 扫描 C 中的下一行
【发布时间】:2021-05-12 18:31:23
【问题描述】:

文本文件是与此类似的单词列表。每个世界都在一个新的路线上

当我运行我的代码时,唯一被打印的是“hi”....我如何让它继续阅读下一行

  • 你好
  • 你好
  • 欢迎
#include <stdio.h>
#include <stdlib.h>

int main() 
{
    char data[100];
    // OPENS THE FILE
    FILE *fp = fopen("/classes/cs3304/cs330432/Programs/StringerTest/people.txt", "r");
    
    if (fp == NULL) 
    {
        printf("Unable to open the file\n");
    } else {
        fscanf(fp, "%s", data);
        
        printf("%s", data);
        fclose(fp);
    }
}       

【问题讨论】:

  • while (fscanf(fp, "%s", data) == 1)
  • 虽然if 声明中没有弃船(例如exit(1);),但您需要保留else。请注意,您应该将错误报告给stderr,而不是stdout。在错误消息中包含文件名也是一个好主意,这意味着您需要创建一个指向文件名的变量,以便您可以在对fopen() 的调用和错误消息中使用该变量。
  • 问问自己——if 语句检查什么?一旦你解决了这个问题,你就可以回答是否仍然需要else。也就是说,如果不管if 检查的结果如何都调用fscanf,会出现什么问题?
  • 是的,就是检查打开是否成功。因此,如果没有else,则意味着fscanf 将使用该文件,无论打开的文件是否有效。这不是一件好事吗?
  • @dxiv fscanf 有一个你需要注意的怪癖(你可能已经知道了)。如果输入由紧跟换行符的字符串组成,%99s 转换将读取到换行符之前的所有内容,然后%*[^\n] 转换将失败%*c 转换将尝试。结果是没有消耗换行符。

标签: arrays c scanf


【解决方案1】:

如何让 fscanf 扫描 C 中的下一行

阅读fscanf的文档。你不能用它扫描线。而fscanf 可能会失败,你应该处理它的失败。

一种可能的方法是使用fgets(或getline,或readline)读取下一行,然后使用sscanf对其进行解析。

还要注意,在 2021 年,UTF-8 is used everywhere。因此,如果您的 people.txt 文件包含类似 Être ou ne pas être 的行或带有 СТАРЫНКЕВИЧ 的行(西里尔字母),请在纸上记录您的程序应该做什么。

如果允许,使用最近的GCC 编译器作为gcc -Wall -Wextra -g(询问所有警告和调试信息),改进您的代码以不收到警告,然后使用GDB 调试器来了解您的程序的行为.您可以在笔记本电脑上安装Debian 以获取gccgdb

您的程序文档可以使用EBNF 表示法来指定什么是有效输入。

考虑使用 GNU bison 等工具生成部分 C 代码。

fopen 失败时,您可以使用perror 报告错误。

您可能想阅读有关recursive descent parsing 的维基页面。

你可能想学习-寻求灵感-GNU coreutils的源代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2012-07-14
    • 2012-09-15
    • 2016-05-04
    • 2018-06-20
    • 2022-01-14
    • 2021-09-04
    相关资源
    最近更新 更多