1

我有一个名为 accounts.dat 的数据文件,其结构如下:

1000:Cash
3000:Common Shares Outstanding
1400:Office Equipment

我正在使用 fopen() 打开/链接文件。我正在使用 fscanf() 来检索基于格式字符串的值 - “%d:%[^:]\n”。%d 代表帐号,':' 是分隔符,[^:] 是除 ':' 之外的所有字符。

 void getdataf() {
     FILE * infileaccs;
     FILE * infiletrans;
     int acctnumf;
     char acctdesf[DESMAX];

     char filenameacc[40] = "accounts.dat";
     infileaccs = fopen(filenameacc, "r");
     if(infileaccs==NULL){
         printf(" **File \"accounts.dat\" could not be read\n");
         printf(" **Previously entered account titles are not available\n");
         printf(" **Any previously entered transactions will not be used\n");
     } else{
         int i=0;
         while(fscanf(infileaccs, "%d:%[^:]\n",&acctnumf,acctdesf)!= EOF){
             acct[i++]=acctnumf;
             srtaccttyp(acctnumf, i);
             printf("------------>Added unique acct type %d!\n", accttyp[i]);
             printf("------------>element: %d is added into acct array in position acct[%d]\n",acctnumf,i);
             nacct++;
             accttitle(acctdesf);
         }
         fclose(infileaccs);
     } }

但是此代码不起作用,它只是冻结。如果您需要更多信息,请告诉我,提前致谢。

它似乎停在 while 循环处。

4

2 回答 2

1

你的fscanf格式

while(fscanf(infileaccs, "%d:%[^:]\n",&acctnumf,acctdesf)!= EOF)

扫描第一行中的数字,然后是冒号,然后将所有字符存储到acctdesf. 然后所有后续fscanf的 s 都无法将一个以 a 开头的字符串转换':'为一个int,从而使您陷入无限循环。

你想读到下一行,

int convs;
while((convs = fscanf(infileaccs, "%d:%[^\n]",&acctnumf,acctdesf)) == 2) {
    /* do something */
}
if (convs != EOF) {
    /* oops */
}

这样从下一行开始的数字仍然存在于下一行fscanf

于 2012-12-03T02:14:09.920 回答
0

fscanf如果没有与给定格式匹配的数据,则可以返回 0,但您只检查EOF. 您应该做的是检查其结果fscanf将告诉您成功扫描了多少项目,在这种情况下,您要确保fscanf返回 2 或 EOF,如果两者都不是,则存在数据格式问题你的输入。

于 2012-12-03T01:46:20.547 回答