Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建顺序访问文件-scanf存在问题_C - Fatal编程技术网

创建顺序访问文件-scanf存在问题

创建顺序访问文件-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

这段代码来自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("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);
}
//...