1

以下のような構造の accounts.dat というデータ ファイルがあります。

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

ファイルを開く/リンクするために fopen() を使用しています。そして、フォーマット文字列「%d:%[^:]\n」に基づいて値を取得するために fscanf() を使用しています。%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ます。その後のすべてのsは、でfscanf始まる文字列を に変換できず、無限ループに陥ります。':'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スキャンに成功したアイテムの数を示す結果を確認することです。この場合、fscanf2 または EOF のいずれかが返されていることを確認する必要があります。どちらでもない場合は、データ形式の問題がありましたあなたの入力。

于 2012-12-03T01:46:20.547 に答える