Ir ao conteúdo
  • Cadastre-se

C++ icone ascii errado no exe


Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

bem, eu estava fazendo um programa onde eu desenho em ascii com caracteres da pagina de codigo 437, e então ele salva as coordenadas e cor de pixel(pixel =  um quadradinho id 219) em um arquivo txt e quando eu vou em outro programa ele pega a cor e coordenada de cada pixel e põe na tela, deixando eu salvar os desenhozinhos cada vez em outro arquivo txt e só mudar o outro codigo para visualizar a nova imagem.

Na verdade é para ser tipo uma 'engine a lenha' de um jogo meu, mas não vem ao caso.

o problema é que na maioria dos desenhos,(não importa se eu mudar tudo do arquivo txt) o visualizador põe um simbolo que nem eu conheço. É  mesmo quadrado, mas em duas cores:

image.thumb.png.aa88aa192412276a98431e4a8a837ead.pngna imagem não mostra, mas o azul tem uma listra de 1 pixel branca.

não sei mais o que eu faço mas um exemplo de arquivo txt:

5
5
15
5
4
15
5
3
15

e o code(não liguem para nomes de variaveis rsrsrs):

#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include<process.h>
#include <string>
void mgotoxy(int x, int y){
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),(COORD){x,y});
}
void trancolor(int c){
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
int main(){
	FILE* arq;
	FILE* arqu;
		HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
    WORD saved_attributes;
    /* Salvar estado atual */
    GetConsoleScreenBufferInfo(hConsole, &consoleInfo);
    saved_attributes = consoleInfo.wAttributes;

arq = fopen("pixs.txt","r+");
arqu = fopen("pixes.txt","r+");
char ajc[4];
fgets(ajc,4,arqu);
int vrau=(atoi(ajc)-1)*3,conta=vrau/3,vrauu=vrau;
int x[conta],y[conta],c[conta];
char pixels[10], pixel[conta][10];
for(vrau>0;vrau--;){
	fgets(pixels,10,arq);
if(vrau%3==2){
x[conta]=atoi(pixels);
printf("x:%i ",x[conta]);
}
if(vrau%3==1){
y[conta]=atoi(pixels);
printf("y:%i ",y[conta]);
}
if(vrau%3==0){
c[conta]=atoi(pixels);
printf("cor:%i ",c[conta]);
conta--;
}
}
vrau=vrauu;
conta=vrauu/3;
printf("\n%i",conta);
for(conta>=0;conta--;){
trancolor(c[conta]);
mgotoxy(x[conta],y[conta]);
printf("%c",219);
}
fclose(arqu);
fclose(arq);
Sleep(10000);
}

 

Link para o comentário
Compartilhar em outros sites

@Daniel Bittencourt Era isso o que deveria acontecer?

image.png.da7c3d1b25b9029fbf62575a72abe0c5.png

Pelo visto, você usou o modo r+ na função fopen(), e para este modo, o arquivo deve existir, o que não é o caso para quem quiser testar seu programa.

 

O que é isso?

50 minutos atrás, Daniel Bittencourt disse:

#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include<process.h>
#include <string>

De todas essas aí, você só precisa de duas, e algumas destas que você incluiu fazem parte da biblioteca padrão do C, não do C++.

Em geral, se sua postagem não fosse em C++, eu diria que você está programando em C, até porque tudo que fez daria pra ser feito em C.

 

50 minutos atrás, Daniel Bittencourt disse:

um programa onde eu desenho em ascii com caracteres da pagina de codigo 437

Tem certeza que a code page da console é a 437? Sabe se a fonte em uso na console tem o caractere que precisa?

Se funciona em sua máquina, beleza, mas pode não funcionar na dos demais, por isso é importante definir tudo o que precisa, e restaurar depois, já que mudanças na configuração da console permanecem depois da execução do programa.

Link para o comentário
Compartilhar em outros sites

eu pus um exemplo de arquivo txt apenas para se alguém pudesse ajudar, ela poderia cria-lo e por o conteúdo

1 hora atrás, Lucca Rodrigues disse:

O que é isso?

De todas essas aí, você só precisa de duas, e algumas destas que você incluiu fazem parte da biblioteca padrão do C, não do C++.

Em geral, se sua postagem não fosse em C++, eu diria que você está programando em C, até porque tudo que fez daria pra ser feito em C.

bem, eu sempre uso essas todas nos programas por que tem todas as coisas que eu uso e não sei todas as funções e suas respectivas bibliotecas de cor ent ajuda muito

 

1 hora atrás, Lucca Rodrigues disse:

Tem certeza que a code page da console é a 437? Sabe se a fonte em uso na console tem o caractere que precisa?

Se funciona em sua máquina, beleza, mas pode não funcionar na dos demais, por isso é importante definir tudo o que precisa, e restaurar depois, já que mudanças na configuração da console permanecem depois da execução do programa.

é a que tem ascii extendida, tenho praticamente certeza que é essa, eu não defini por que na hora de criar por que eu não pretendia compartilhar

ah e o outro arquivo só tem a quantia de pixels, no exemplo, são 3, mas fica registrado 4, então eu subtraio 1

Link para o comentário
Compartilhar em outros sites

@Daniel Bittencourt

29 minutos atrás, Daniel Bittencourt disse:

eu pus um exemplo de arquivo txt apenas para se alguém pudesse ajudar, ela poderia cria-lo e por o conteúdo

Sempre tente facilitar o trabalho de quem quer te ajudar. Você pode anexar os arquivos.

 

29 minutos atrás, Daniel Bittencourt disse:

bem, eu sempre uso essas todas nos programas por que tem todas as coisas que eu uso e não sei todas as funções e suas respectivas bibliotecas de cor ent ajuda muito

É simples: se deu algum erro de declaração implícita ou algo do tipo a respeito de uma função, então você não incluiu a biblioteca necessária, daí basta pesquisar onde tal função é definida, e assim você vai aprendendo.

 

29 minutos atrás, Daniel Bittencourt disse:

é a que tem ascii estendida, tenho praticamente certeza que é essa, eu não defini por que na hora de criar por que eu não pretendia compartilhar

Não significa que você tem 100% de certeza que consegue imprimir todos os caracteres ta tabela ASCII só porque estão lá, depende de um monte de coisas, tais como a fonte em uso na console, a code page da console e a de saída também, etc.

Veja aí, todos os que eu consigo imprimir a partir do caractere 128, e eu defini a code page da console e a de saída para a 437, contudo, por causa da minha fonte em uso, não consigo imprimir todos os caracteres da "ASCII convencional estendida":

image.png.3bda4165f05c365158f1e28e89a59b41.png

Se não pretende compartilhar e está conseguindo imprimir os caracteres que quer, então ok.

 

2 horas atrás, Daniel Bittencourt disse:

eu desenho em ascii com caracteres da pagina de codigo 437

Como sabe que é a 437? Faça o seguinte:

#include <stdio.h>
#include <windows.h>

int main()
{
    int CP = GetConsoleCP();
    printf("Code Page: %d", CP);
    return 0;
}

E descubra!

Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues eu não havia pensado na ideia de anexar os arquivos😕.

Bom, pensando na ideia de colocar os pontos para ajudar a visualização, eu descobri uma coisa: o caractere não era especial, na verdade a penas tinha o fundo e cor definidos, e não somente a cor e fundo transparente.

mas ainda tenho a pergunta: porque nessa parte do programa, está definida uma cor com fundo e tudo, sendo que nem tem dois numeros.

for(conta>-1;conta--;){
trancolor(c[conta]);
mgotoxy(x[conta],y[conta]);
printf(".");
}

os arquivos txt:pixs.txt

pixes.txt

a parte das cores:

void trancolor(int c){
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

 

bom, não acredito em erro na hora de passar o x,y e cor para os vetores, pois sempre que é passado  eu imprimo o que foi passado e não tem nada anormal 

image.thumb.png.6091c27783de0de84e28d2f41955f97e.png

aqui o local onde ele manda imprimir

for(vrau>0;vrau--;){// vrau = numero de linhas (conta-1)*3
	fgets(pixels,10,arq);//pega uma linha
if(vrau%3==2){// ve se eh um x
x[conta]=atoi(pixels);//transforma a string que contem x em um numero do vetor x
printf("x:%i ",x[conta]);// escreve
}
//o mesmo
if(vrau%3==1){
y[conta]=atoi(pixels);
printf("y:%i ",y[conta]);
}
//o mesmo
if(vrau%3==0){
c[conta]=atoi(pixels);
printf("cor:%i ",c[conta]);
conta--;//diminui por que acabu um ciclo e mudará o local onde será armazenado em cada vetor
}
}

 

Link para o comentário
Compartilhar em outros sites

@Daniel Bittencourt

11 minutos atrás, Daniel Bittencourt disse:

for(conta>-1;conta--;){

Conseguiu compilar desta forma?

O loop for tem uma seção para a inicialização de variáveis, outra para a condição e outra para os incrementos. Não há um ; após a seção de incrementos, mas há um antes da condição.

 

Fora isso, é péssimo tentar interpretar o código de alguém quando não há comentários e o nome das variáveis não querem dizer nada...

Link para o comentário
Compartilhar em outros sites

7 minutos atrás, Lucca Rodrigues disse:

Fora isso, é péssimo tentar interpretar o código de alguém quando não há comentários e o nome das variáveis não querem dizer nada...

desculpe..

 

8 minutos atrás, Lucca Rodrigues disse:

@Daniel Bittencourt

29 minutos atrás, Daniel Bittencourt disse:


for(conta>-1;conta--;){

Conseguiu compilar desta forma?

consegui sim...

46 minutos atrás, Lucca Rodrigues disse:

Como sabe que é a 437? Faça o seguinte:


#include <stdio.h>
#include <windows.h>

int main()
{
    int CP = GetConsoleCP();
    printf("Code Page: %d", CP);
    return 0;
}

E descubra!

nossa, eu não havia visto isso! É a 850 kkkkk

Link para o comentário
Compartilhar em outros sites

50 minutos atrás, Daniel Bittencourt disse:

nossa, eu não havia visto isso! É a 850 kkkkk

 

Em geral nesses programas de desenho na console se usa 437 que apareceu nos anos 80. Isso porque tem os caracteres de desenho simples e duplo e os blocos de desenho.


Veja alguns deles ao lado

image.thumb.png.92dcf2cd7240fdf70d484e5f1d216d19.png
Isso foi antes de existir uma interface gráfica e a representação dessas letras ficava no BIOS --- sim, BIOS é masculino --- e não dava pra alterar sem mudar o BIOS. E isso já era um grande avanço porque até pouco tempo antes nem havia minúsculas.

 

Hoje é bem mais complicado. No entanto a página padrão do Windows é 850 e às vezes 1252. Mais recentemente 65001, que é a pagina Unicode. E tudo isso é um inferno. Incompatível e chato e inseguro. E tinha sumido. Só que agora com os computadores na nuvem e muitos sem interface gráfica teve um renascimento desse tipo de programa para console.

 

Eis o que acho que deve ter em mente: não rode seus programas que mudam essas coisas no IDE. Rode no terminal do Windows ou numa console. Se fizer algo errado no IDE pode zoar  seus próximos programas todos, e mesmo ter que reinstalar o próprio IDE.

 

Prefira o Terminal: é muito mais rápido e moderno e tem mais letras. Unicode tem mais de 150.000 delas. E estará aprendendo algo.

 

Use o Mapa de caracteres do Windows 10 para ver o que tem na sua máquina em termos de fonte. Não basta a codepage.

 

Salve antes essas coisas, mude e depois restaure tudo ao final do programa.

 

        SetConsoleOutputCP() é a função que muda a página em efeito na console. Pode precisar mudar a fonte da console se ela não tiver a letra que você quer... E fique feliz porque em outras épocas seria preciso regravar o BIOS :)

 

Sobre o título do tópico:
 

Citação

 icone ascii errado no exe

 

Não é o caso. O ícone é um atributo do programa no Windows. E você pode desenhar como quiser. O que está errado é a representação de alguma letra. E não é um erro: apenas não é o que você quer no momento.


 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

30 minutos atrás, arfneto disse:

Não é o caso. O ícone é um atributo do programa no Windows. E você pode desenhar como quiser. O que está errado é a representação de alguma letra. E não é um erro: apenas não é o que você quer no momento.

quando escrevi achei que era isso mas eu descobri que não depois

 

2 horas atrás, Daniel Bittencourt disse:

Bom, pensando na ideia de colocar os pontos para ajudar a visualização, eu descobri uma coisa: o caractere não era especial, na verdade a penas tinha o fundo e cor definidos, e não somente a cor e fundo transparente.

mas ainda tenho a pergunta: porque nessa parte do programa, está definida uma cor com fundo e tudo, sendo que nem tem dois numeros.

eu disse isso la em cima..

e ainda qero saber...

se souber o que faz ele escrever o fundo branco e o icone ciano... ajudaria muito

image.thumb.png.b4c1dd80d750215716056d041680f482.png

tem a possibilidade de ser outra coisa? tem mas não sei o que seria.

Link para o comentário
Compartilhar em outros sites

@Daniel Bittencourt Não sei se isso te ajuda, mas uma ideia melhor seria colocar as informações em um arquivo binário.

Spoiler

#include <stdlib.h>
#ifdef __linux__
#include <ncurses.h>
#else
#include <stdio.h>
#endif
#include <string.h>

#define T_ID 4
#define N_ARQ "pontos.dat"
#define N_ID "cpx"

/* Cabeçalho do arquivo */
struct arq_cab
{
    char id[T_ID];
    unsigned long q_info;
};

/* Infomações do ponto na tela */
struct info_ponto
{
    unsigned char x,y;
    unsigned short cor;
};



int main(void)
{
    struct arq_cab cabecalho;
    /* Abre o arquivo */
    FILE *arq = fopen(N_ARQ, "rb");
    if (arq == NULL) {
        perror("Arquivo não encontrado!");
        getchar();
        exit(EXIT_FAILURE);
    }

    /* Lê o cabeçalho do arquvo */
    if (fread(&cabecalho, sizeof(cabecalho), 1, arq) != 1) {
        perror("Arquivo corrompido! ");
        getchar();
        exit(EXIT_FAILURE);
    }

    /* Checa se o arquivo é valído */
    if (strcmp(cabecalho.id, N_ID) != 0) {
        perror("Arquivo invalido! ");
        getchar();
        exit(EXIT_FAILURE);
    }

    #ifdef __linux__ 
        initscr();
        clear();
    #endif

    /* Lê a informação do arquivo */
    do {
        struct info_ponto ponto;
        if (fread(&ponto, sizeof(ponto), 1, arq) != 1 && !feof(arq)) {
            perror("Erro na leitura do arquivo! ");
            getchar();
            exit(EXIT_FAILURE);
        }

        #ifdef __linux__
            move(ponto.y, ponto.y);
            printw("O");
            refresh();
        #else
            printf("\nX:%hhu|Y:%hhu", ponto.x, ponto.y);
        #endif
    } while (!feof(arq));
    getchar();

    #ifdef __linux__ 
        endwin();
    #endif
    fclose(arq);
    return(0);
}

 

Testes no site OnlineGDB para um melhor resultado.

 

É depois ler ponto a ponto (igual em um arquivo BitMap).

14 minutos atrás, Daniel Bittencourt disse:

e ainda qero saber...

se souber o que faz ele escrever o fundo branco e o icone ciano...

Se eu me lembro bem no terminal do windows, ele tem duas cores, a cor de frente (cor do caractere) e a cor de fundo (a cor do fundo do terminal).

Para você conseguir uma "transparência" você teria que definir a cor de fundo do caractere para a mesma cor de fundo do terminal.

Ops... o arquivo.

pontos.zip

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

23 minutos atrás, Daniel Bittencourt disse:

porque nessa parte do programa, está definida uma cor com fundo e tudo, sendo que nem tem dois numeros.

 

Que significa?

 

23 minutos atrás, Daniel Bittencourt disse:

e não somente a cor e fundo transparente

 

Na console não tem transparência. Na verdade tem mas é controlada pelo sistema desde o Windows 7. O que tem na console é texto com uma cor de fundo e uma cor do símbolo.

 

Windows não é Unix (Linux)


No Windows você pode sempre saber o que tem na tela. O tal buffer da console que não existe no Unix. Entenda que o Unix escrevia direto na tela de cada terminal. Não havia nada "guardado".  Se desligasse o terminal não saberia o que estava escrito na tela. Não tinha como voltar atrás.

 

No Windows o buffer padrão tem 
 

image.png.eb6db32de1fdd55657f1233401a43dae.png

Isso aí: 9001 linhas de 120 colunas.

 

E você está programando em C então pode ir lá e ler o que tem em cada "célula". é um par: o símbolo e o atributo, e fica tudo em uma estrutura _CONSOLE_SCREEN_BUFFER_INFOEX documentada muito bem aqui: 

https://docs.microsoft.com/pt-br/windows/console/console-screen-buffer-infoex e algumas estruturas associadas. É bem simples.

 

 

typedef struct _CONSOLE_SCREEN_BUFFER_INFOEX {
  ULONG      cbSize;
  COORD      dwSize;
  COORD      dwCursorPosition;
  WORD       wAttributes;
  SMALL_RECT srWindow;
  COORD      dwMaximumWindowSize;
  WORD       wPopupAttributes;
  BOOL       bFullscreenSupported;
  COLORREF   ColorTable[16];
} CONSOLE_SCREEN_BUFFER_INFOEX, *PCONSOLE_SCREEN_BUFFER_INFOEX;

 

23 minutos atrás, Daniel Bittencourt disse:

o fundo branco e o icone ciano

 

Não há ícones nesse contexto. 

 

Poste o código como está agora e eu vejo depois. Mas como eu disse você pode sempre ir lá e ler.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Solução

@Daniel Bittencourt

29 minutos atrás, Daniel Bittencourt disse:

se souber o que faz ele escrever o fundo branco e o icone ciano... ajudaria muito

Talvez deveria usar a função SetConsoleTextAttribute() da seguinte forma:

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), chars | (fundo << 4));
// chars e fundo são 2 variáveis do tipo inteiro

Daí você consegue definir a cor do fundo e a do caractere em questão.

São essas as cores que você tem acesso:

  • preto                  0
  • azul                    1
  • verde                  2
  • ciano                  3
  • vermelho            4
  • magenta             5
  • marrom               6
  • cinza claro          7
  • cinza escuro       8
  • azul claro            9
  • verde claro        10
  • ciano claro        11
  • vermelho claro  12
  • magenta claro   13
  • amarelo             14
  • branco               15
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 18/11/2020 às 20:04, Lucca Rodrigues disse:

Talvez deveria usar a função SetConsoleTextAttribute() da seguinte forma:


SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), chars | (fundo << 4));
// chars e fundo são 2 variáveis do tipo inteiro

