Uma pergunta iniciante sobre C

1. Uma pergunta iniciante sobre C

Wiloud
wiloud

(usa Outra)

Enviado em 12/05/2019 - 21:08h

Uma.pergunta pra galera que manja de C/C++, a questão é o seguinte, eu tava pesquisando como mover um arquivo de uma pasta para o desktop, fui pesquisar na internet e o pessoal dizendo pra usar system();, ué, isso não é batch? (outras coisas como pausar, fechar o programa me falaram pra usar system()), então pra que aprender C que n consegue fazer coisas que batch faz, tenho certeza absoluta que C é muitissimo poderoso que Batch, e certeza que tem como fazer um script que mova um arquivo pra o desktop, aí que entra a pergunta, como fazer isso? tenho que criar meus proprios comandos ? funções, matrizes ou vetores pra fazer esse script? (so to chutando, realmente n sei nem por onde começar a fazer esse script)


  


2. Re: Uma pergunta iniciante sobre C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/05/2019 - 03:10h

C e C++ são linguagens pensadas para computadores genéricos. Essas linguagens exigem do computador apenas as seguintes características:

  • conseguir armazenar e recuperar valores na memória;
  • poder representar dados de certos tipos determinados, a saber: números inteiros (dos quais caracteres são casos particulares), números de ponto flutuante, e um tipo que possa ser usado para endereçar a memória;
  • ser capaz de executar certo conjunto finito de operações aritméticas e lógicas;
  • permitir desvios do fluxo de execução do programa, que podem ser incondicionais (goto, break, continue), condicionais (if/else, while, do-while, swicth) e invocação de funções.

As linguagens nem ao menos exigem que essas operações sejam mapeadas de forma direta para operações nativas de algum tipo de máquina. Um PC cujo processador tem como mapear nativamente todas as características acima é tão válido como alvo quanto uma pessoa que usa cadernos como memória e como form de acompanhar o estado atual de execução do programa, e lápis para alterar os valores dessa memória e estado durante execução.

Um passo além da linguagem pura e simples, os padrões do C e do C++ definem o comportamento de programas que executem sob uma implementação “hospedada” por algo parecido com um sistema operacional. As operações requeridas do ambiente hospedado não estão em nível de linguagem, mas são realizadas por meio de tipos de dados e funções com nomes padronizados, que são parte da biblioteca padrão associada à linguagem. Nessas implementações, a lista de exigências cresce um pouco, incluindo o seguinte:

  • receber do ambiente hospedeiro informações que possam modificar o comportamento da execução do programa, bem como devolver um código que possa indicar o grau de sucesso da execução do programa (através da função main(), mas também exit(), abort() e outras);
  • poder alocar e desalocar dinamicamente quantidades de memória que só serão conhecidas no momento da execução do programa (malloc(), realloc(), free() e funções relacionadas, ou containers do C++);
  • manipular strings de caracteres, usando uma representação de strings que também é definida pelo padrão (todas as funções em <string.h>, ou <string> do C++);
  • executar operações matemáticas além daquelas implementadas em nível de linguagem, tais cálculo de valor absoluto, funções exponenciais, logarítmicas, trigonométricas e transcendentais etc. (em <stdlib.h> e <math.h>);
  • realizar entrada e saída de dados, inclusive a partir de meios de armazenamento que possam manter tais dados por tempo maior do que a duração do programa (em <stdio.h>, ou <iostream>, <fstream> e relacionados em C++);
  • implementar meios de invocar o ambiente de execução hospedeiro, para que ele possa ser capaz de executar operações arbitrárias (e.g. system());
  • representar e manipular dados de data e hora (em <time.h>,);
  • permitir a manipulação de argumentos individuais em funções com número variável de argumentos (em <stdarg.h>).

Apesar da lista de maior tamanho, o computador alvo dessa especificação continua bastante genérico. Por exemplo, mesmo introduzindo o conceito de arquivos identificados por nomes em <stdio.h>, não há especificação de onde nem de como esses arquivos venham a ser armazenados, nem como ele pode persistir por tempo maior do que o da duração da execução do programa em C ou C++.

Esse computador genérico é útil em muitos sentidos, incluindo na capacidade de criar programas que produzam comportamento idêntico em múltiplas implementações, pelo menos do ponto de vista do programa em C ou C++. Contudo, dentre os itens elencados acima, um em particular abre a porta para a produção de comportamentos diferentes por diferentes hospedeiros: a função system(). Isso se dá porque o argumento dessa função é um comando que é executado por cada hospedeiro fora do escopo do programa em C ou C++, de modo que é possível (e, na prática, muito comum) que diferentes hospedeiros não reconheçam os mesmos comandos, ou que produzam resultados diferentes sob diferentes condições de execução em diferentes momentos.

