Ir ao conteúdo

Posts recomendados

Postado

estou com o seguinte problema o usuário vai fazer uma lista com as frutas depois ele vai fazer outra lista e ele despercebido colocou algumas frutas no segundo arquivo que já tinha no primeiro preciso fazer uma única lista com itens que não se repitam senão ele vai comprar de novo:

pensei em tentar retirar os itens que repetem no segundo e depois tentar juntar sem repetição.

arquivo 1:

uva

melancia

tomate

 

arquivo 2:

uva

pera

tangerina

 

resultado arquivo final:

uva

melancia

tomate

pera

tangerina

 

#include <stdio.h>
#include <stdlib.h>

int main(){
	FILE * arq;
	char outra;
	do{
	arq = fopen("frutas01.txt", "w");
	char fruta[20];
	printf("lista de compras 01\n\n");
	printf("escreve uma fruta\n");
	scanf("%s",fruta);
	fprintf(arq,"%s\n",fruta);
	printf("outra fruta?");
	scanf ("%c",&outra);
	}while(outra=='s');
	fclose(arq);
	
	printf("lista de compras 01\n\n");
	printf("escreve um item\n");
	arq = fopen("frutas02.txt", "w");
	char item[20];
	scanf("%s",item);
	fprintf(arq,"%s\n",item);
	printf("outra item?");
	scanf ("%c",&outra);
	}while(outra=='s');
	fclose(arq);
	
	arq = fopen("frutas01.txt", "r");
	arq = fopen("frutas02.txt", "r");
	if (item!=fruta)
    fprintf(frutas01,item)
    fclose(arq)
}

 

  • Curtir 1
Postado
22 minutos atrás, Jorge Curvelo disse:

pensei em tentar retirar os itens que repetem no segundo e depois tentar juntar sem repetição.

 

Faz sentido, já que tirou os tais "itens que repetem"... 

 

Isso tem um nome e é intersecção de conjuntos A e B.

 

A maneira ortodoxa de criar isso é

  • leia  A e grave em um vetor e ao mesmo tempo no arquivo de saída.
  • abra B e só grave na saída os que não estão no vetor.
  • feche os 3 arquivos
  • game over

 

  • Curtir 1
Postado

@Jorge Curvelo    mexer com arquivos é bem complicado , então melhor inserir e  modificar ,  os dados nas variáveis , no final do programa salvar tudo , e se na hora que abrir novamente quiser editar aqueles dados , então logo no início do programa já pegue tudo que estiver no arquivo e coloque nas variáveis , e depois faça a edição  nas variáveis mesmo .

Postado
2 horas atrás, Jorge Curvelo disse:

mas eu posso digitar os txt  manualmente o que preciso é fazer o tratamento do arquivo final.

... porque interessa apenas o que há de nova fruta na 2ª lista e o parâmetro é a 1ª lista.

 

Dizem-nos que para essa lógica é melhor o uso de vetores/matrizes e os arquivos são fonte, destino de informações e estão livres dos "processos" mais intensamente.

 

Logo, o tratamento final fica acabo de vetores/matrizes. Por quê? Porque é mais conveniente!

 

 

 

  • Curtir 1
Postado
2 horas atrás, Jorge Curvelo disse:

mas eu posso digitar os txt  manualmente o que preciso é fazer o tratamento do arquivo final.

 

apenas faça o que eu disse. É uma simples intersecção

 

image.png.c3ea2bbeeb5c6fd00f9b165bc0e0d03c.png

 

Tem uma dúvida em particular?

 

  • Curtir 1
Postado

Seu curso é de C ou C++?

Foi você que escreveu o programa que postou?

 

 

 

adicionado 1 minuto depois

porque tem que digitar as frutas toda vez? 

Está no enunciado?

 

Não pode usar dois arquivos que é muito mais simples?

 

Que parte não entendeu do que expliquei? Ou que parte entendeu?

 

Sabe escrever um programa que umas linhas de um arquivo e salva em um vetor?

  • Curtir 1
Postado
1 minuto atrás, Jorge Curvelo disse:

nao entendo o que você chama de saida

 

Que tal a lista que vai gerar, a tal intersecção e que imagino que vá gerar um arquivo novo? Ou mostrar na tela, ou os dois? 

 