AJUDOU MUITO, mt obrigado pela ajuda viu, com alguns ajustes eu resolvi e vi que pelo visto ele escrevia isso pelo seguinte motivo:

eu salvei as coordenadas e cor nas seguintes posições do vetor no exemplo que dei: 3,2,1. mas ele lia o 2,1,0. Então ele pôs uma cor com algum critério pois não tinha valor definido o zero. Se eu não pusesse essa função, nunca veria. Por isso só organizei e funcionou.

obs: demorei um pouco para responder, por que eu ia deixar para o outro dia olhar e esqueci, só lembrei hoje quando entrei no fórum quando pesquisava sobre html e vi as notificações hahah

acho que este código pega em qualquer máquina, vou disponibilizar para se alguém ver no futuro e precise de ajuda

#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include<process.h>
#include <string>
void mgotoxy(int x, int y){
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),(COORD){x,y});
}
void trancolor(int c, int f){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c | (f << 4));
}
int main(){
SetConsoleCP(850); 
	FILE* arq;
	FILE* arqu;
		HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
    WORD saved_attributes;
    /* Salvar estado atual */
    GetConsoleScreenBufferInfo(hConsole, &consoleInfo);
    saved_attributes = consoleInfo.wAttributes;
int f=0;
arq = fopen("pixs.txt","r+");
arqu = fopen("pixes.txt","r+");
char ajc[4];
fgets(ajc,4,arqu);
int vrau=(atoi(ajc)-1)*3,conta=vrau/3,vrauu=vrau;
int x[conta],y[conta],c[conta];
char pixels[10], pixel[conta][10];
for(vrau>0;vrau--;){
	fgets(pixels,10,arq);
if(vrau%3==2){
x[conta]=atoi(pixels);
}
if(vrau%3==1){
y[conta]=atoi(pixels);
}
if(vrau%3==0){
c[conta]=atoi(pixels);
conta--;
}
}
vrau=vrauu;
conta=vrau/3;
for(conta>0;;){
if(conta==0)goto saia;
trancolor(c[conta],f);
mgotoxy(x[conta],y[conta]);
printf("%c",219);
conta--;
}
saia:;
fclose(arqu);
fclose(arq);
Sleep(10000);
}

 

Link para o comentário
Compartilhar em outros sites

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!