2011-02-09 6 views
2

私は2つの.dat(ascii)ファイルを持っています。どちらもソートされています。Cヘルプを更新して作成するファイル

1:クライアントファイル。口座番号、名前、残高 2:トランザクションファイル。アカウント番号、日付、販売数量(取引金額)

私が達成しようとしているのは、一致するトランザクションのsaleamountを加算または減算してクライアントの残高を更新した新しい更新済みクライアントファイルを作成することです。

1:

は私のコードは、これまでに私を可能にし、クライアントのために複数のトランザクションが存在しない場合、コードが完全に実行され、クライアントとその更新残高で.datファイルを書き込みます。

2:540.00 2ジョン762.00 3を

1ジェームズ:クライアントに複数の取引がある場合、それが画面に更新されたクライアントを印刷し、例えばを占めますように私のコードは、ほぼ完全に実行されますジョンのための2つのトランザクションを作成.datファイルの中にあるとしてポール414.00 4 SAM 502.00

1ジェームズ540.00 2ジョン662.00 2ジョンが含まれて表示されますが、 762.00 3ポール414.00 4 SAM 502.00

私の問題はここにある

、私は各クライアント(口座番号)のための唯一の1行が含まれているの.dat作成したの方法を見つける必要がある

私のコードが添付されている任意の助けていただければ幸いです。

#include <stdio.h> 
#include <string.h> 
int main(void) 
{ 
    int account, matches=0;  /* account number */ 
    char date[ 30 ]; /* account Date */ 
    double balance, saleamount,total=0, temp;; /* account SaleAmount */ 
    int transaccount; 
    char name [ 30 ]; 
    char lastname[30]; 
    int lastaccount=-1; 
    double lastbalance; 



    FILE *cfPtr;  /* cfPtr = clients.dat file pointer */ 
    FILE *ctPtr; /* cfPtr = transaction.dat file pointer */ 
    FILE *cfPtr2; /* cfPtr2 = new client file */ 

    cfPtr2 = fopen("clientupdate.dat", "w"); 

    /* fopen opens file; exits program if file cannot be opened */ 
    if ((cfPtr = fopen("clients.dat", "r")) == NULL) { 
     printf("clients could not be opened\n"); 
     /*fflush(stdin);*/ 
    } /* end if */ 
    else 
     if((ctPtr = fopen("transactions.dat", "r")) == NULL) 
     { 
      printf("File could not be opened\n"); 
      /*fflush(stdin);*/ 
     } 
    else { /* read account, date,name, balance and SaleAmount from files */ 
     fscanf(cfPtr, "%d%s%lf", &account, &name, &balance); 
     /*fflush(stdin);*/ 

     fscanf(ctPtr, "%d%s%lf", &transaccount, &date, &saleamount); 
     /*fflush(stdin);*/ 

     printf("%-13s%-10s%s\n", " Account", "Name", "Balance"); 
     printf("|----------------------------------|\n"); 
     while(!feof(ctPtr)) 
     { 

      while(!feof(cfPtr) &&matches==0) 
      { 
       if(account == transaccount) 
       { 
        if (lastaccount != account) { 
        if (lastaccount != -1) 
        printf(" %-10d%-10s%.2lf\n", lastaccount, lastname, lastbalance); 
        lastaccount = account; 
        strcpy (lastname, name); 
} 

        matches=1; 
        total=0; 
        temp = balance+saleamount; 
        total = total + temp; 
        balance = total; 
        lastbalance = balance; 
       } 
       else 
       { 

        fscanf(cfPtr, "%d%s%lf", &account, &name, &balance); 
        /*fflush(stdin);*/ 
       } 

      } 
      fprintf(cfPtr2, "%d %s %.2lf\n", account, name, total); 
      fscanf(ctPtr, "%d%s%lf", &transaccount, &date, &saleamount); 
      /*fflush(stdin);*/ 
      matches=0; 

     } 
    } 
     if (lastaccount != -1) 
    printf(" %-10d%-10s%.2lf\n", lastaccount, lastname, lastbalance); 
     fclose(cfPtr2); 
     getchar(); 
    return 0; 
} 
+1

