Ir ao conteúdo

Posts recomendados

Postado
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct {
        char letters; // armazena as letras 
        char lettersMorse[6]; // armazena os respectivos simbolos morse das letras
    }alphabet;
    alphabet l[37];
int main()
{
    int i=0;

    FILE *arch;

    arch = fopen("morse.txt", "r");

    if (arch==NULL){
        printf("ERROR");
    }
    else{
        while (!feof(arch)){
            fscanf(arch, "%c %s", &l[i].letters, l[i].lettersMorse);
            printf("%c %s", l[i].letters, l[i].lettersMorse);
            i++;
            // guarda as letras em "l[i].letters e o respectivo simbolo morse me l[i].lettersMorse
        }
    }
    fclose(arch);

  return 0;
}

Oi gente, eu preciso guardar as letras do alfabeto em uma variavel e seu respectivo simbolo morse em outra. Ambos pertencentes  a uma estrutura. A partir de um arquivo.txt, assim:

A .-*

B -...*

C -.-.*

D -..*


Eu não posso modificar o arquivo então tenho de dar um jeito de me livrar do asterisco. Eu tentei fazer um codigo como o de acima, mas não tá dando muito certo... alguem pode me ajudar? Grato!

morse.txt

  • Obrigado 1
Postado

@Luis Vilo    o código do @KXSY  está muito bom ,  e como ele disse , pode se fazer de vários jeitos , e então seu código com algumas modificações poderia ser assim  :

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>
#define H GetStdHandle(STD_OUTPUT_HANDLE)
void textcolor_2(int l, int f){SetConsoleTextAttribute(H,l+(f<<4));}
/* comentários na linguagem  c é com /*  *//* e na linguagem c++ pode ser com // também        */
typedef struct{          /* precisa de uma posição p/ o finalizador de string \0               */
    char letters[5];     /* armazena as letras , pegas como string , mas usa apenas a 1ª letra */
    char lettersMorse[8];/* armazena os respectivos simbolos morse das letras                  */
}alphabet;
alphabet l[37];
int main(){
    int cont=0,j;
    FILE *arch;
    arch = fopen("morse.txt","r");
    if( arch == NULL ){
        printf("ERROR");
        return 0;
    }
    else{   /* guarda as letras em "l[i].letters e o respectivo simbolo morse me l[i].lettersMorse           */
        while(fscanf(arch,"%s%s",l[cont].letters,l[cont].lettersMorse) != EOF){
            l[cont].letters[1] = '\0';                            /* elimina caracteres idesejados           */
            for(j=0; j<strlen(l[cont].lettersMorse); j++){
                if(l[cont].lettersMorse[j] == '*'){               /* se encontrar um Asterísc                */
                   l[cont].lettersMorse[j] = '\0';                /* elimina o Asterísco                     */
                   break;                                         /* sai do loop j, pois já resolveu a parada*/
                }
            }
            textcolor_2(14,0);                                    /* colorir de Amarelo as letras            */
            printf("%s ",l[cont].letters);
            textcolor_2(11,0);                                    /* colorir de Azul anil as letras          */
            printf("%s\n",l[cont].lettersMorse);
            cont++;                                               /* aponta p/ próxima posição do Vetor      */
        }
    }
    fclose(arch);
    printf("\n\n\n");
    textcolor_2(10,12);                                           /* colrir de Verde as letras e o fundo de Vermelho */
    return 0;
}

 

  • Amei 1
  • 2 semanas depois...
Postado
Em 27/12/2019 às 14:19, Luis Vilo disse:

Oi gente, eu preciso guardar as letras do alfabeto em uma variavel e seu respectivo simbolo morse em outra. Ambos pertencentes  a uma estrutura. A partir de um arquivo.txt, assim:

A .-*

B -...*

C -.-.*

D -..*


Eu não posso modificar o arquivo então tenho de dar um jeito de me livrar do asterisco. Eu tentei fazer um codigo como o de acima, mas não tá dando muito certo... alguem pode me ajudar? Grato!

 

Solução é aquilo que resolve. E há muitas maneiras de fazer isso, como por exemplo as sugeridas por @KXSY e @devair1010 logo acima.

 

