c - 将数据从文件读入程序的错误输出
问题描述
我一直在研究一个程序,将文件中的数据读取到程序中并打印出来:
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p;
int e;
float f;
static char a[50];
FILE *fp;
fp = fopen("new_input.txt", "r");
if (fp == NULL)
exit(0);
while (1)
{
p = fgets(a, 50, fp);
if (p == NULL)
break;
printf("%s", a);
printf("\n");
fscanf(fp, "%d", &e);
printf("%d", e);
printf("\n");
fscanf(fp, "%f", &f);
printf("%f", f);
printf("\n");
}
fclose(fp);
return 0;
}
文件 new_input.txt 的内容是:
Girik
12
19.98
Nikhil
13
90.89
但是在 OnlineGdb 上运行时,我得到以下输出:
Girik
12
19.980000
12
19.980000
khil
13
90.889999
有人可以用我的代码解释问题吗?
我担心输出和打印值 12 和 19.99 两次的不完整名称“Nikhil”。
解决方案
问题的出现是因为 lastfscanf
不解析\n
,所以当循环重新开始时,fgets
将解析并打印它,自然 nextfscanf
无法解析字符串 ( "Nikhil"
,它没有被解析),因为它期望一个int
,它从下坡在那里,由于未解析值,因此打印的是上一个周期的旧e
值f
。
如果你改变你的最后一个fscanf
,它会解析\n
一切正常:
while (1)
{
p = fgets(a, 50, fp);
if (p == NULL)
break;
printf("%s", a);
fscanf(fp, "%d", &e);
printf("%d", e);
printf("\n");
fscanf(fp, "%f\n", &f); //<--here
printf("%.2f", f);//.2f specifier so it prints only 2 decimal places
printf("\n");
}
指针也是不必要的,您可以将fgets
其自身用作条件,即:
while (fgets(a, sizeof a, fp)) //will read until the end of the file
{
printf("%s", a);
//... same code
}
无论如何,这是一个您可以使用的版本,它将为您呈现预期的结果和输出,而且我认为更好:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int e;
float f;
static char a[50];
FILE *fp;
fp = fopen("new_input.txt", "r");
if (fp == NULL){
return EXIT_FAILURE;
}
// will parse until \n or 49 characters max (given the container size)
while (fscanf(fp, " %49[^\n]", a) > 0)
// ^ space - will discard any blank characters
{
printf("%s\n", a);
if(fscanf(fp, "%d", &e) > 0){
printf("%d\n", e);
}
if(fscanf(fp, "%f", &f) > 0){
printf("%.2f\n", f);
}
}
fclose(fp);
return EXIT_SUCCESS;
}
我还添加了fscanf
退货检查,这始终是一个很好的做法。
甚至:
//...
while (fscanf(fp, " %49[^\n]%d%f", a, &e, &f) == 3)
{
printf("%s\n%d\n%.2f\n", a, e, f);
}
//...
但是,我相信最好的解决方案是用or /解析所有内容fgets
并转换值,这是一个更强大的选择。试试看。sscanf
strtol
strtof
推荐阅读
- python - 基于值在日期之间迭代并从上一个日期拉出数量
- sql - SQLite:计算匹配多个条件的条目数的百分比
- c# - CefSharp使用DevToolsClient执行方法后,调用Wait()函数等待,导致程序卡死?
- c# - 如何根据字符串更改获取组件类?
- reactjs - 当我从另一个文件导入上下文时出现“TypeError:render is not a function”错误
- python-3.x - 字典中相同键名的总和值
- neo4j - 如何在特定时间段后自动更新 ne04j 中的节点属性
- r - 使用 DT 包中的数据表函数对 NA 进行排序
- go - 如何在 Beego 框架上实现 H2C(HTTP/2 纯文本)
- maven - TestNG Maven - @Test 处的错误(红色下划线)