2011-05-23 21 views
-2

我編輯我不能回答我的問題如何在二進制文件中保存日期然後讀取文件並打印出來?

// Cajero.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include "MiLib.h" 
#include <time.h> 
#include <string.h> 

int Menu1(); 
void Baja(FILE* fp); 
void Modificar(FILE* fp); 
void Retiro(FILE* fp,FILE* as); 
void Deposito(FILE* fp); 
void ImprimeC(FILE* fp); 
void ImprimeT(FILE* as); 
void CuentaE(FILE* fp); 
void CuentaN(CUENTA* Dar,FILE* fp); 
void DarAlta(FILE* fp); 
int Menu2(); 
void Tranfe(FILE* fp); 
void Consu(FILE* fp); 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    CUENTA cuenta; 
    TRANSFE temp; 
    FILE *fptr,*asdf; 
    int opcion = 0,opcion2=0; 
    fptr = fopen("Cuentas.db", "r+b"); 
    if(fptr == NULL) { 
     fptr = fopen("Cuentas.db", "w+b"); 
     return 1; 
    } 
    asdf = fopen("Transferencias.db", "r+b"); 
    if(asdf == NULL) { 
     asdf = fopen("Transferencias.db", "w+b"); 
     return 1; 
    } 




    while(opcion < 6) { 
     opcion=0; 
     opcion = Menu1(); 
     switch(opcion) { 
      case 1: { 
       Retiro(fptr,asdf); 
       break;   
      } 
      case 2: { 
       Deposito(fptr); 
        break; 
      } // fin del caso 2 borrar 
      case 3:{ 
        Tranfe(fptr); 
        break; 
        } 
      case 4:{ 
        Consu(fptr); 
        break; 
        } 
      case 5: { 
       opcion2=0; 
       opcion2=Menu2(); 
       switch(opcion2){ 
        case 1:{ 
         DarAlta(fptr); 
         break; 
        } 
        case 2:{ 
         Baja(fptr); 
         break; 
        } 
        case 3:{ 
         Modificar(fptr); 
         break; 
        } 
        case 4:{ 
         ImprimeC(fptr); 
         getche(); 
         ImprimeT(asdf); 
         getch(); 
         break; 
        } 
       } 
       break; 
       } 


      default : { 
       break; 
       } 
     } 
    } 

    fclose(fptr); 
    fclose(asdf); 

    return 0; 


} 

void ImprimeT(FILE* as){ 
    TRANSFE temp; 
    system("cls"); 
    printf("     L I S T A D E T R A N S F E R E N C I A S\n\n"); 
    printf("Cuenta Dinero  Movimiento Fecha \n"); 
    printf("------- ----------- ------------- --------------------\n"); 
    rewind(as); 
    do { 
    fflush (as); 
    fread(&temp, sizeof(TRANSFE), 1, as); 
    if(feof(as)) break; 

    if (temp.baja == 0) { 
     printf("%d %f %s %s\n", 
      temp.numero, temp.dinero, temp.movi, 
      asctime(&temp.timeinfo)); // pass address of struct tm to asctime 

     fflush (as); 
    } 
} while(TRUE); 
    return; 


} 

void Baja(FILE* fp) { 

    int baja, nip ,existe = FALSE; 
    fpos_t Fpos; 
    CUENTA temp; 
    system("cls"); 
    printf("\n\n\n"); 
    printf("\t\tOpcion de baja cuenta\n"); 
    printf("\t\tCuenta a dar de baja -> "); 
    scanf("%d", &baja); 
    rewind(fp); 

    do { 
     fgetpos(fp, &Fpos); 
     fread(&temp, sizeof(CUENTA), 1, fp); 
     if(feof(fp)) break; 

     if(baja == temp.numero) { 
      printf("\n\t\tNIP ->"); 
      scanf("%d",&nip); 
      if(nip == temp.nip) { 


      if(temp.baja == 0) { 
       temp.baja = 1; // lo marco como baja logica 
       fsetpos(fp, &Fpos); 
       fwrite(&temp, sizeof(CUENTA), 1, fp); 
       printf("\n\nCuenta: %d dado de BAJA\n", temp.numero); 
       } else { 
        printf("\t\tEsta Cuenta ya fue dado de baja\n"); 
      } 
      existe = TRUE; 
      break; // salida del if 
     }else{ 

      printf("\n\t\tNIP equivocado intente de nuevo"); 
      getche(); 
      Baja(fp); 
      } 
     } 
    } while(TRUE); 
    if(!existe) { 
     printf("\t\tLa cuenta no existe en el archivo"); 
     getche(); 
     return; 
    } 
    return; 
} 

