【问题标题】:Parsing Specific Input File Using Fscanf使用 Fscanf 解析特定的输入文件
【发布时间】:2012-07-01 02:40:04
【问题描述】:

我一直在尝试使用 fscanf 来读取我的应用程序中的输入文件。

这是输入文件

3
Process#1 - 2Kb
3
exec 20

io 5

exec 50

Process#2 - 8Kb

1

exec 100

Process#3 - 8Kb

4

exec 50

io 50

exec 50

io 50

首先我想阅读第一个“3”,这样做没有问题。

之后,我需要读取 # 后面的信息(即 1)和 "kb" 字符串后面的数字(即 2)。

为什么这个 fscanf 没有这样做?

fscanf(inputFile, "Process#%d - %dKb", &id, &mem ); 

我该怎么做?

提前致谢

【问题讨论】:

    标签: c parsing scanf


    【解决方案1】:

    可能是因为3 后面留下的换行符没有被Process 中的P 识别。

    这就是为什么很多人回避scanf();通常使用fgets() 或相关函数(但不是 gets()!)然后使用sscanf() 会更简单。


    演示代码

    请注意对来自scanf() 的返回的严格检查。如果你不这样做,你将不知道什么时候出了问题。请注意,检查也是为了确保正确的转化次数。

    #include <stdio.h>
    int main(void)
    {
        int i;
        int id;
        int mem;
    
        if (scanf("%d", &i) != 1)
            printf("oops!\n");
        /* With    space - reads past newline on first line */
        /* Without space - prints 'thank goodness!' */
        if (scanf(" Process#%d - %d", &id, &mem) != 2)
            printf("thank goodness!\n");
        return 0;
    }
    

    【讨论】:

    • 所以你告诉我使用 fgets 来读取整行,而他们使用 sscanf 来解析我刚刚使用 fgets 填充的缓冲区?
    • 根据您对缺少 /n 字符的读取的回答,我使用 fscanf(entrada, "\nProcesso #%d - %dKb", &id, &mem );谢谢,一旦允许,我会在 5 分钟内选择你的答案
    • 是的。理解它(fgets() 加上sscanf())的工作原理比跟踪fscanf() 的工作原理更容易。或者,如果您愿意,可以在 PProcess 之前添加一个空格;这将匹配任意空白(包括换行符)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2023-04-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多