Isso é a saída...

 

E a entrada? Os dois conjuntos. Que conjuntos? As duas listas.

 

8 minutos atrás, arfneto disse:

Foi você que escreveu o programa que postou?

 

 

9 minutos atrás, arfneto disse:

Sabe escrever um programa que umas linhas de um arquivo e salva em um vetor?

 

 

  • Curtir 1
Postado
do {
		arq = fopen("frutas01.txt", "w");
		char fruta[20];
		printf("lista de compras 01\n\n");
		printf("escreve uma fruta\n");
		scanf("%s", fruta);
		fprintf(arq, "%s\n", fruta);
		printf("outra fruta?");
		scanf("%c", &outra);
	} while (outra == 's');
	fclose(arq);

 

Se você escreveu isso sabe algumas das chamadas ao menos.

 

No entanto está bem ruim. Há uma causa e efeito entre cada comando... e isso quer dizer que tem que fazer sentido a maneira e a ordem em que escreve as instruções.

 

Pense bem: você tem um loop para gravar as tais frutas. Boa idíea mas talvez não precisasse disso se seu enunciado é criar uma lista integrada de ... frutas

 

No entanto você abre o arquivo dentro do loop, de modo que vai gravar no máximo uma fruta....

 

E talvez não seja muito seguro ler um único caracter com scanf() porque o cara pode digitar vários e vai cancelar seu programa....

adicionado 1 minuto depois
7 minutos atrás, Jorge Curvelo disse:

sim foi eu que escrevir acho que consigo armazenar em um vetor depois não sei como fazer

 

mas eu te disse o que fazer

 

image.png.f2d2a734ccc93e57337617a68804c6fd.png

 

Abre o outro arquivo e só grava na saída o que não estiver no vetor...

adicionado 3 minutos depois

Acho que já perguntei isso: você tem mesmo um enunciado que te obriga a ler da tela essas duas listas?

 

Não basta ler dois arquivos e gerar um terceiro, que é muito mais fácil?

 

  • Curtir 1
Postado

ta obrigado pelas dicas mas ..abra b e só grave na saída os que não estão ? como vai saber se estão ou não? digamos que o cara já está no a e no b repetindo eu quero fazer uma "comparação" e uma "remocao" ou uma "fusão" com "remocao"

  • Curtir 1
Postado

Recapitulando
 

  • leia  A e grave em um vetor e ao mesmo tempo no arquivo de saída.
  • abra B e só grave na saída os que não estão no vetor.
  • feche os 3 arquivos
  • game over

Que tal um vetor:

int		lista_original[31]; // um numero bom de frutas

Pra ficar mais fácil de contar: na posição 0 está o total de frutas. Da posição 1 em diante a primeira, a segunda, as frutas afinal

 

Aí você lê "frutas1.txt" e coloca em ... lista_original. Ao mesmo tempo abre "todasfrutas.txt" e vai gravando lá as tais frutas. Faz sentido hein? E na posição [0] estará o total de frutas já que você claro vai somando ao ler.  Fim do item 1. 

 

Ai você abre o outro arquivo de frutas, "frutas2.txt". Para cada fruta que você lê você vai no vetor e procura a tal fruta. Se não tem lá você grava na saída.

 

E é só isso. Fecha os arquivos e termina.

 

 

adicionado 21 minutos depois

const char* frutas1[3] =
{
	"uva",
	"melancia",
	"tomate"
};

const char* frutas2[6] =
{
	"uva",
	"pera",
	"tomate"
	"tangerina",
	"melancia",
	"laranja"
};

Note que algo simples como acima permitiria testar seu programa em minutos... Control-C Control-V direto do enunciado...

  • Curtir 2
Postado

@Jorge Curvelo       você postou no tópico de c++ , mas esse código é todo da linguagem c , e existe vários modos de fazer e um exemplo dele poderia ser assim  :