+1よく宿題をしました。あなたはいくつかのコードを書いて、あなたが書いたことを私たちに説明しました。私たちはここに多くの良い宿題の質問が表示されません:) – Earlz

+0

@earlz私は大学でこれを勉強しています、私はそれを見て、私はそれを右に説明しない場合/偶然誰かが私を助けてくれたら。 – James

答えて

0

典型的なアプローチは、メモリにクライアントファイルをロードし、各クライアントに対するトランザクションファイルを処理し、再びディスクへのクライアントのデータをダンプすることです。

古い方法をやりたければ、トランザクションファイルを処理する前にクライアントの注文に並べ替えることができます。

+0

@ taliadonトランザクションファイルは既にクライアント注文にソートされています 結果を投稿するには 1 26/06/1991 \t 200が含まれています。00 \t 2 21/10/1251 \t 212.00 2 1212年12月12日100.00 \t 3 14/05/2100 \t 214.00 \t 4 24/19/2021 \t 152.00 \t プログラム取得します残高は画面に印刷するときに一度しか印刷されませんが、ファイルに出力するときには2つのトランザクションを持っているのでクライアント2に2行が含まれます – James

+0

クライアントファイルはすでにソートされていると仮定しますか?そうでなければ、処理する前にこれをソートしてください。 – Taliadon

+0

したがって、すべてのトランザクションは1つのブロックで発生する必要があります。トランザクションファイルでクライアント名が変更されると、このクライアントのエントリはもう存在しなくなります。この時点で、クライアントの合計を出力することは安全です。 – Taliadon

1

約束どおり、ここでは父子のアップデートの簡単な例があります。私はあなたのコードに既にファイルオープンエラーがないかチェックするのに気にかけませんでした。実際のアプリケーションでは、無効なファイルフォーマットを検出するためにfscanfの単なるEOF以上をチェックする必要があります。

#include <stdlib.h> 
#include <stdio.h> 

#define bool int 
#define false 0 
#define true !false 

#define MAX_ACCOUNT_NUMBER 99999 

typedef struct 
{ 
int accountNumber; 
char accountName[30]; 
float accountTotal; 
} ClientRecordType; 

typedef struct 
{ 
int accountNumber; 
char transactionDate[30]; 
float transactionAmount; 
} TransactionRecordType; 

FILE *oldClientFile; 
FILE *newClientFile; 
FILE *transactionFile; 


void getNextClient(FILE *p_clientFile, ClientRecordType *p_clientRecord) 
{ 
if (EOF == fscanf(p_clientFile, "%d%s%f", 
        &p_clientRecord->accountNumber, 
        &p_clientRecord->accountName, 
        &p_clientRecord->accountTotal)) 
    p_clientRecord->accountNumber = MAX_ACCOUNT_NUMBER; 
} 


void getNextTransaction(FILE *p_transactionFile, 
         TransactionRecordType *p_transactionRecord) 
{ 
if (EOF == fscanf(p_transactionFile, "%d%s%f", 
        &p_transactionRecord->accountNumber, 
        &p_transactionRecord->transactionDate, 
        &p_transactionRecord->transactionAmount)) 
    p_transactionRecord->accountNumber = MAX_ACCOUNT_NUMBER; 
} 


void writeUpdatedClientRecord(FILE *p_newClientFile, 
           ClientRecordType *p_clientRecord) 
{ 
fprintf(p_newClientFile, "%d %s %.2f ", 
     p_clientRecord->accountNumber, 
     p_clientRecord->accountName, 
     p_clientRecord->accountTotal); 
} 