void Modificar(FILE* fp){ 

    int cuenta,nip=0,op=0, existe = FALSE; 
    char nombre[50]; 
    fpos_t Fpos; // direccion del registro 
    CUENTA temp; 
    system("cls"); 
    printf("\n\n\n"); 
    printf("\t\tOpcion de modificar cuenta\n"); 
    printf("\t\tCuenta -> "); 
    scanf("%d", &cuenta); 
    rewind(fp); 
    do { 
     fgetpos(fp, &Fpos); 
     fread(&temp, sizeof(CUENTA), 1, fp); 
     if(feof(fp)) break; 

     if(cuenta == temp.numero) { 
      printf("\n\t\tNIP ->"); 
      scanf("%d",&nip); 

      if(nip==temp.nip){ 

       do{ 
        system("cls"); 
        printf("\n\n\n\t\t1.- Nombre"); 
        printf("\n\t\t2.- NIP"); 
        printf("\n\t\t3.- RFC"); 
        printf("\n\t\t4.- Regresar al menu"); 
        printf("\n\n\t\tQue desea modificar ->"); 
        scanf("%d",&op); 
        system("cls"); 

        switch(op){ 
         case 1:{ 
          printf("\n\t\t Nuevo nombre ->"); 
          scanf(" %[^\n]",temp.nombre); 
          fsetpos(fp, &Fpos); 
          fwrite(&temp, sizeof(CUENTA), 1, fp); 
          printf("\n\t\t Modificacion efectuada con exito"); 
          break; 
          } 
         case 2:{ 
          printf("\n\t\tNuevo NIP ->"); 
          scanf("%d",&temp.nip); 
          fsetpos(fp, &Fpos); 
          fwrite(&temp, sizeof(CUENTA), 1, fp); 
          printf("\n\t\tModificacion efectuada con exito"); 
          break; 
          } 
         case 3:{ 
          printf("\n\t\tNuevo RFC ->"); 
          scanf(" %[^\n]",&temp.RFC); 
          fsetpos(fp, &Fpos); 
          fwrite(&temp, sizeof(CUENTA), 1, fp); 
          printf("\n\t\tModificacion efectuada con exito"); 
          break; 

           } 
         default:{ 
          return; 
          } 
        } 

       }while(op<4); 

       fsetpos(fp, &Fpos); 
       fwrite(&temp, sizeof(CUENTA), 1, fp); 

      }else{ 
      printf("\n\t\tNIP equivocado intente de nuevo"); 
      getche(); 
      Modificar(fp); 

      } 
      existe = TRUE; 
      break; // salida del if 
     } 
    } while(TRUE); 
    if(!existe) { 
     printf("\t\tLa cuenta no existe en el archivo"); 
     getch(); 
     return; 
    } 
    return; 

} 

