
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");
}
}
}
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Gentoo binário em 2026: UEFI, LUKS, Btrfs e Systemd
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
O que houve com slackware ??? (12)
Alterar conteúdo de dica [RESOLVIDO] (3)
Vou destruir sua infância:) (5)