Frequentemente é necessário fazer com que o programa em C ou C++ execute mais coisas do que apenas as funções do computador genérico. Seja para lidar com um tipo de dispositivo específico de um computador real, seja para dar ao usuário uma experiência mais agradável (através de uma interface interativa ou gráfica, por exemplos), seja para lidar com detalhes de implementação, é muito comum que o programa tenha de recorrer a algum meio de interagir com o computador específico em que executa para executar funções que lhe são específicas.

Nesses casos, às vezes basta invocar system() com o argumento certo para o hospedeiro em questão. Contudo, o conjunto de operações que costuma estar disponível para o uso dessa maneira costuma ser muito pequeno quando comparado a todos os recursos que o hospedeiro pode oferecer. Além disso, frequentemente é muito custoso executar qualquer coisa através essa função, e ainda existe o problema de que o programa que chama system() fica parado até que a solicitação feita ao hospedeiro esteja totalmente concluída.

O que muitos programas que precisam de recursos específicos da máquina fazem é complementar a funcionalidade padronizada com bibliotecas de funções e tipos específicas do sistema hospedeiro que implementem as funções específicas desse hospedeiro nas quais o programador tem interesse.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


3. Re: Uma pergunta iniciante sobre C

Jhevi
Jhevison

(usa Arch Linux)

Enviado em 29/05/2019 - 16:43h

paulo1205 escreveu:

C e C++ são linguagens pensadas para computadores genéricos. Essas linguagens exigem do computador apenas as seguintes características:

  • conseguir armazenar e recuperar valores na memória;
  • poder representar dados de certos tipos determinados, a saber: números inteiros (dos quais caracteres são casos particulares), números de ponto flutuante, e um tipo que possa ser usado para endereçar a memória;
  • ser capaz de executar certo conjunto finito de operações aritméticas e lógicas;
  • permitir desvios do fluxo de execução do programa, que podem ser incondicionais (goto, break, continue), condicionais (if/else, while, do-while, swicth) e invocação de funções.

As linguagens nem ao menos exigem que essas operações sejam mapeadas de forma direta para operações nativas de algum tipo de máquina. Um PC cujo processador tem como mapear nativamente todas as características acima é tão válido como alvo quanto uma pessoa que usa cadernos como memória e como form de acompanhar o estado atual de execução do programa, e lápis para alterar os valores dessa memória e estado durante execução.

Um passo além da linguagem pura e simples, os padrões do C e do C++ definem o comportamento de programas que executem sob uma implementação “hospedada” por algo parecido com um sistema operacional. As operações requeridas do ambiente hospedado não estão em nível de linguagem, mas são realizadas por meio de tipos de dados e funções com nomes padronizados, que são parte da biblioteca padrão associada à linguagem. Nessas implementações, a lista de exigências cresce um pouco, incluindo o seguinte:

  • receber do ambiente hospedeiro informações que possam modificar o comportamento da execução do programa, bem como devolver um código que possa indicar o grau de sucesso da execução do programa (através da função main(), mas também exit(), abort() e outras);
  • poder alocar e desalocar dinamicamente quantidades de memória que só serão conhecidas no momento da execução do programa (malloc(), realloc(), free() e funções relacionadas, ou containers do C++);
  • manipular strings de caracteres, usando uma representação de strings que também é definida pelo padrão (todas as funções em <string.h>, ou <string> do C++);
  • executar operações matemáticas além daquelas implementadas em nível de linguagem, tais cálculo de valor absoluto, funções exponenciais, logarítmicas, trigonométricas e transcendentais etc. (em <stdlib.h> e <math.h>);
  • realizar entrada e saída de dados, inclusive a partir de meios de armazenamento que possam manter tais dados por tempo maior do que a duração do programa (em <stdio.h>, ou <iostream>, <fstream> e relacionados em C++);
  • implementar meios de invocar o ambiente de execução hospedeiro, para que ele possa ser capaz de executar operações arbitrárias (e.g. system());
  • representar e manipular dados de data e hora (em <time.h>,);
  • permitir a manipulação de argumentos individuais em funções com número variável de argumentos (em <stdarg.h>).

Apesar da lista de maior tamanho, o computador alvo dessa especificação continua bastante genérico. Por exemplo, mesmo introduzindo o conceito de arquivos identificados por nomes em <stdio.h>, não há especificação de onde nem de como esses arquivos venham a ser armazenados, nem como ele pode persistir por tempo maior do que o da duração da execução do programa em C ou C++.

