错误的输出fscanf()

时间:2019-03-11 18:44:02

标签: c

您好,我正在尝试使用我编写的代码读取文件

#include <stdio.h>

int main(){
    int task_id=0;
    FILE *fp;
    fp = fopen("output","r");
    if (fp == NULL)
    {   
        printf("failed opening file");
        return 1;
    }
    else{
    fscanf(fp,"conhost.exe                   %d",&task_id);
    fclose(fp);
    printf("taskID is: %d",task_id);
    return 0;
    }
}

文件内容供参考

conhost.exe                   4272 Console                    2     13,504 K

我一直将输出设为0

2 个答案:

答案 0 :(得分:3)

Cara先生(您赞扬使用分配抑制运算符)对您有很好的回答,但是我还要再提一个建议。每当您在阅读输入行时,请使用fgets之类的面向 line _ 的输入函数,该函数将帮助您避免使用scanf系列函数带来的很多陷阱。然后,您可以使用sscanf从保存数据行的缓冲区中解析所需信息。这样可以确保输入流中剩余的内容不取决于所使用的 format-specifier

此外,请勿对文件名进行硬编码-这就是程序参数的用途。一个简短的例子是:

#include <stdio.h>

#define MAXC 1024u  /* if you need a constant, #define one (or more) */

int main (int argc, char **argv) {  /* don't hardcode name, use arguments */

    int task_id = 0;
    char buf[MAXC];
    /* use filename provided as 1st argument (stdin by default) */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        perror ("file open failed");
        return 1;
    }

    if (!fgets (buf, MAXC, fp)) {   /* read with line-oriented function */
        fputs ("error: EOF encountered on file read.\n", stderr);
        return 1;
    }
    if (fp != stdin) fclose (fp);   /* close file if not stdin */

    /* parse information with sscanf (read/discard initial string) */
    if (sscanf (buf, "%*s %d", &task_id) != 1) {
        fputs ("error: invalid file format.\n", stderr);
        return 1;
    }
    printf("taskID is: %d\n",task_id);  /* output task_id */
}

使用/输出示例

$ ./bin/rd_task_id <output
taskID is: 4272

仔细研究一下,如果您有任何疑问,请告诉我。

答案 1 :(得分:0)

假设您要从示例output文件中获取“ 2”,则可以这样做:

#include <stdio.h>

int main()
{
    int task_id = 0;
    FILE *fp;
    fp = fopen("output", "r");
    if (fp == NULL) {   
        printf("failed opening file\n");
        return 1;
    }
    else {
        fscanf(fp, "%*s%*d%*s%d", &task_id);
        printf("taskID is: %d\n", task_id);
    }   // Code
    fclose(fp);
    return 0;
}

请注意,fscanf()允许您通过在格式说明符和百分号之间添加星号来丢弃数据-因此您可以修改此语句fscanf(fp, "%*s%*d%*s%d", &task_id);来收集所需的数据。