void Retiro(FILE* fp,FILE* as){ 


    int cuenta,nip=0, existe = FALSE; 
    float retiro=0.0,saldoactual=0.0; 
    TRANSFE transfe; 
    time_t rawtime; 
    struct tm * timeinfo; 
    fpos_t Fpos; 
    CUENTA temp; 



    system("cls"); 
    printf("\n\n\n"); 
    printf("\t\tOpcion de retiro a cuenta\n"); 
    printf("\t\tCuenta -> "); 
    scanf("%d", &cuenta); 
    rewind(fp); 
    do { 
     fgetpos(fp, &Fpos); 
     fread(&temp, sizeof(CUENTA), 1, fp); 
     if(feof(fp)) break; 

     if(cuenta == temp.numero) { 
      printf("\n\t\tNIP ->"); 
      scanf("%d",&nip); 

      if(nip==temp.nip){ 
       printf("\n\t\tSaldo actual-> %f",temp.dinero); 
       printf("\n\t\tCifra a retirar->"); 
       scanf("%f",&retiro); 
       saldoactual=(float)temp.dinero-retiro; 
       if(saldoactual<0.0){ 
        printf("Insuficientes fondos"); 
        getch(); 
        Retiro(fp,as); 
       }else{ 
        temp.dinero=saldoactual; 
        fsetpos(fp, &Fpos); 
        fwrite(&temp, sizeof(CUENTA), 1, fp); 
        printf("\n\t\tRetiro efectuado con exito"); 

        transfe.numero=temp.numero; 
        transfe.baja=temp.baja; 
        transfe.dinero=retiro; 
        time (&rawtime); 
        transfe.timeinfo = *localtime (&rawtime); // copy into struct tm 

        strncpy(transfe.movi, "retiro", MAXLEN); // copy into array 

        fwrite(&transfe,sizeof(TRANSFE),1,as); 

        getch(); 
        return; 
       } 
      }else{ 
      printf("NIP equivocado intente de nuevo"); 
      getche(); 
      Retiro(fp,as); 
      } 
      existe = TRUE; 
      break; 
     } 
    } while(TRUE); 
    if(!existe) { 
     printf("\t\tLa cuenta no existe en el archivo"); 
     getch(); 
     return; 
    } 
    return; 

} 

void Deposito(FILE* fp){ 

    int cuenta,nip=0, existe = FALSE; 
    float deposito; 
    fpos_t Fpos; // direccion del registro 
    CUENTA temp; 
    system("cls"); 
    printf("\n\n\n"); 
    printf("\t\tOpcion de deposito a cuenta\n"); 
    printf("\t\tCuenta -> "); 
    scanf("%d", &cuenta); 
    rewind(fp); 
    do { 
     fgetpos(fp, &Fpos); 
     fread(&temp, sizeof(CUENTA), 1, fp); 
     if(feof(fp)) break; 

     if(cuenta == temp.numero) { 
      printf("\n\t\tNIP ->"); 
      scanf("%d",&nip); 

      if(nip==temp.nip){ 
       printf("\n\t\tSaldo actual-> %f",temp.dinero); 
       printf("\n\t\tCifra a depositar->"); 
       scanf("%f",&deposito); 
       deposito=temp.dinero+deposito; 

       temp.dinero=deposito; 
       fsetpos(fp, &Fpos); 
       fwrite(&temp, sizeof(CUENTA), 1, fp); 
       printf("\n\t\tDeposito efectuado con exito"); 

      }else{ 
      printf("NIP equivocado intente de nuevo"); 
      getche(); 
      Deposito(fp); 
      } 
      existe = TRUE; 
      break; // salida del if 
     } 
    } while(TRUE); 
    if(!existe) { 
     printf("\t\tLa cuenta no existe en el archivo"); 
     getche(); 
     return; 
    } 
    return; 

} 

void ImprimeC(FILE* fp) { 
    CUENTA temp; 
    system("cls"); // ordena limpiar la pantalla 
    printf("     L I S T A D E C U E N T A S\n\n"); 
    printf("Cuenta Nombre     Dinero   RFC \n"); 
    printf("------- -------------------- ------------- --------------------\n"); 
    rewind(fp); 
    do { 
     fread(&temp, sizeof(CUENTA), 1, fp); 
     if(feof(fp)) break; // salida del while 
     if(temp.baja == 0) { 
      printf("%7d %-20s %9.2f  %-20s\n", temp.numero, temp.nombre, temp.dinero,temp.RFC); 
     } // fin frl if 
    } while(TRUE); // fin del for que muestra los datos en pantalla 
    return; 
} 