Esse computador genérico é útil em muitos sentidos, incluindo na capacidade de criar programas que produzam comportamento idêntico em múltiplas implementações, pelo menos do ponto de vista do programa em C ou C++. Contudo, dentre os itens elencados acima, um em particular abre a porta para a produção de comportamentos diferentes por diferentes hospedeiros: a função system(). Isso se dá porque o argumento dessa função é um comando que é executado por cada hospedeiro fora do escopo do programa em C ou C++, de modo que é possível (e, na prática, muito comum) que diferentes hospedeiros não reconheçam os mesmos comandos, ou que produzam resultados diferentes sob diferentes condições de execução em diferentes momentos.

Frequentemente é necessário fazer com que o programa em C ou C++ execute mais coisas do que apenas as funções do computador genérico. Seja para lidar com um tipo de dispositivo específico de um computador real, seja para dar ao usuário uma experiência mais agradável (através de uma interface interativa ou gráfica, por exemplos), seja para lidar com detalhes de implementação, é muito comum que o programa tenha de recorrer a algum meio de interagir com o computador específico em que executa para executar funções que lhe são específicas.

Nesses casos, às vezes basta invocar system() com o argumento certo para o hospedeiro em questão. Contudo, o conjunto de operações que costuma estar disponível para o uso dessa maneira costuma ser muito pequeno quando comparado a todos os recursos que o hospedeiro pode oferecer. Além disso, frequentemente é muito custoso executar qualquer coisa através essa função, e ainda existe o problema de que o programa que chama system() fica parado até que a solicitação feita ao hospedeiro esteja totalmente concluída.

O que muitos programas que precisam de recursos específicos da máquina fazem é complementar a funcionalidade padronizada com bibliotecas de funções e tipos específicas do sistema hospedeiro que implementem as funções específicas desse hospedeiro nas quais o programador tem interesse.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


---

Resumindo, pode dizer-se que quem usa essa função, está fazendo gambiarra?


4. Re: Uma pergunta iniciante sobre C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/05/2019 - 17:12h

Jhevison escreveu:

Resumindo, pode dizer-se que quem usa essa função, está fazendo gambiarra?


Geralmente sim, mas depende do caso.

Uma coisa é certa: um programa que recorre a system() fica quase sempre amarrado a um ambiente de execução específico. Eu considero que isso é um problema em programas que não teriam razão nenhuma para ter essa amarração. Por exemplo: um exercício de faculdade em que o cara está treinando uso de ponteiros, mas que tem system("CLS"), system("COLOR 15 ") e system("PAUSE") para todo lado é um sinal de que o cara está mais interessado em firulas visuais do que em treinar ponteiros.

Mas há casos em que o programa tem de estar amarrado ao sistema hospedeiro, e esse sistema pode ter uma forma pronta de conseguir realizar algo que seria muito complicado de fazer dentro do programa em C, mesmo que se utilizassem as bibliotecas nativas do sistema, ou as bibliotecas nativas podem não estar disponíveis porque teriam de ter sido adquiridas à parte ou porque ninguém nunca pensou que alguém poderia desejar aquela funcionalidade. Nesses casos, usar system() pode ser a melhor solução, ou mesmo a única.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


5. Re: Uma pergunta iniciante sobre C

Jhevi
Jhevison

(usa Arch Linux)

Enviado em 29/05/2019 - 17:22h

paulo1205 escreveu:

Jhevison escreveu:

Resumindo, pode dizer-se que quem usa essa função, está fazendo gambiarra?


Geralmente sim, mas depende do caso.

Uma coisa é certa: um programa que recorre a system() fica quase sempre amarrado a um ambiente de execução específico. Eu considero que isso é um problema em programas que não teriam razão nenhuma para ter essa amarração. Por exemplo: um exercício de faculdade em que o cara está treinando uso de ponteiros, mas que tem system("CLS"), system("COLOR 15 ") e system("PAUSE") para todo lado é um sinal de que o cara está mais interessado em firulas visuais do que em treinar ponteiros.

Mas há casos em que o programa tem de estar amarrado ao sistema hospedeiro, e esse sistema pode ter uma forma pronta de conseguir realizar algo que seria muito complicado de fazer dentro do programa em C, mesmo que se utilizassem as bibliotecas nativas do sistema, ou as bibliotecas nativas podem não estar disponíveis porque teriam de ter sido adquiridas à parte ou porque ninguém nunca pensou que alguém poderia desejar aquela funcionalidade. Nesses casos, usar system() pode ser a melhor solução, ou mesmo a única.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