#include <stdio.h>
#include <conio.h>
#include <limits.h>
#include <memory.h>
#include <string.h>
#include <locale.h>  
#include <ctype.h>
#include <windows.h>
#include <stdlib.h>
#define H GetStdHandle(STD_OUTPUT_HANDLE)
void textcolor_2(int l,int f){SetConsoleTextAttribute(H,l+(f<<4));}
int main(){
    FILE *arq_1, *arq_2, *arq_3;
    arq_1 = fopen("frutas01.txt","a+");// abre para ler e gravar no final e preserva o que já tiver
    if(arq_1 == NULL )                 // se arquivo ainda não foi criado
    arq_1 = fopen("frutas01.txt","w"); // cria e abre arquivo para gravação
    char fruta[20];
    textcolor_2(15,12);                // cor das letras branco e fundo vermelho claro
    printf("  lista de compras 01  \n");
    textcolor_2(15,0);                 // cor das letras branco e fundo preto
    do{
        printf("\nescreve uma fruta ->> ");
        scanf("%s",fruta);
        fprintf(arq_1,"%s\n",fruta);   // grava o dado no arquivo
        printf("outra fruta S/N  ");
    }while( toupper((char)getch()) == 'S' );
    fclose(arq_1);                     // fecha para validar a gravação
    textcolor_2(15,12);                // cor das letras branco e fundo vermelho claro
    printf("\n\n  lista de compras 02  \n");
    textcolor_2(15,0);                 // cor das letras branco e fundo preto
    arq_2 = fopen("frutas02.txt","a+");// abre para ler e gravar no final e preserva o que já tiver
    if(arq_2 == NULL )                 // se arquivo ainda não foi criado
    arq_2 = fopen("frutas02.txt","w"); // cria e abre e deleta tudo no arquivo para gravação desde o início
    do{
        printf("\nescreve um item ->> ");
        char item[20];
        scanf("%s",item);
        fprintf(arq_2,"%s\n",item);    // grava hum dado no arquivo
        printf("outra item S/N  ");
    }while( toupper((char)getch()) == 'S');
    printf("\n\n");
    fclose(arq_2);                     // fechar para validar a gravação
    arq_1 = fopen("frutas01.txt","r"); // abre arquivo para somente leitura
    arq_2 = fopen("frutas02.txt","r"); // abre arquivo para somente leitura
    arq_3 = fopen("back_up.txt","w");  // cria e abre e deleta tudo no arquivo para gravação no início do arquivo
    fclose(arq_3);                     // fecha para validar a gravação do arquivo
    char frutis[30],frutos[30];        // srings para ler no arquivo
    int flag;                          // serve como variável lógica true / false
    textcolor_2(15,12);
    printf("  Os nao repetidos :  \n");
    textcolor_2(10,0);                 // cor das letras verde claro e fundo preto
    while( fscanf(arq_1,"%s",frutis) != EOF ){     // lê em hum arquivo enquanto não encontra o final dele
        flag = 0;                                  // marca como falso
        arq_3 = fopen("back_up.txt","a+");         // abre o arquivo para ler e escrever no final dele
        while( fscanf(arq_3,"%s",frutos) != EOF){  // lê hum dados no arquivo até encontrar o final dele
            if(strcmp(frutis,frutos) == 0){        // testa se tem igual nos dois arquivos
                flag = 1;                          // se tiver , marca como verdadeiro pois encontrou iguais
                break;                             // sai desse while , pois já encotrou hum iguaL
            }
        }
        if( ! flag ){                              // se não tem tiver nenhum iguaL
            printf("%s  \n",frutis);               // escreve ele na tela
            fprintf(arq_3,"%s\n",frutis);          // grava ele no arquivo de back_up
        }
        fclose(arq_3);                             // fechar para validar a gravação
    }
    while( fscanf(arq_2,"%s",frutis) != EOF ){     // lê em hum outro arquivo até encotrar seu final
        flag = 0;                                  // marca como falso
        arq_3 = fopen("back_up.txt","a+");         // abre o arquivo para ler e gravar no final dele
        while( fscanf(arq_3,"%s",frutos) != EOF){  // lê um dado no arquivo até encotrar o final do arquivo
            if(strcmp(frutis,frutos) == 0){        // testa se tem igual nos dois arquivos
                flag = 1;                          // se tiver , marca como verdadeiro
                break;                             // sai desse while , pois já encotrou hum iguaL
            }
        }
        if( ! flag ){                              // se não tem nenhum iguaL
            printf("%s  \n",frutis);               // escreve ele na tela
            fprintf(arq_3,"%s\n",frutis);          // coloca no arquivo de back_up
        }
        fclose(arq_3);                             // fecha na mesma ordem em que foram abertos
    }
    fclose(arq_2);                                 // fecha na mesma ordem em que foram abertos
    fclose(arq_1);                                 // fecha na mesma ordem em que foram abertos
    remove("frutas01.txt");                        // deleta esse arquivo
    rename("back_up.txt","frutas01.txt");          // modifica o nome desse arquivo para esse nome
    textcolor_2(15,9);                             // cor das letras branca e fundo azul claro
    printf("\n  Os Dados Dos Dois Arqivos Foram Fundidos e  \nArmazenados No Arquivo frutas01.txt . . . !   \n\n\n");
    textcolor_2(10,12);                            // cor das letras verde claro e fundo vermelho claro
    return 0;
}

 

  • Curtir 1
  • Obrigado 1
