创建顺序访问文件-scanf存在问题
这段代码来自C How to Program(第6版Deitel),是关于创建顺序访问文件的 它编译得很好,但在执行问号时?不会出现在第三行,只有前四行写入文件创建顺序访问文件-scanf存在问题,c,C,这段代码来自C How to Program(第6版Deitel),是关于创建顺序访问文件的 它编译得很好,但在执行问号时?不会出现在第三行,只有前四行写入文件 #include <stdio.h> int main(void) { int account; char name[30]; double balance; FILE *cfPtr; if ((cfPtr = fopen("clients.dat", "w")) == NULL) { printf("F
#include <stdio.h>
int main(void) {
int account;
char name[30];
double balance;
FILE *cfPtr;
if ((cfPtr = fopen("clients.dat", "w")) == NULL) {
printf("File could not be opened\n");
}
else {
printf("Enter account, name and balance.\n");
printf("Enter EOF to end input\n");
printf("?");
scanf("%d%s%lf", &account, name, &balance);
while (!feof(stdin)) {
fprintf(cfPtr, "%d %s %.2f\n", account, name, balance);
printf("?");
scanf("%d%s%lf%", &account, name, &balance);
}
fclose(cfPtr);
}
return 0;
您可以看到,在输入第三行时,没有问号,文件中缺少最后一行
100 Jones 24.98
200 Doe 345.67
300 White 0.00
400 Stone -42.16
知道代码有什么问题吗?输入/输出流缓冲区
使用MinGW这对我来说也不是复制 如果你不小心撞了怎么办 例如:
#包括
#包括
内部主(空){
国际账户;
字符名[30];
双平衡;
文件*cfPtr;
if((cfPtr=fopen(“clients.dat”,“w”))==NULL){
printf(“无法打开文件\n”);
出口(1);
}
否则{
printf(“输入帐户、名称和余额。\n”);
printf(“输入EOF以结束输入\n”);
对于(;;){
printf(“?”);
fflush(stdout);
如果(scanf(“%d%s%lf”、&帐户、名称和余额)!=3){
打破
}
fprintf(cfPtr,“%d%s%.2f\n”,科目、名称、余额);
}
fclose(cfPtr);
}
返回0;
}
在行中
scanf("%d%s%lf%", &account, name, &balance);
^
您的%
太多了。这就是问题的根源
也就是说,这是一段笨拙的代码,尤其是在一本书中
如果输入错误,假设您只输入一个它无法读取的树字段,从而导致无限循环,包括将最后一个序列写入文件和打印?
差不多
//...
else
{
printf("Enter account, name and balance.\n");
printf("Enter EOF to end input\n");
do {
fprintf(cfPtr, "%d %s %.2f\n", account, name, balance);
printf("?");
} while (scanf("%d%s%lf", &account, name, &balance) == 3);
fclose(cfPtr);
}
//...
这将是一种改进。请参见第二点,始终检查
scanf的返回值(成功扫描的项目数),这就是您应该用来控制循环的内容:while(scanf(“%d%s%lf%”),以及account、name和balance)==3{…}
@WeatherVane-谢谢,尝试过了,但问题仍然存在。%d%s%lf%“
中有一个错误,其中最后的说明符不完整(我将其复制到我的第一条注释中)。请注意编译器警告…但我无论如何都无法重现您的错误。所以程序可以在您的平台上运行?你在用什么编译器?
scanf("%d%s%lf%", &account, name, &balance);
^
//...
else
{
printf("Enter account, name and balance.\n");
printf("Enter EOF to end input\n");
do {
fprintf(cfPtr, "%d %s %.2f\n", account, name, balance);
printf("?");
} while (scanf("%d%s%lf", &account, name, &balance) == 3);
fclose(cfPtr);
}
//...