bool performTransactionUpdate(FILE *p_oldClientFile, 
           FILE *p_newClientFile, 
           FILE *p_transactionFile) 
{ 
ClientRecordType clientRecord; 
TransactionRecordType transactionRecord; 

getNextClient(p_oldClientFile, &clientRecord); 
getNextTransaction(p_transactionFile, &transactionRecord); 
while (MAX_ACCOUNT_NUMBER != clientRecord.accountNumber) 
{ 
    if (clientRecord.accountNumber == transactionRecord.accountNumber) 
    { 
    clientRecord.accountTotal += transactionRecord.transactionAmount; 
    getNextTransaction(p_transactionFile, &transactionRecord); 
    } 
    else if (clientRecord.accountNumber < transactionRecord.accountNumber) 
    { 
    writeUpdatedClientRecord(p_newClientFile, &clientRecord); 
    getNextClient(p_oldClientFile, &clientRecord); 
    } 
    else 
    { 
    return false; 
    } 
} 
if (MAX_ACCOUNT_NUMBER != transactionRecord.accountNumber) return false; 
return true; 
} 


int main(int argc, char *argv[]) 
{ 
oldClientFile = fopen("clients.dat", "r"); 
newClientFile = fopen("newclients.dat", "w"); 
transactionFile = fopen("transactions.dat", "r"); 

if (performTransactionUpdate(oldClientFile, 
           newClientFile, 
           transactionFile)) 
    printf("\nUpdate completed without errors!\n"); 
else 
    printf("\nUnsorted files or invalid transactions encountered\n"); 

close(newClientFile); 
close(oldClientFile); 
close(transactionFile); 
return 0; 
} 
0

私は、回答コードとこの作業コードを思いついた仲間の学生の助けを借りて終了しました。これをどうやって動かすかを考えてくれてありがとう。

#include <stdio.h> 
#include <string.h> 
int main(void) 
{ 
    int account;  /* account number */ 
    char date[ 30 ]; /* account Date */ 
    double balance, saleamount; /* account SaleAmount */ 
    int transaccount; 
    char name [ 30 ]; 
    int newaccount; 
    char newname[ 30]; 
    double newbalance; 
    int match=0; 



    FILE *cfPtr;  /* cfPtr = clients.dat file pointer */ 
    FILE *ctPtr; /* cfPtr = transaction.dat file pointer */ 
    FILE *cfPtr2; /* cfPtr2 = new client file */ 

    cfPtr2 = fopen("clientupdate.dat", "w"); 

    /* fopen opens file; exits program if file cannot be opened */ 
    if ((cfPtr = fopen("clients.dat", "r")) == NULL) { 
     printf("clients could not be opened\n"); 

    } /* end if */ 
    else 
     if((ctPtr = fopen("transactions.dat", "r")) == NULL) 
     { 
      printf("File could not be opened\n"); 

     } 
    else { /* read account, date,name, balance and SaleAmount from files */ 
     fscanf(cfPtr, "%d%s%lf", &account, &name, &balance); 


     fscanf(ctPtr, "%d%s%lf", &transaccount, &date, &saleamount); 
     fscanf(cfPtr2, "%d%s%lf", &newaccount, &newname, &newbalance); 
     while (!feof(cfPtr)) 
     { 
      transaccount=1; 
      newbalance=balance; 
      while (!feof(ctPtr)) 
      { 
       if(transaccount==account&&match==0) 
       { 
       newbalance = balance + saleamount; 
       match++; 
       } 
       else 
        if(transaccount==account&&match>0) 
        newbalance = newbalance + saleamount; 

       fscanf(ctPtr, "%d%s%lf", &transaccount, date, &saleamount); 
      } 
      rewind(ctPtr); 
      match=0; 

     fprintf(cfPtr2, "%d %s %.2f\n", account, name, newbalance); 
     fscanf(cfPtr, "%d%s%lf", &account, name, &balance); 
     } 

     rewind(cfPtr2); 
    } 
     fclose(cfPtr2); 
     fclose(cfPtr); 
     fclose(ctPtr); 
     getchar(); 
    return 0; 
} 
関連する問題