Mas vou deixar uma sugestão bem anos 80, não tão idosa quanto o código Morse. Esse formato de arquivo  que você tem segue um padrão e deve ter sido pensado sob medida para ler com scanf(), e é isso que vou explicar.

 

Essa função scanf() foi escrita para isso, é o que se chama de parser. E imagino que concorde que isso

	while (1)
	{
		n = fscanf(tabela, mascara, &Valor, Codigo, &Algo);
		if (n != 3) break;
		printf("\t%c\t[%s]\t(%d)\n", Valor, Codigo, strlen(Codigo));
	}

é mais simples que extrair os valores por sua conta. É só uma linha afinal :D e era assim que a gente fazia na época. O printf() mostra a letra e o código Morse equivalente entre [ ] e o tamanho da string Morse para tirar a dúvida.


A máscara

     const char* mascara = "%c%[^*]%c ";


significa 

  • um único caracter, que vai ser a letra ou o digito
  • %[^*] um número qualquer de caracteres EXCETO um asterisco. ^ significa exceto os próximos
  • %c um único caracter que deve ser o asterisco, claro
  • o espaco em branco antes do " final indica que vai consumir tudo que tiver até o fim da linha e
    o próprio "\n" do fim da linha

assim cada chamada a scanf() consome uma linha do arquivo como você precisa, deixando o processo por conta de scanf() que foi escrita para isso: scan formatted data e deixando os valores certinhos em uma letra e uma string por exemplo

 

EXEMPLO

Um programa para ler seu arquivo

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
int main()
{
	const char* mascara = "%c%[^*]%c "; 
	char	Valor; // o caracter lido a cada linha
	char	Algo; // para 'comer' o asterisco no final das linhas
	char	Codigo[80]; // para o valor em Morse
	int     n; // o total de valores lidos por scanf()
	FILE*	tabela;
	char*	arquivo = "morse.txt";
	tabela = fopen(arquivo, "r");
	while (1)
	{	n = fscanf(tabela, mascara, &Valor, Codigo, &Algo);
		printf("\t%c\t'%s'\t(%d)\n", Valor, Codigo, strlen(Codigo));
		if (n != 3) break;
	}	// while
	fclose(tabela);
	return 0;
}	// main()

E mostra isso

        0       [-----] (5)
        1       [.----] (5)
        2       [..---] (5)
        3       [...--] (5)
        4       [....-] (5)
        5       [.....] (5)
        6       [-....] (5)
        7       [--...] (5)
        8       [---..] (5)
        9       [----.] (5)
        A       [.-]    (2)
        B       [-...]  (4)
        C       [-.-.]  (4)
        D       [-..]   (3)
        E       [.]     (1)
        F       [..-.]  (4)
        G       [--.]   (3)
        H       [....]  (4)
        I       [..]    (2)
        J       [.---]  (4)
        K       [-.-]   (3)
        L       [.-..]  (4)
        M       [--]    (2)
        N       [-.]    (2)
        O       [---]   (3)
        P       [.--.]  (4)
        Q       [--.-]  (4)
        R       [.-.]   (3)
        S       [...]   (3)
        T       [-]     (1)
        U       [..-]   (3)
        V       [...-]  (4)
        W       [.--]   (3)
        X       [-..-]  (4)
        Y       [-.--]  (4)
        Z       [--..]  (4)

onde estão a letra o equivalente em código Morse entre colchetes e o tamanho da string lida

 

ARQUIVO DE ENTRADA morse.txt

0-----*
1.----*
2..---*
3...--*
4....-*
5.....*
6-....*
7--...*
8---..*
9----.*
A.-*
B-...*
C-.-.*
D-..*
E.*
F..-.*
G--.*
H....*
I..*
J.---*
K-.-*
L.-..*
M--*
N-.*
O---*
P.--.*
Q--.-*
R.-.*
S...*
T-*
U..-*
V...-*
W.--*
X-..-*
Y-.--*
Z--..*

Espero que ajude. Se der um tempo nos próximos dias escrevo um exemplo mais completo do resto

 

 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...