Enviado em 05/06/2021 - 23:26h
Prof. Paulo1265, antes muito obrigado pela sua ajuda, preciso de mais uma ajuda. Estou trabalhando com o linux - ubuntu 18.04.10. Quando eu compilo o programa listapostal62.c (gcc listacanastra.c -o listacanastra. exe) , não mostra nenhum erro, mas quando executo ./listacanastra.exe, preenhco o programa e quando escecuto o gedit o arquivo (disco) gargoli.txt ele mostra o arquivo com caracteres invalidso em VERMELHO. (CODIFUTF8) , invalido.#include <stdio.h>
#include <ctype.h> // Para toupper
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio_ext.h> // Para __fpurge
#define MAX 2
# define LISTA_TELA 0
# define LISTA_ARQUIVO 1
// Variavel que indica se a lista foi modificada e nao salva
int nao_salvo = 0;
struct addr {
char name[30];
char street[40];
char city[20];
char state[3];
long zip;
}* addr_info;
// Funcao para leitura de uma string de tamanho n
void LerString(char * txt, int n)
{
// Descarrega o buffer e faz a leitura de string
__fpurge(stdin);
fgets(txt, n, stdin);
// Procura por quebras de linha, espacos ou tab no final da string, removendo-os
n = strlen(txt) - 1;
while (txt[n] == '\n' || txt[n] == '\r' || txt[n] == ' ' || txt[n] == '\t')
txt[n--] = 0;
}
// Funcao para validar uma string como CEP. Retorna o cep ou -1 se invalido
long ValidaCEP(char * cep)
{
int i;
// Para ser um cep, a string deve conter 8 (se nao fornecido o hifen) ou 9 caracteres.
if (strlen(cep) == 9 && cep[5] == '-') {
// CEP com hifen. Vamos remove-lo.
for (i = 5; i < 9; i++) {
cep[i] = cep[i + 1];
}
} else if (strlen(cep) != 8) {
return -1; // CEP invalido
}
// Verifica se todos os caracteres sao numericos
for (i = 0; i < 8; i++) {
if (cep[i] < '0' || cep[i] > '9')
return -1; // Encontrado caracter nao numerico, cep invalido.
}
// Se o programa chegou ate aqui, indica que temos um cep valido. Basta retornarmos o cep convertido para long int
return atol(cep);
}
void CarregaCEP(char * cep_txt, int cep_num)
{
int cep_alto, cep_baixo;
cep_alto = cep_num / 1000;
cep_baixo = cep_num - (cep_alto * 1000);
sprintf(cep_txt, "%05d-%03d", cep_alto, cep_baixo);
}
//Otem a seleção
int menu_select(void)
{
char s[80];
printf("1. Inserir um nome\n\n");
printf("2. Excluir um nome \n\n");
printf("3. Listar o arquivo \n\n");
printf("4. Salvar Registros\n\n");
printf("5. Exportar como Texto\n\n");
printf("6. Sair\n\n");
printf("Digite sua escolha:____");
LerString(s, sizeof(s));
return atoi(s);
}
//Encontra um estrutura não usada
int find_free(void)
{
int t;
for (t = 0; addr_info[t].name[0] && t < MAX; t++);
if (t == MAX)
return -1; //nenyhum elemento livre
return t;
}
//Insere os endereços na lista.
void enter(void)
{
int slot;
char s[80];
slot = find_free();
if (slot == -1) {
printf("Lista cheia\n\n");
return;
}
nao_salvo = 1;
printf("Digite o nome: \n\n");
LerString(addr_info[slot].name, sizeof(addr_info[slot].name));
printf("Digite a rua: \n\n");
LerString(addr_info[slot].street, sizeof(addr_info[slot].street));
printf("Digite a cidade: \n\n");
LerString(addr_info[slot].city, sizeof(addr_info[slot].city));
printf("Digite o Estado: \n\n");
LerString(addr_info[slot].state, sizeof(addr_info[slot].state));
do {
printf("Digite o CEP: \n\n");
LerString(s, sizeof(s));
addr_info[slot].zip = ValidaCEP(s);
if (addr_info[slot].zip < 0) {
printf("CEP invalido!\n");
}
} while (addr_info[slot].zip < 0);
}
int procura(char * nome)
{
int t;
for (t = 0; t < MAX; t++) {
if (!strcmp(nome, addr_info[t].name))
return t;
}
return -1;
}
//Apaga um endereço
void delete() {
int slot;
char s[80];
printf(" Digite o registro #:\n\n");
LerString(s, sizeof(s));
slot = atoi(s);
if (slot >= 0 && slot < MAX) {
addr_info[slot].name[0] = 0;
nao_salvo = 1;
}
}
//Mostra lista na tela
void list(int tipo)
{
int t;
FILE * saida;
char txt[10];
if (tipo == LISTA_TELA) {
saida = stdout;
} else {
saida = fopen("gargoli.txt", "w");
if (saida == NULL) {
printf("Erro abrindo arquivo!\n");
}
}
for (t = 0; t < MAX; ++t) {
if (addr_info[t].name[0]) {
fprintf(saida, "---------------------------------\n");
fprintf(saida, "Registro %d\n", t);
fprintf(saida, "%s \n", addr_info[t].name);
fprintf(saida, "%s \n", addr_info[t].street);
fprintf(saida, "%s \n", addr_info[t].city);
fprintf(saida, "%s \n", addr_info[t].state);
CarregaCEP(txt, addr_info[t].zip);
fprintf(saida, "%s \n", txt);
if (tipo == LISTA_TELA && t && !(t % 5))
sleep(4);
}
}
fprintf(saida, "\n\n");
if (tipo == LISTA_ARQUIVO) {
fclose(saida);
}
}
int salva(void) {
FILE * dadosHd;
dadosHd = fopen("gargoli.txt", "w");
fwrite(addr_info, sizeof(struct addr), MAX, dadosHd);
fclose(dadosHd);
nao_salvo = 0;
return 0;
}
void inicia(void) {
FILE * dadosHd;
addr_info = malloc(sizeof(struct addr) * MAX);
dadosHd = fopen("gargoli.txt", "w");
if (dadosHd != NULL) {
fread(addr_info, sizeof(struct addr), MAX, dadosHd);
printf("%d ------------------<\n", sizeof(struct addr));
printf("nome - %s\n", addr_info[0].name);
fclose(dadosHd);
} else {
memset(addr_info, 0, sizeof(struct addr) * MAX);
printf("Arquivo inexistente\n");
}
}
int main(void)
{
char choice;
inicia();
printf("Legal heim\n\n\n");
for (;;) {
choice = menu_select();
switch (choice) {
case 1:
enter();
break;
case 2:
delete();
break;
case 3:
list(LISTA_TELA);
break;
case 4:
salva();
break;
case 5:
list(LISTA_ARQUIVO);
break;
case 6:
if (nao_salvo) {
printf("Lista nao salva desde a ultima modificacao! Sair mesmo assim? (S/N): ");
if (toupper(getchar()) != 'S') // Nao confirmou, continuar o programa.
break;
}
exit(0);
break;
default:
printf("Opcao invalida!\n");
}
}
}
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
como coloco para instalar com esse erro. (13)
Alguém sabe de documentos de texto e /ou vídeo aulas de certificações ... (1)