Compreendo. Vejo que possui muito conhecimento sobre a linguagem, se tiver tempo, e noção do que se trata. Poderia responder meu tópico?

https://www.vivaolinux.com.br/topico/C-C++/getchar-do-ncurses-imprimi-a-mensagem-direto-sem-eu-digit...


6. Re: Uma pergunta iniciante sobre C

Jhevi
Jhevison

(usa Arch Linux)

Enviado em 29/05/2019 - 17:31h

paulo1205 escreveu:

Jhevison escreveu:

Resumindo, pode dizer-se que quem usa essa função, está fazendo gambiarra?


Geralmente sim, mas depende do caso.

Uma coisa é certa: um programa que recorre a system() fica quase sempre amarrado a um ambiente de execução específico. Eu considero que isso é um problema em programas que não teriam razão nenhuma para ter essa amarração. Por exemplo: um exercício de faculdade em que o cara está treinando uso de ponteiros, mas que tem system("CLS"), system("COLOR 15 ") e system("PAUSE") para todo lado é um sinal de que o cara está mais interessado em firulas visuais do que em treinar ponteiros.

Mas há casos em que o programa tem de estar amarrado ao sistema hospedeiro, e esse sistema pode ter uma forma pronta de conseguir realizar algo que seria muito complicado de fazer dentro do programa em C, mesmo que se utilizassem as bibliotecas nativas do sistema, ou as bibliotecas nativas podem não estar disponíveis porque teriam de ter sido adquiridas à parte ou porque ninguém nunca pensou que alguém poderia desejar aquela funcionalidade. Nesses casos, usar system() pode ser a melhor solução, ou mesmo a única.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)



Outra pergunta:
Bom, eu criei um programa de perguntas, nele, eu utilizei system("clear"); para limpar a tela, para não bagunçar às perguntas e, para entretenimento, para meus amigos não ficarem gravando as perguntas facilmente. Isso poderia caracterizar como gambiarra? Ou como um "suporte" ao programa?



7. Re: Uma pergunta iniciante sobre C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/05/2019 - 17:37h

wiloud escreveu:

Uma.pergunta pra galera que manja de C/C++, a questão é o seguinte, eu tava pesquisando como mover um arquivo de uma pasta para o desktop, fui pesquisar na internet e o pessoal dizendo pra usar system();, ué, isso não é batch? (outras coisas como pausar, fechar o programa me falaram pra usar system()), então pra que aprender C que n consegue fazer coisas que batch faz, tenho certeza absoluta que C é muitissimo poderoso que Batch, e certeza que tem como fazer um script que mova um arquivo pra o desktop, aí que entra a pergunta, como fazer isso? tenho que criar meus proprios comandos ? funções, matrizes ou vetores pra fazer esse script? (so to chutando, realmente n sei nem por onde começar a fazer esse script)


Aproveitando que o tópico foi reavivado, eu acabei não dizendo como fazer o que você perguntou.

Mas também isso vai depender do ambiente de execução que você estiver usando — não apenas do modelo, idioma e versão do sistema operacional, mas até de características particulares de cada máquina.

Uma forma portável de fazer seria copiar o arquivo da origem para o destino, e depois de copiado com sucesso, remover o arquivo de origem. O código ficaria parecido com o seguinte.

FILE *orig, *dest;
if(!(orig=fopen("arquivo_origem", "rb"))){
fprintf(stderr, "Não foi possível abrir arquivo de origem: %s.\n", strerror(errno));
exit(1);
}
if(fseek(orig, 0, SEEK_END)!=0){
fprintf(stderr, "Não foi possível saber o tamanho do arquivo de origem: %s.\n", strerror(errno));
exit(1);
}
unsigned long orig_size, dest_size;
orig_size=ftell(orig);
rewind(orig);
if(!(dest=fopen("arquivo_destino", "wb"))){
fprintf(stderr, "Não foi possível abrir arquivo de destino: %s.\n", strerror(errno));
exit(1);
}
dest_size=0;
int ch;
while((ch=fgetc(orig))!=EOF && fputc(ch, dest)!=EOF)
++dest_size;
if(dest_size!=orig_size || !fclose(dest)){
fprintf(stderr, "Falha ao gravar arquivo destino: %s.\n", strerror(errno));
exit(1);
}
fclose(orig);
if(remove("arquivo_origem")!=0){
fprintf(stderr, "Falha ao remover arquivo de origem: %s.\n", strerror(errno));
exit(1);
}



... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)



  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts