#c #c
#c #c
Вопрос:
я редактирую его, я не смог ответить на свой собственный вопрос
// 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 Snn");
printf("Cuenta Dinero Movimiento Fecha n");
printf("------- ----------- ------------- --------------------n");
rewind(as);
do {
fflush (as);
fread( amp;temp, sizeof(TRANSFE), 1, as );
if( feof(as) ) break;
if (temp.baja == 0) {
printf("%d %f %s %sn",
temp.numero, temp.dinero, temp.movi,
asctime(amp;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("nnn");
printf("ttOpcion de baja cuentan");
printf("ttCuenta a dar de baja -> ");
scanf("%d", amp;baja);
rewind(fp);
do {
fgetpos( fp, amp;Fpos );
fread( amp;temp, sizeof(CUENTA), 1, fp );
if( feof(fp) ) break;
if(baja == temp.numero) {
printf("nttNIP ->");
scanf("%d",amp;nip);
if(nip == temp.nip) {
if(temp.baja == 0) {
temp.baja = 1; // lo marco como baja logica
fsetpos( fp, amp;Fpos );
fwrite( amp;temp, sizeof(CUENTA), 1, fp );
printf("nnCuenta: %d dado de BAJAn", temp.numero);
} else {
printf("ttEsta Cuenta ya fue dado de bajan");
}
existe = TRUE;
break; // salida del if
}else{
printf("nttNIP equivocado intente de nuevo");
getche();
Baja(fp);
}
}
} while( TRUE );
if(!existe) {
printf("ttLa 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("nnn");
printf("ttOpcion de modificar cuentan");
printf("ttCuenta -> ");
scanf("%d", amp;cuenta);
rewind(fp);
do {
fgetpos( fp, amp;Fpos );
fread( amp;temp, sizeof(CUENTA), 1, fp );
if( feof(fp) ) break;
if(cuenta == temp.numero) {
printf("nttNIP ->");
scanf("%d",amp;nip);
if(nip==temp.nip){
do{
system("cls");
printf("nnntt1.- Nombre");
printf("ntt2.- NIP");
printf("ntt3.- RFC");
printf("ntt4.- Regresar al menu");
printf("nnttQue desea modificar ->");
scanf("%d",amp;op);
system("cls");
switch(op){
case 1:{
printf("ntt Nuevo nombre ->");
scanf(" %[^n]",temp.nombre);
fsetpos( fp, amp;Fpos );
fwrite( amp;temp, sizeof(CUENTA), 1, fp );
printf("ntt Modificacion efectuada con exito");
break;
}
case 2:{
printf("nttNuevo NIP ->");
scanf("%d",amp;temp.nip);
fsetpos( fp, amp;Fpos );
fwrite( amp;temp, sizeof(CUENTA), 1, fp );
printf("nttModificacion efectuada con exito");
break;
}
case 3:{
printf("nttNuevo RFC ->");
scanf(" %[^n]",amp;temp.RFC);
fsetpos( fp, amp;Fpos );
fwrite( amp;temp, sizeof(CUENTA), 1, fp );
printf("nttModificacion efectuada con exito");
break;
}
default:{
return;
}
}
}while(op<4);
fsetpos( fp, amp;Fpos );
fwrite( amp;temp, sizeof(CUENTA), 1, fp );
}else{
printf("nttNIP equivocado intente de nuevo");
getche();
Modificar(fp);
}
existe = TRUE;
break; // salida del if
}
} while( TRUE );
if(!existe) {
printf("ttLa 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("nnn");
printf("ttOpcion de retiro a cuentan");
printf("ttCuenta -> ");
scanf("%d", amp;cuenta);
rewind(fp);
do {
fgetpos( fp, amp;Fpos );
fread( amp;temp, sizeof(CUENTA), 1, fp );
if( feof(fp) ) break;
if(cuenta == temp.numero) {
printf("nttNIP ->");
scanf("%d",amp;nip);
if(nip==temp.nip){
printf("nttSaldo actual-> %f",temp.dinero);
printf("nttCifra a retirar->");
scanf("%f",amp;retiro);
saldoactual=(float)temp.dinero-retiro;
if(saldoactual<0.0){
printf("Insuficientes fondos");
getch();
Retiro(fp,as);
}else{
temp.dinero=saldoactual;
fsetpos( fp, amp;Fpos );
fwrite( amp;temp, sizeof(CUENTA), 1, fp );
printf("nttRetiro efectuado con exito");
transfe.numero=temp.numero;
transfe.baja=temp.baja;
transfe.dinero=retiro;
time ( amp;rawtime );
transfe.timeinfo = *localtime ( amp;rawtime ); // copy into struct tm
strncpy(transfe.movi, "retiro", MAXLEN); // copy into array
fwrite(amp;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("ttLa 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("nnn");
printf("ttOpcion de deposito a cuentan");
printf("ttCuenta -> ");
scanf("%d", amp;cuenta);
rewind(fp);
do {
fgetpos( fp, amp;Fpos );
fread( amp;temp, sizeof(CUENTA), 1, fp );
if( feof(fp) ) break;
if(cuenta == temp.numero) {
printf("nttNIP ->");
scanf("%d",amp;nip);
if(nip==temp.nip){
printf("nttSaldo actual-> %f",temp.dinero);
printf("nttCifra a depositar->");
scanf("%f",amp;deposito);
deposito=temp.dinero deposito;
temp.dinero=deposito;
fsetpos( fp, amp;Fpos );
fwrite( amp;temp, sizeof(CUENTA), 1, fp );
printf("nttDeposito efectuado con exito");
}else{
printf("NIP equivocado intente de nuevo");
getche();
Deposito(fp);
}
existe = TRUE;
break; // salida del if
}
} while( TRUE );
if(!existe) {
printf("ttLa 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 Snn");
printf("Cuenta Nombre Dinero RFC n");
printf("------- -------------------- ------------- --------------------n");
rewind(fp);
do {
fread( amp;temp, sizeof(CUENTA), 1, fp );
if( feof(fp) ) break; // salida del while
if(temp.baja == 0) {
printf("} %-20s %9.2f %-20sn", 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("nnn");
printf("ttDar de alta cuenta existenten");
printf("ttCuenta -> ");
scanf("%d", amp;cuenta);
rewind(fp);
do {
fgetpos( fp, amp;Fpos );
fread( amp;temp, sizeof(CUENTA), 1, fp );
if( feof(fp) ) break;
if(cuenta == temp.numero) {
printf("nttNIP ->");
scanf("%d",amp;nip);
if(nip==temp.nip){
temp.baja=0;
fsetpos( fp, amp;Fpos );
fwrite( amp;temp, sizeof(CUENTA), 1, fp );
printf("nttCuenta 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("ttLa cuenta no existe en el archivo");
getch();
return;
}
return;
}
int Menu1(){
int op;
system("cls");
printf("nnntt1.-Retiro de cuenta");
printf("ntt2.-Depositar a cuenta");
printf("ntt3.-Transferencia");
printf("ntt4.-Colsulta de saldo");
printf("ntt5.-Opciones de cuentas");
printf("ntt6.-Salir");
printf("nnttOpcion----->");
scanf("%d",amp;op);
system("cls");
return op;
}
void CuentaN(CUENTA* Dat,FILE* fp){
int existe=FALSE;
rewind(fp);
system("cls");
CUENTA temp;
printf("nnn");
printf("ttNumero -> ");
scanf("%d", amp;Dat->numero);
do {
fread( amp;temp, sizeof(CUENTA), 1, fp );
if( feof(fp) ) break; // salida del while
if(temp.numero==Dat->numero){
printf("nttCuenta existente por favor elegir otro numero de cuenta");
getche();
existe=TRUE;
return;
}
} while(TRUE);
if(!existe){
printf("ttNIP -> ");
scanf("%d", amp;Dat->nip);
printf("ttNombre -> ");
scanf(" %[^n]", amp;Dat->nombre);
printf("ttDeposito -> ");
scanf("%f", amp;Dat->dinero);
printf("ttRFC -> ");
scanf(" %[^n]", amp;Dat->RFC);
printf("n");
Dat->baja = 0;
printf("nttCuenta creada con exito");
getche();
}else{
return;
}
do {
fread( amp;temp, sizeof(CUENTA), 1, fp );
if( feof(fp) ) break;
} while(TRUE);
return;
}
void DarAlta(FILE* fp){
int op;
CUENTA cuenta;
system("cls");
printf("nnntt1.- Dar de alta cuenta existente");
printf("ntt2.- Dar de alta cuenta inexsistente");
printf("ntt3.- Regresar al menu");
printf("nnttQue desea modificar ->");
scanf("%d",amp;op);
switch(op){
case 1:{
CuentaE(fp);
break;
}
case 2:{
CuentaN(amp;cuenta,fp);
fwrite( amp;cuenta, sizeof(CUENTA), 1, fp);
break;
}
default:{
return;
}
}
system("cls");
return;
}
int Menu2(){
int op2;
system("cls");
printf("nnntt1.-Dar de alta cuenta");
printf("ntt2.-Dar de baja cuenta");
printf("ntt3.-Modificar cuenta");
printf("ntt4.-Listar cuentas");
printf("ntt5.-Regresar al menu anterior");
printf("nnttOpcion----->");
scanf("%d",amp;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("nnn");
printf("ttOpcion de transferencian");
printf("ttCuenta que tranfiere -> ");
scanf("%d", amp;cuenta);
rewind(fp);
do{
fgetpos( fp, amp;Fpos );
fread( amp;temp, sizeof(CUENTA), 1, fp );
if( feof(fp) ) break;
if(temp.numero==cuenta){
printf("nttNIP ->");
scanf("%d",amp;nip);
if(temp.nip==nip){
printf("nttSaldo actual-> %f",temp.dinero);
printf("nttDinero a transferir ->");
scanf("%f",amp;trans);
if(temp.dinero-trans>=0){
temp.dinero=temp.dinero-trans;
}else{
printf("nnttCuenta con insuficiente dinero");
getche();
Tranfe(fp);
}
printf("nnttCuenta a transferir ->");
scanf("%d",amp;cuentatr);
rewind(fp);
do{
fgetpos(fp,amp;Fpostr);
fread( amp;temp2, sizeof(CUENTA), 1, fp );
if( feof(fp) ) break;
if(temp2.numero==cuentatr){
temp2.dinero=temp2.dinero trans;
fsetpos(fp,amp;Fpostr);
fwrite( amp;temp2, sizeof(CUENTA), 1, fp );
fsetpos(fp,amp;Fpos);
fwrite( amp;temp, sizeof(CUENTA), 1, fp );
printf("nnttTransferencia con exito");
existetr = TRUE;
return;
}
}while(TRUE);
if(!existetr) {
printf("ttLa cuenta no existe en el archivo");
getche();
Tranfe(fp);
}
}else{
printf("nntNIP equivocado");
getche();
Tranfe(fp);
}
existe = TRUE;
break; // salida del if
}
}while(TRUE);
if(!existe) {
printf("ttLa 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("nnn");
printf("ttOpcion de consulta de saldon");
printf("ttCuenta -> ");
scanf("%d", amp;cuenta);
rewind(fp);
do {
fgetpos( fp, amp;Fpos );
fread( amp;temp, sizeof(CUENTA), 1, fp );
if( feof(fp) ) break;
if(cuenta == temp.numero) {
printf("nttNIP ->");
scanf("%d",amp;nip);
if(nip==temp.nip){
printf("nttSaldo 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("ttLa cuenta no existe en el archivo");
getche();
return;
}
return;
}
Комментарии:
1. Это явно «сбой». Что было сообщением об ошибке? На какой строке происходит сбой?
2. localtime возвращает указатель. Вы не можете осмысленно сохранить указатель на файл. Вам нужно сохранить значение, на которое оно указывает, как
timeinfo = *localtime(amp;rawtime)
. Возможно, было бы проще сохранить и загрузить rawtime и вызвать localtime для этого. Rawtime — это time_t, который предназначен для хранения в двоичных файлах.3. typedef struct{int numero; float dinero; int baja; struct tm * timeinfo; char * movi; }TRANSFE; это структура, в которой я хочу сохранить местное время
4. У вас такая же проблема с movi. Вам нужно изменить это:
typedef struct{ int numero; float dinero; int baja; struct tm timeinfo; char movi[MAXLEN]; }TRANSFE
#define MAXLEN 100 или что-то в этом роде. Затем strncpy в movi перед записью.5. но я не могу этого сделать transfe.movi =»hello»; он не компилируется: S
Ответ №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 ( amp;rawtime );
transfe.timeinfo = *localtime ( amp;rawtime ); // copy into struct tm
strncpy(transfe.movi, "retiro", MAXLEN); // copy into array
fwrite(amp;transfe,sizeof(TRANSFE),1,as);
Для чтения
do {
fflush (as);
fread( amp;temp, sizeof(TRANSFE), 1, as );
if( feof(as) ) break;
if (temp.baja == 0) {
printf("%d %f %s %sn",
temp.numero, temp.dinero, temp.movi,
asctime(amp;temp.timeinfo)); // pass address of struct tm to asctime
fflush (as);
}
} while(TRUE);
Вам, вероятно, также не нужны вызовы fflush.
Еще несколько идей:
Мне неясно, что feof после fread будет надежно определять eof без удаления последней записи. Я рекомендую вам изменить все ваши циклы с
do {
fflush (as);
fread( amp;temp, sizeof(TRANSFE), 1, as );
if( feof(as) ) break;
// do something
} while(TRUE);
Чтобы вместо этого использовать это:
while (TRUE) {
if (fread( amp;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( amp;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 ( amp;rawtime );
test.timeinfo = *localtime ( amp;rawtime ); // copy into struct tm
fwrite( amp;test, sizeof(TRANSFE), 1, ftransferencias );
}
fclose(ftransferencias);
Комментарии:
1. он записывает первую дату в файл binery, но когда я снова вызываю функцию, она ничего не записывает или печатает только первую
2. Мы могли бы помочь вам лучше отлаживать, если бы вы опубликовали весь код, демонстрирующий вашу проблему. Когда вы только изучаете c, в языке и библиотеках есть много ловушек, на которых вы можете зациклиться.