Postado

@devair1010 @Jorge Curvelo parece um pouco complicado com todos esses loops. Acho que sete deles.

 

Se considerar que isso que escrevi possa estar certo

image.png.cfbdd4421f5a6047824276e95c735992.png

 

seriam apenas 2 loops e um outro com um if para separar as frutas duplicadas.

 

E de fato, um programa de teste com os  arquivos do enunciado mostra

Lista de Frutas

  * Da primeira lista:
 1: 'uva'
 2: 'melancia'
 3: 'tomate'

  * Da segunda lista:
    'uva' [Duplicada]
 4: 'pera'
    'tomate' [Duplicada]
 5: 'tangerina'
    'melancia' [Duplicada]
 6: 'laranja'

Na tela estão as frutas da primeira lista e as frutas da segunda lista. E está marcado quando foi descartada uma fruta duplicada. E tem o número de frutas que deve estar no arquivo de saída. Esse é um pouco mais que o mínimo necessário para atender ao enunciado, se li corretamente

 

O arquivo gerado, sem surpresas

uva
melancia
tomate
pera
tangerina
laranja

E o programa de teste

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main()
{
	char    lista_original[40][20];
	FILE*   lista;
	FILE*   nova_lista;
	int     continua = 0;
	int     qtd = 0;
	char    fruta[20];

	printf("Lista de Frutas\n\n  * Da primeira lista:\n");
	lista = fopen("frutas1.txt", "r");
	nova_lista = fopen("frutas3.txt", "w");
	do
	{	qtd = qtd + 1;
		fscanf(lista, "%s", fruta);
		printf("%2d: '%s'\n", qtd, fruta);
		strcpy(&lista_original[qtd][0], fruta);
		fprintf(nova_lista,"%s\n", fruta);
	} while (!feof(lista));
	fclose(lista);

	printf("\n  * Da segunda lista:\n");
	lista = fopen("frutas2.txt", "r");
	do
	{	fscanf(lista, "%s", fruta);
		int duplicada = 0;
		for (int i = 0; i < qtd; i = i + 1)
		{	if (strcmp(fruta, &lista_original[i][0]) == 0)
			{
				duplicada = 1;
				printf("    '%s' [Duplicada]\n", fruta);
				break;
			}
		};	// for()
		if (duplicada) continue;
		qtd = qtd + 1;
		printf("%2d: '%s'\n", qtd, fruta);
		strcpy(&lista_original[qtd][0], fruta);
		fprintf(nova_lista, "%s\n", fruta);
	} while (!feof(lista));
	fclose(lista);
	fclose(nova_lista);
	return 0;
};

// fim

E sem surpresas:

  • Dois loops
  • O segundo loop tem um loop interno e um if para eliminar os duplicados
     

Um pouco off-topic (palpites :)), sobre o programa de exemplo, @devair1010 no tópico #15

 

#define H GetStdHandle(STD_OUTPUT_HANDLE)
void textcolor_2(int l,int f){SetConsoleTextAttribute(H,l+(f<<4));}

Esse #define de algo de uma única letra pode acabar coincidindo com alguma variável H que um dia você use no programa. Só que isso é usado uma única vez, no código de textcolor_2() que só tem uma linha :) ou mude para algo como _H_ que é praxe nesses casos

 

