Aninhando uma struct dentro de um union,
como obtive sucesso de imediato,
segui escrevendo o código normalmente.
Mas só um bom tempo depois que percebi
que funcionaria normalmente sem a union,
ainda assim deixei como está.
Na verdade quase tudo já funcionava na cabeça,
mas me deparei com um erro que me deixou
algumas horas para resolver,
Na hora da leitura dos dados a variável
char Bairro [ ], reproduzia a string que
foi armazenado na variável char Rua [ ],
e erro nenhum foi detectado nem pelo compilador,
e nem por mim, mas tem momentos que a lógica
fala mais alto e só assim foi possível resolver.
As funções para interface e para o menu do programa
já estavam prontas, já venho usando isto
há alguns anos, desde quando comecei a programar em C/C++.
Então só precisava criar as duas funções para manipulação
dos dados no arquivo, onde uma colhe os dados do usuário
pelo teclado e escreve num arquivo, e a outra faz a leitura
destes dados através de pesquisa.
Se o programa escreve e ler apenas um cadastro,
isto não é nenhum problema, basta usar um laço while
com um laço for para que outros cadastros possam ser
inseridos e lidos naturalmente por sua entrada
e saída respectivamente.
Veja abaixo o código do programa:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
/*============================================================================*/
union {
struct {
char Procura [ 30 ];
char Nome [ 30 ];
char Rua [ 30 ];
char Rua_1 [ 30 ];
char Bairro [ 30 ];
char Cidade [ 30 ];
int Telefone;
int Numero;
}Cadastro;
}dados;
void MenuPrimcipal ( );
/*============================================================================*/
void Janela ( ) {
int l, c;
for ( l = 1; l <= 30; l++ ) {
for ( c = 1; c < 80; c++ ) {
gotoxy ( c, l );
if ( l == 2 ) {
printf ( " " );
}
if ( c == 1 ) {
printf ( " " );
}
if ( c == 79 ) {
textbackground (
12 );
printf ( " " );
}
}
}
}
/*============================================================================*/
void Janela6 ( ) {
int lin, col;
col = 0;
for ( lin = 2; lin <= 24; lin++ )
for ( col = 3; col <= 78; col++ ) {
gotoxy ( col, lin );
textbackground ( 9 );
printf ( " " );
}
col = 0;
for ( lin = 5; lin <= 21; lin++ )
for ( col = 6; col <= 75; col++ ) {
gotoxy ( col, lin );
textbackground ( 15 );
printf ( " " );
}
}
/*============================================================================*/
void Criar_Cadastro ( ) {
system ( "Color
F0" );
Janela ( );
textbackground ( 15 );
textcolor ( LIGHTRED );
gotoxy ( 28, 3 );
printf ( "CADASTRO DE
PESSOAS FÍSICAS" );
FILE *arquivo = fopen ( "Cadastro.txt", "w" );
if ( arquivo == NULL ) {
textcolor ( LIGHTRED );
gotoxy ( 28, 12 );
printf ( "O arquivo não
pode ser criado" );
getche ( );
exit ( 1 );
}
fflush ( stdin );
textcolor ( LIGHTBLUE );
gotoxy ( 22,5 );
printf ( "Nome: " );
textcolor ( LIGHTRED );
gets ( dados.Cadastro.Nome );
fprintf ( arquivo, "%s\n", dados.Cadastro.Nome );
textcolor ( LIGHTBLUE );
gotoxy ( 22,7 );
printf ( "Telefone:
" );
textcolor ( LIGHTRED );
scanf ( "%d", &dados.Cadastro.Telefone );
fflush ( stdin );
fprintf ( arquivo, "%d\n", dados.Cadastro.Telefone );
textcolor ( LIGHTBLUE );
gotoxy ( 22, 9 );
printf ( "Rua: " );
textcolor ( LIGHTRED );
gets ( dados.Cadastro.Rua );
fflush ( stdin );
fprintf ( arquivo, "%s\n", dados.Cadastro.Rua );
textcolor ( LIGHTBLUE );
gotoxy ( 22, 11 );
printf ( "Número:
" );
textcolor ( LIGHTRED );
scanf ( "%d", &dados.Cadastro.Numero );
fflush ( stdin );
fprintf ( arquivo, "%d\n", dados.Cadastro.Numero );
textcolor ( LIGHTBLUE );
gotoxy ( 22, 13 );
printf ( "Bairro:
" );
textcolor ( LIGHTRED );
gets ( dados.Cadastro.Bairro );
fflush ( stdin );
fprintf ( arquivo, "%s\n", dados.Cadastro.Bairro );
textcolor ( LIGHTBLUE );
gotoxy ( 22, 15 );
printf ( "Cidade:
" );
textcolor ( LIGHTRED );
gets ( dados.Cadastro.Cidade );
fflush ( stdin );
fprintf ( arquivo, "%s\n", dados.Cadastro.Cidade );
textcolor ( LIGHTRED );
gotoxy ( 29, 23 );
printf ( "PRESSIONE
QUALQUER TECLA" );
getche ( );
fclose ( arquivo );
MenuPrimcipal ( );
}
/*============================================================================*/
void Ler_Cadastro ( ) {
system ( "Color
F0" );
Janela ( );
textbackground ( 15 );
textcolor(LIGHTRED);
gotoxy ( 28, 3 );
printf("CADASTRO DE
PESSOAS FÍSICAS");
FILE *arq = fopen ( "Cadastro.txt", "r" );
if ( arq == NULL ) {
textcolor ( LIGHTRED );
gotoxy ( 28, 12 );
printf ( "O arquivo não
pode ser aberto" );
getche ( );
exit ( 1 );
}
fflush ( stdin );
textcolor ( LIGHTBLUE );
gotoxy ( 22, 5 );
printf ( "Nome da
pessoa cadastrada: " );
textcolor ( LIGHTRED );
gets ( dados.Cadastro.Procura );
fflush ( stdin );
textcolor ( BLACK );
gotoxy ( 22, 7 );
printf ( "Dados
cadastrados no arquivo" );
textcolor ( LIGHTBLUE );
if ( strcmp ( dados.Cadastro.Procura, dados.Cadastro.Nome ) == 0 ) {
fscanf ( arq , "%[^\n]s" , dados.Cadastro.Nome, 30 );
gotoxy ( 22, 9 );
textcolor ( LIGHTBLUE );
printf ( "Nome: " );
textcolor ( LIGHTRED );
printf ( "%s", dados.Cadastro.Nome );
fscanf ( arq , "%d" , &dados.Cadastro.Telefone );
textcolor ( LIGHTBLUE );
gotoxy ( 22, 10 );
printf ( "Telefone:
" );
textcolor ( LIGHTRED );
printf ( "%d", dados.Cadastro.Telefone );
fscanf ( arq , "%[^\n]s" , dados.Cadastro.Rua, 30 );
textcolor ( LIGHTBLUE );
gotoxy ( 22, 11 );
printf ( "Rua: " );
textcolor ( LIGHTRED );
printf ( "%s", dados.Cadastro.Rua );
fscanf ( arq , "%d" , &dados.Cadastro.Numero );
textcolor ( LIGHTBLUE );
gotoxy ( 22, 12 );
printf ( "Número:
" );
textcolor ( LIGHTRED );
printf ( "%d", dados.Cadastro.Numero );
fscanf ( arq , "%[^\n]s" , dados.Cadastro.Rua_1, 30 );
fscanf ( arq , "%[^\n]s" , dados.Cadastro.Bairro, 30 );
textcolor ( LIGHTBLUE );
gotoxy ( 22, 13 );
printf ( "Bairro:
" );
textcolor ( LIGHTRED );
printf ( "%s", dados.Cadastro.Bairro );
fscanf ( arq , "%[^\n]s" , dados.Cadastro.Cidade, 30 );
textcolor ( LIGHTBLUE );
gotoxy ( 22, 14 );
printf ( "Cidade:
" );
textcolor ( LIGHTRED );
printf ( "%s", dados.Cadastro.Cidade );
}
textcolor ( LIGHTRED );
gotoxy ( 29, 23 );
printf ( "PRESSIONE
QUALQUER TECLA" );
getche ( );
fclose ( arq );
MenuPrimcipal ( );
}
/*============================================================================*/
#define MaxNo_Menu 3
void MenuPrimcipal ( ) {
system ( "title
CADASTRO DE PESSOAS FÍSICAS" );
system ( "Color
E0" );
Janela6 ( );
textbackground ( 15 );
textcolor ( LIGHTRED );
gotoxy ( 34, 23 );
printf ( "PRESSIONE
ENTER" );
textcolor ( LIGHTRED );
gotoxy ( 28, 3 );
printf ( "CADASTRO DE
PESSOAS FÍSICAS" );
textcolor ( LIGHTRED );
gotoxy ( 28, 6 );
printf ( "Por: Samuel
Lima" );
textcolor ( BLACK );
gotoxy ( 28, 7 );
printf ( "sa_sp10@hotmail.com" );
textcolor ( LIGHTBLUE );
gotoxy ( 28, 9 );
printf ( "Escolha uma
opção no menu" );
textcolor ( BLACK );
char *menu_list [ MaxNo_Menu ] = {
"Criar
cadastro",
"Pesquisar
cadastro",
"Sair" };
int i, xpos = 10, ypos [ MaxNo_Menu ] = { 13, 15, 17 };
for ( i = 0; i < MaxNo_Menu; ++i ) {
gotoxy ( xpos, ypos [ i ] );
//textattr ( 16 );
//textbackground ( 16 );
printf ( "%s", menu_list [ i ] );
}
i = 0;
while ( 1 ) {
gotoxy ( xpos, ypos [ i ] );
textbackground ( 12 );
printf ( "%s", menu_list [ i ] );
switch ( _getch ( ) ) {
case 72:
if ( i > 0 ) {
gotoxy ( xpos, ypos [ i ] );
textbackground ( 15 );
printf ( "%s", menu_list [ i ] );
--i;
}
break;
case 80:
if ( i < MaxNo_Menu - 1 ) {
gotoxy ( xpos, ypos [ i ] );
textbackground ( 15 );
printf ( "%s", menu_list [ i ] );
++i;
}
break;
case 13:
if ( i == 0 ) {
system ( "cls" );
Criar_Cadastro ( );
}
if ( i == 1 ) {
system ( "cls" );
Ler_Cadastro ( );
}
if ( i == 2 ) {
system ( "cls" );
exit ( 0 );
}
break;
}
}
}
/*============================================================================*/
int main ( void ) {
MenuPrimcipal ( );
}
/*============================================================================*/