void CuentaE(FILE* fp){ 

    int cuenta,nip=0, existe = FALSE; 
    float deposito; 
    fpos_t Fpos; // direccion del registro 
    CUENTA temp; 
    system("cls"); 
    printf("\n\n\n"); 
    printf("\t\tDar de alta cuenta existente\n"); 
    printf("\t\tCuenta -> "); 
    scanf("%d", &cuenta); 
    rewind(fp); 
    do { 
     fgetpos(fp, &Fpos); 
     fread(&temp, sizeof(CUENTA), 1, fp); 
     if(feof(fp)) break; 

     if(cuenta == temp.numero) { 
      printf("\n\t\tNIP ->"); 
      scanf("%d",&nip); 

      if(nip==temp.nip){ 
       temp.baja=0; 
       fsetpos(fp, &Fpos); 
       fwrite(&temp, sizeof(CUENTA), 1, fp); 
       printf("\n\t\tCuenta dada de alta con exito"); 

      }else{ 
      printf("NIP equivocado intente de nuevo"); 
      getche(); 
      DarAlta(fp); 
      } 
      existe = TRUE; 
      break; // salida del if 
     } 
    } while(TRUE); 
    if(!existe) { 
     printf("\t\tLa cuenta no existe en el archivo"); 
     getch(); 
     return; 
    } 
    return; 

} 

int Menu1(){ 

    int op; 
    system("cls"); 
    printf("\n\n\n\t\t1.-Retiro de cuenta"); 
    printf("\n\t\t2.-Depositar a cuenta"); 
    printf("\n\t\t3.-Transferencia"); 
    printf("\n\t\t4.-Colsulta de saldo"); 
    printf("\n\t\t5.-Opciones de cuentas"); 
    printf("\n\t\t6.-Salir"); 
    printf("\n\n\t\tOpcion----->"); 
    scanf("%d",&op); 

    system("cls"); 

    return op; 

} 

void CuentaN(CUENTA* Dat,FILE* fp){ 

    int existe=FALSE; 
    rewind(fp); 

    system("cls"); 

    CUENTA temp; 
    printf("\n\n\n"); 
    printf("\t\tNumero -> "); 
    scanf("%d", &Dat->numero); 
    do { 


     fread(&temp, sizeof(CUENTA), 1, fp); 

     if(feof(fp)) break; // salida del while 

     if(temp.numero==Dat->numero){ 
      printf("\n\t\tCuenta existente por favor elegir otro numero de cuenta"); 
      getche(); 
      existe=TRUE; 
      return;   
     } 

    } while(TRUE); 

    if(!existe){ 

     printf("\t\tNIP -> "); 
     scanf("%d", &Dat->nip); 
     printf("\t\tNombre -> "); 
     scanf(" %[^\n]", &Dat->nombre); 
     printf("\t\tDeposito -> "); 
     scanf("%f", &Dat->dinero); 
     printf("\t\tRFC -> "); 
     scanf(" %[^\n]", &Dat->RFC); 
     printf("\n"); 
     Dat->baja = 0; 

     printf("\n\t\tCuenta creada con exito"); 
     getche(); 

    }else{ 
     return; 
    } 

    do { 
     fread(&temp, sizeof(CUENTA), 1, fp); 
     if(feof(fp)) break; 

    } while(TRUE); 

    return; 

} 

void DarAlta(FILE* fp){ 

    int op; 
    CUENTA cuenta; 
    system("cls"); 
    printf("\n\n\n\t\t1.- Dar de alta cuenta existente"); 
    printf("\n\t\t2.- Dar de alta cuenta inexsistente"); 
    printf("\n\t\t3.- Regresar al menu"); 
    printf("\n\n\t\tQue desea modificar ->"); 
    scanf("%d",&op); 

    switch(op){ 
    case 1:{ 
      CuentaE(fp); 
      break; 
      } 
    case 2:{ 
      CuentaN(&cuenta,fp); 
      fwrite(&cuenta, sizeof(CUENTA), 1, fp); 
      break; 
      } 
    default:{ 

      return; 
      } 
    } 

    system("cls"); 

    return; 
} 

int Menu2(){ 

    int op2; 
    system("cls"); 
    printf("\n\n\n\t\t1.-Dar de alta cuenta"); 
    printf("\n\t\t2.-Dar de baja cuenta"); 
    printf("\n\t\t3.-Modificar cuenta"); 
    printf("\n\t\t4.-Listar cuentas"); 
    printf("\n\t\t5.-Regresar al menu anterior"); 
    printf("\n\n\t\tOpcion----->"); 
    scanf("%d",&op2); 

    system("cls"); 

    return op2; 

} 

