您好,我正在尝试使用我编写的代码读取文件
#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
答案 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);
来收集所需的数据。