Mas sugiro escrever o simples

void textcolor_2(int l,int f){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),l+(f<<4));}

E esquecer o #define H

 

E sobe essas linhas

 

image.png.b2f9bdc7ce5989e8c3871627e58e3126.png

 

talvez fosse o caso de considerar ao invés do #define H algo assim

#define		_preto_            0
#define		_azul_             1
#define		_verde_            2
#define		_ciano_            3
#define		_vermelho_         4
#define		_magenta_          5
#define		_marron_           6
#define		_cinza_claro_      7
#define		_cinza_escuro_     8
#define		_azul_claro_       9
#define		_verde_claro_     10
#define		_ciano_claro_     11
#define		_vermelho_claro_  12
#define		_magenta_claro_   13
#define		_amarelo_         14
#define		_branco_          15

E aí poderia escrever o simples

    textcolor_2(_branco_, _vermelho_claro_);
    printf("  lista de compras 01  \n");
    textcolor_2(_branco_,_preto_);

E poderia usar as cores pelo nome.

 

Deixei um '_' antes e depois da cor para evitar bater de frente com alguma variável de algum programa. É prática comum em C e outras linguagens que não tem namespaces ou algo parecido.

 

adicionado 34 minutos depois

image.png.da6f82ab0ebdb5d8d3454e1a972ec5e1.png

 

@devair1010 Acho que já falamos sobre isso umas vezes aqui, e ao rodar seu exemplo aconteceu de novo então vou comentar outra vez:

 

Quando um programa muda algo na configuração do sistema é preciso --- ou pelo menos considerado educado --- restaurar tudo na saída. É comum um programa de console --- na medida em que eles ainda existam assim --- mudar fontes ou recursos como tamanho da janela o.

 

  • Muitas vezes você precisa de caracteres que não tem em todas as fontes, para desenhar por exemplo. E aí muda a fonte
  • Em outros casos precisa mudar a página de código para usar acentos especiais
  • Às Vezes só muda as cores para destacar algo ou fazer uma graça
  • Pode ser que precise apagar aquelas barras de rolagem que ficam nas janelas de prompt de comando para um jogo ou uma tela mais limpa
  • A console do Windows tem 9001 :) linhas. Sim, 9001 --- o linux não tem console nem o MacOS --- e muitas vezes é preciso mudar isso para não rolar a tela ao escrever na última linha ou na última coluna

 

Mas ao final veja que meu terminal rodando seu programa ficou escrevendo em amarelo sobre vermelho...

 

Claro, é só fechar o terminal e abrir outro, mas é chato. Como eu disse, rodar um programa não deve mexer na máquina em definitivo a menos que esse seja o objetivo do programa. Eu rodei um programa de teste para combinar dois arquivos e acabei com uma tela vermelha...

 

Pra não dizer que não deixei um 

 

Exemplo


_cs_status*    guarda(_cs_status* antes)
{
	antes->cp_original = GetConsoleCP();
	antes->ocp_original = GetConsoleOutputCP();
	strcpy(antes->local_original, setlocale(LC_ALL, NULL));
	HANDLE  h = GetStdHandle(STD_OUTPUT_HANDLE);
	char buffer[80];
	char* pBuffer = buffer;
	int res = 0;
	res = GetCurrentConsoleFont(h, 0, &(antes->font_info));
	// pois e: mas qual a fonte? Tem que ver na tabela
	// precisa da versao ex da rotina e eu nao sabia
	antes->font_infoEx.cbSize = sizeof(CONSOLE_FONT_INFOEX);
	res = GetCurrentConsoleFontEx(h, 0, &(antes->font_infoEx));
	// A fonte em uso fica aqui no registro
	//    Computador\HKEY_LOCAL_MACHINE\SOFTWARE\
    //    Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont
	//
	GetConsoleMode(h, &antes->mode_original);
	// agora falta SCREEN BUFFER
	antes->infoEx.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
	GetConsoleScreenBufferInfoEx(h, &antes->infoEx);
	return antes;
};  // guarda()