void Tranfe(FILE* fp){ 

    int cuenta,cuentatr,nip, existe = FALSE,existetr =FALSE; 
    float trans=0.0,saldon; 
    fpos_t Fpos,Fpostr; // direccion del registro 
    CUENTA temp,temp2; 
    system("cls"); 
    printf("\n\n\n"); 
    printf("\t\tOpcion de transferencia\n"); 
    printf("\t\tCuenta que tranfiere -> "); 
    scanf("%d", &cuenta); 
    rewind(fp); 

    do{ 
     fgetpos(fp, &Fpos); 
     fread(&temp, sizeof(CUENTA), 1, fp); 

     if(feof(fp)) break; 

     if(temp.numero==cuenta){ 
      printf("\n\t\tNIP ->"); 
      scanf("%d",&nip); 

      if(temp.nip==nip){ 
       printf("\n\t\tSaldo actual-> %f",temp.dinero); 
       printf("\n\t\tDinero a transferir ->"); 
       scanf("%f",&trans); 
       if(temp.dinero-trans>=0){ 
        temp.dinero=temp.dinero-trans; 

       }else{ 
        printf("\n\n\t\tCuenta con insuficiente dinero"); 
        getche(); 
        Tranfe(fp); 
       } 
       printf("\n\n\t\tCuenta a transferir ->"); 
       scanf("%d",&cuentatr); 

       rewind(fp); 

       do{ 
        fgetpos(fp,&Fpostr); 
        fread(&temp2, sizeof(CUENTA), 1, fp); 
        if(feof(fp)) break; 


        if(temp2.numero==cuentatr){ 

         temp2.dinero=temp2.dinero+trans; 
         fsetpos(fp,&Fpostr); 
         fwrite(&temp2, sizeof(CUENTA), 1, fp); 
         fsetpos(fp,&Fpos); 
         fwrite(&temp, sizeof(CUENTA), 1, fp); 
         printf("\n\n\t\tTransferencia con exito"); 

         existetr = TRUE; 
         return; 

        } 


       }while(TRUE); 
       if(!existetr) { 
        printf("\t\tLa cuenta no existe en el archivo"); 
        getche(); 
        Tranfe(fp); 
       } 


      }else{ 
      printf("\n\n\tNIP equivocado"); 
      getche(); 
      Tranfe(fp); 
      } 
      existe = TRUE; 
      break; // salida del if 
     } 


    }while(TRUE); 

    if(!existe) { 
     printf("\t\tLa cuenta no existe en el archivo"); 
     getche(); 
     return; 
    } 


    return; 
} 

void Consu(FILE* fp){ 

    int cuenta,nip=0, existe = FALSE; 
    float deposito; 
    fpos_t Fpos; // direccion del registro 
    CUENTA temp; 
    system("cls"); 
    printf("\n\n\n"); 
    printf("\t\tOpcion de consulta de saldo\n"); 
    printf("\t\tCuenta -> "); 
    scanf("%d", &cuenta); 
    rewind(fp); 
    do { 
     fgetpos(fp, &Fpos); 
     fread(&temp, sizeof(CUENTA), 1, fp); 
     if(feof(fp)) break; 

     if(cuenta == temp.numero) { 
      printf("\n\t\tNIP ->"); 
      scanf("%d",&nip); 

      if(nip==temp.nip){ 
       printf("\n\t\tSaldo actual-> %f",temp.dinero); 
       getche(); 

      }else{ 
      printf("NIP equivocado intente de nuevo"); 
      getche(); 
      Consu(fp); 
      } 
      existe = TRUE; 
      break; // salida del if 
     } 
    } while(TRUE); 
    if(!existe) { 
     printf("\t\tLa cuenta no existe en el archivo"); 
     getche(); 
     return; 
    } 
    return; 

} 
+0

這很明顯是「墜毀」。錯誤信息是什麼?哪條線路崩潰? – YXD 2011-05-23 23:22:51

+0

localtime返回一個指針。你不能有意義地保存一個指向文件的指針。您需要保存它指向的值,比如'timeinfo = * localtime(&rawtime)'。保存並加載rawtime並調用localtime可能會更簡單。 rawtime是一個time_t,用於在二進制文件中進行存儲。 – hsmiths 2011-05-23 23:25:17

+0

typedef struct { \t int numero; \t float dinero; \t int baja; \t struct tm * timeinfo; \t char * movi; } TRANSFE; 這是結構女巫我想保存當地時間 – Sergio 2011-05-23 23:33:26

回答

1

你不能有意義的保存和載入指針。在寫入之前將所有指針更改爲結構值或數組。

聲明

  #define MAXLEN 100 // set to maximum length you expect movi to need 
      typedef struct { 
       int numero; 
       float dinero; 
       int baja; 
       struct tm timeinfo; // struct tm, not pointer to struct tm 
       char movi[MAXLEN]; // character array, not pointer 
      } TRANSFE; 

要寫入

  transfe.numero=temp.numero; 
      transfe.baja=temp.baja; 
      transfe.dinero=retiro; 
      time (&rawtime); 
      transfe.timeinfo = *localtime (&rawtime); // copy into struct tm 

      strncpy(transfe.movi, "retiro", MAXLEN); // copy into array 

      fwrite(&transfe,sizeof(TRANSFE),1,as); 

要閱讀

do { 
    fflush (as); 
    fread(&temp, sizeof(TRANSFE), 1, as); 
    if(feof(as)) break; 

    if (temp.baja == 0) { 
     printf("%d %f %s %s\n", 
      temp.numero, temp.dinero, temp.movi, 
      asctime(&temp.timeinfo)); // pass address of struct tm to asctime 

     fflush (as); 
    } 
} while(TRUE); 

你可能不需要fflush調用無論是。

一些更多的想法:

目前還不清楚我的fread後FEOF會可靠地檢測EOF沒有放棄最後的記錄。我建議你改變你所有的環從

do { 
    fflush (as); 
    fread(&temp, sizeof(TRANSFE), 1, as); 
    if(feof(as)) break; 
    // do something 
} while(TRUE); 

改用此:

while (TRUE) { 
    if (fread(&temp, sizeof(TRANSFE), 1, as) != 1) 
     break; 
    // do something 
} 

另外,如果你已經改變TRANSFE的聲明之前寫入數據文件將不兼容。刪除它們並創建新的空文件。

如果您的文件中包含一些已知良好的數據,它將幫助您進行調試。您可以使用類似這樣的方式將測試數據填充到文件中,以便您可以使用它進行調試。

 FILE *fcuentas = fopen("Cuentas.db", "w+b"); 
     for (int i=1; i<10; i++) 
     { 
      CUENTA test = {}; 
      test.baja = i*100 + 1; 
      test.dinero = i*100 + 2; 
      test.nip = i*100 + 3; 
      strcpy(test.nombre, "test nombre"); 
      test.numero = i*100 + 5; 
      strcpy(test.RFC,"test RFC"); 
      fwrite(&test, sizeof(CUENTA), 1, fcuentas); 
     } 
     fclose(fcuentas); 

     FILE *ftransferencias = fopen("Transferencias.db", "w+b"); 
     for (int i=1; i<10; i++) 
     { 
      TRANSFE test = {}; 
      test.baja = i*100 + 1; 
      test.dinero = i*100 + 2; 
      strcpy(test.movi, "test movi"); 
      test.numero = i*1000 + 5; 
      time_t rawtime; 
      time (&rawtime); 
      test.timeinfo = *localtime (&rawtime); // copy into struct tm 
      fwrite(&test, sizeof(TRANSFE), 1, ftransferencias); 
     } 
     fclose(ftransferencias); 
+0

它寫入第一個在binery文件,但是當我再次調用funtion不寫任何東西或它唯一的打印第一個 – Sergio 2011-05-23 23:56:32

+0

如果你有我們可以幫助你更好地調試發佈了演示你的問題的整個代碼。當你剛剛學習c語言和圖書館中有很多陷阱時,你可以掛斷電話。 – hsmiths 2011-05-23 23:59:49

+0

我編輯整個代碼的問題 – Sergio 2011-05-24 00:10:39

相關問題