Essa função acima é de meu uso e salva essas configurações e muitas outras. Talvez possa usar algo assim. No caso do que falamos aqui acho que basta o GetConsoleMode()

 

Esse exemplo tem uma função irmã

void    restaura(_cs_status* antes)
{
	// restaura locale e paginas de codigo
	SetConsoleCP(antes->cp_original);
	SetConsoleOutputCP(antes->ocp_original);
	setlocale(LC_ALL, antes->local_original);
	// restaura a fonte
	HANDLE ho = GetStdHandle(STD_OUTPUT_HANDLE);
	int res = SetCurrentConsoleFontEx(ho, 0, &antes->font_infoEx);
	if (res == 0)
		printf("SetCurrentConsoleFontEx() falhou: %d\n", GetLastError());
	// console mode
	SetConsoleMode(ho, antes->mode_original);
	// cor e fundo
	SetConsoleTextAttribute(ho, antes->infoEx.wAttributes);
};  // restaura();

E você pode ver como é simples salvar e restaurar. 

 

Citação

Claro que se fossem apenas as cores bastariam acho que DUAS linhas. @devair1010 Ia te mandar uma mensagem mas seu perfil não recebe mensagens. Espero que compreenda como uma recomendação de boas práticas e não uma crítica. 

 

  • Curtir 2
Postado

@arfneto     obrigado pelas dicas , ainda não terminei o curso de lógica de programação e por isso não entendo sobre o funcionamento dos compiladores programas e computador  ,  e nunca percebi que essa função de textcolor causava essas coisas que você falou , nos compiladores que costumo usar nunca aconteceu isso não , então vou ver se melhoro isso aí ,  e o @Jorge Curvelo  me parece que é iniciante , e ele esteja querendo aprender sobre a criação e manipulação de arquivos  , e creio que ele também não tem conhecimento sobre esses vetores e structs e classes , ect . . . , aí postei esse exemplo com o que ele está tentando fazer , assim poderá observar e na próxima já terá uma base .

  • Curtir 2
Postado
2 horas atrás, devair1010 disse:

essa função de textcolor causava essas coisas que você falou

 

não é bem "que ela causa" coisas. É o objetivo dela: configurar a cor do texto e a cor de fundo.

 

São as coisas que você programou. E não "desprogramou". Vai ficar assim

 

Ao encerrar o programa ele não sabe voltar atrás e deixar as cores como antes. O que acontece é que você provavelmente nunca testa seus programas fora do IDE e assim a cada vez que vai rodar compila o programa de novo e roda só no IDE. E ao rodar "dentro" do IDE abre um terminal a cada vez e assim não vai saber que o anterior ficou zoado.

 

Ele é fechado assim que o programa encerra. Por isso muitos usam a folclórica função getch() no final do programa ou aquele ingênuo system("pause");

 

A lógica é a que te mostrei nas duas funções de exemplo: ao entrar no programa e antes de mudar qualquer coisa você chama 

  BOOL WINAPI GetConsoleScreenBufferInfoEx(
  _In_  HANDLE                        hConsoleOutput,
  _Out_ PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
);

E antes de encerrar você chama e restaura como estava antes

 

BOOL WINAPI SetConsoleScreenBufferInfoEx(
  _In_ HANDLE                        hConsoleOutput,
  _In_ PCONSOLE_SCREEN_BUFFER_INFOEX lpConsoleScreenBufferInfoEx
);

 

Veja essa função de exemplo e vai entender como funciona:

 

Essa função escreve uma mensagem na tela em video reverso como dá para imaginar. Só que ela SEMPRE funciona. Ela reverte as cores em uso no momento e depois restaura. Então pode ver o mecanismo que te expliquei e rodar em sua máquina, chamando essa função.

 

Se você estiver usando cyan sobre azul ela vai escrever em azul sobre cyan e depois deixa tudo igual.

mensagem_em_video_reverso("mensagem de teste");

 

Eis o código

 

void    mensagem_em_video_reverso(char* mensagem)
{
    HANDLE    H = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO        info;
    GetConsoleScreenBufferInfo(H, &info);
    WORD foreground = info.wAttributes & 0xF;
    WORD background = info.wAttributes & 0xF0;
    printf("\n");
    text_color(background, foreground);
    printf("%s\n", mensagem);
    text_color(foreground, background);
    return;
}

    // mensagem_em_video_reverso()

  • Curtir 1
Postado
5 horas atrás, devair1010 disse:

usar nunca aconteceu isso não

 

Vamos deixar isso claro: sempre aconteceu. Nada tem a ver com o compilador.

adicionado 1 minuto depois
5 horas atrás, devair1010 disse:

aí postei esse exemplo com o que ele está tentando fazer , assim poderá observar e na próxima já terá uma base

 

MAs entendeu que poderia ser bem mais simples, em especial para um iniciante, certo? leu o exemplo que mostrei?

  • Curtir 1
Postado

@arfneto    obrigado pela funções que você postou , e vou usa-las , mas por que você foi testar o código no terminal ?  ,  não seria melhor testar no próprio compilador não ?  ,  e eu nunca tinha pensado em usar esse console do DOS  ,  pra nada , mas como você falou , fui testar para ver no que dava e olha só ,  realmente depois da saída continua com as últimas cores mesmo , mas foi apenas um pequeno trecho de uma linha ,

1437944687_terminaldoDOS.thumb.jpg.2a1b299a1ae56594ce597387f43d90f3.jpg

  talvez  seja por que estou usando o windows 10 pro , e em outro sistemas a coisa seja diferente ,   e seu código sobre os arquivos está com estilo profissional , com poucas linhas e uma boa organização , gostei , mas quem é iniciante ainda não sabe o que é variáveis vetores array matriz struct arquivo ,  e com isso um código mais simples ajuda a pegar o jeito , e depois que já tiver experiência aí faz os mais sofisticados , 

Postado
20 minutos atrás, devair1010 disse:

mas por que você foi testar o código no terminal ?  ,  não seria melhor testar no próprio compilador não ?

 

Então... é justamente o contrário. Não compilo o programa a cada vez que vou rodar. tem lá a tela, e la rodo os programas que eu tenha para testar. 

 

Entenda que um programa não é feito para ser compilado a vida toda: depois que ele fica "pronto" nunca mais é compilado. Ele vai para outras máquinas e outras pessoas e passa a ser algo útil.

 

Então uma parte essencial desse "teste" é rodar o programa no console, ou no Terminal do Windows Pro já que usa. Como já te disse o terminal é muito mais rápido e compatível com o Linux e o Max em muitas coisas. E roda Unicode então tem menos chance de problemas com caracteres não representáveis. Ou nenhum.

 

Um programa como esse sempre seria usado assim, se se chamasse "frutas" por exemplo:

    frutas lista1.txt lista2.txt lista3.txt

Os nomes dos arquivos são sempre passados como parâmetro. Como em todos os comandos que usa, como CD ou DIR ou MKDIR ou DEL.

 

Imagine se faz sentido compilar o programa de novo para trocar o nome dos arquivos sendo que o programa é exatamente o mesmo.

 

23 minutos atrás, devair1010 disse:

talvez  seja por que estou usando o windowx 10 pro , e em outro sistemas a coisa seja diferente ,   e seu código sobre os arquivos está com estilo profissional , com poucas linhas e uma boa organização , gostei , mas quem é iniciante ainda não sabe o que é variáveis vetores array matriz struct arquivo ,  e com isso um código mais simples

 

Essa parte eu não entendi: o programa que te mostrei é muito mais simples que o exemplo que postou com sete loops e tal.

O que eu te mostrei é o simples.  Por isso escrevi. Não tem nem 50 linhas e segue exatamente o planejado no início

 

image.png.3b9a656fbf452478cc4b9329f18f6d00.png

 

O exemplo que mostrou tem quase 100, usa 10 includes, usa coisas crípticas para um iniciante como #define de funções, mudanças de cor que  não estavam previstas, e como eu disse sete loops.

 

A versão de windows não faz diferença. Há décadas SetConsoleScreenBufferInfoEx() define os atributos da console e se você usa isso é educado antes de mudar chamar   GetConsoleScreenBufferInfo();  e salvar a cor e o fundo em uso e restaurar ao final do programa, porque as pessoas não gostam de ter isso alterado só porque rodou um programa que escrevia em outras cores

 

34 minutos atrás, devair1010 disse:

mas foi apenas um pequeno trecho de uma linha


 

Não. A cor é alterada quando chama a função. Desde os anos 90. Ela serve para isso.

 

36 minutos atrás, devair1010 disse:

e seu código sobre os arquivos está com estilo profissional , com poucas linhas e uma boa organização

 

É um programa didático, só para mostrar que dá pra seguir a lógica programada e ver a lógica refletida no arquivo. Só um exemplo. Deve parecer profissional porque sou profissional, mas um programa profissional jamais teria os nomes dos arquivos como literais dentro do programa

 

37 minutos atrás, devair1010 disse:

funções que você postou , e vou usa-las

 

Entenda o que as funções que te mostrei fazem: elas são derivadas de programas de décadas atrás, mas o objetivo é importante: salvar a configuração do terminal para restaurar igualzinho na saída.

Em especial repare na função que mostra a mensagem em vídeo reservo, que é mais simples: Ela não muda a cor da tela, apenas inverte o valor em uso duas vezes. E lá tem as chamadas de função mais simples, as que atuam sobre a cor e o fundo apenas.

 

Vou editar o programa que postei e incluir os parâmetros e vou postar aqui para você entender a diferença

 

Abraço

 

adicionado 28 minutos depois

image.png.e31dfbfa7290a08a1e784180cf23f797.png

 

Em geral se escreve assim, pela simples razão que faz a gente escrever programas afinal: executar ações repetitivas.

 

Então você tem o programa "Une.exe" e ele junta duas listas em uma terceira., eliminando as duplicidades. E você não vai querer compilar o programa para cada vez que tem um novo arquivo certo?

 

E se mandar seu programa para alguém não vai mandar o une.c com instruções de compilação, certo?

 

 

 

Pode abrir o NotePad assim na linha de comando assim. No seu Windows Pro. Digitando o programa e o nome do arquivo, um parâmentro: Notepad fruta3.txt

 

image.thumb.png.1d02bb6af141c51b2a3dac5426da6a05.png

 

O programa não mudou nada: continua sendo só um exemplo e sem tratar as condições de erro e tal. Mas acho que dá pra entender a diferença. Há uma razão para todo programa ler parâmetros, em qualquer linguagem.

 

O programa de teste

#define _CRT_SECURE_NO_WARNINGS

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

void Use();

int main(int argc, char** argv)
{
	char    lista_original[40][20];
	FILE* lista;
	FILE* nova_lista;
	int     continua = 0;
	int     qtd = 0;
	char    fruta[20];

	if (argc < 4) Use();

	printf("Lista de Frutas\n\n  * Da primeira lista:\n");
	lista = fopen(argv[1], "r");
	nova_lista = fopen(argv[3], "w");
	do
	{
		qtd = qtd + 1;
		fscanf(lista, "%s", fruta);
		printf("%2d: '%s'\n", qtd, fruta);
		strcpy(&lista_original[qtd][0], fruta);
		fprintf(nova_lista, "%s\n", fruta);
	} while (!feof(lista));
	fclose(lista);

	printf("\n  * Da segunda lista:\n");
	lista = fopen(argv[2], "r");
	do
	{
		fscanf(lista, "%s", fruta);
		int duplicada = 0;
		for (int i = 0; i < qtd; i = i + 1)
		{
			if (strcmp(fruta, &lista_original[i][0]) == 0)
			{
				duplicada = 1;
				printf("    '%s' [Duplicada]\n", fruta);
				break;
			}
		};	// for()
		if (duplicada) continue;
		qtd = qtd + 1;
		printf("%2d: '%s'\n", qtd, fruta);
		strcpy(&lista_original[qtd][0], fruta);
		fprintf(nova_lista, "%s\n", fruta);
	} while (!feof(lista));
	fclose(lista);
	fclose(nova_lista);

	return 0;
};

void Use()
{
	printf("\n\narfneto [2020]\n\nUse \"une lista1 lista2 lista3\"\n\n");
	printf("    para unir 'lista1'e 'lista2'");
	printf(" em 'lista3' sem duplicidade\n");
	exit(1);
};
// fim

 

  • Curtir 2

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!