Introdução

Introdução

Com esta parte do nosso artigo C no artigo do Linux, estamos nos preparando para sair da zona teórica e entrar na vida real. Se você seguiu a série até este ponto e tentou resolver todos os exercícios, agora terá uma idéia sobre o que é C, então você precisa sair na natureza e fazer algumas coisas práticas, sem a qual a teoria não tem muito valor. Alguns dos conceitos que você verá abaixo já são conhecidos, mas são extremamente importantes para qualquer programa C em qualquer sistema operacional do tipo Unix. Sim, a informação é válida independentemente do sistema operacional, desde que seja algum tipo de Unix, mas se você tropeçar em algo específico do Linux, saberá. Trataremos conceitos como entrada, saída e erro padrão, printf () e acesso a arquivos, entre outros.

E/S básico

Antes de prosseguirmos, vamos levar algum tempo e ver o que é isso. Como muitos de vocês sabem, o termo significa entrada/saída e tem um significado amplo, mas, no nosso caso, estamos interessados ​​em imprimir mensagens no console e como obter informações do usuário, além de tópicos mais avançados no mesmo veia. A biblioteca C padrão define uma série de funções para isso, como você verá, e depois de ler um pouco, você notará que achará muito difícil viver sem, a menos que queira reescrever as funções referidas por diversão por diversão. É melhor ficar claro desde o início que as instalações que esse material fala não faz parte do idioma C por si só; Como eu disse, a biblioteca padrão C oferece a eles.

E/S padrão

Em resumo, a legenda acima significa “Obtenha a entrada do usuário, imprima caracteres na saída padrão e imprima erros no erro padrão”. Atualmente, a principal fonte de entrada, pelo menos nesse nível, é o teclado, e o dispositivo em que o sistema imprime é a tela, mas as coisas nem sempre foram assim. A entrada foi feita em teletipos (a propósito, o nome do dispositivo Tty vem disso), e o processo foi lento e desajeitado. Qualquer sistema semelhante ao UNIX ainda tem algumas sobras históricas em relação, mas não apenas, E/S, mas para o restante deste artigo, trataremos o Stdin como o teclado e o stdout/stderr como a tela. Você sabe que pode redirecionar para um arquivo, usando o operador '>' oferecido pelo seu shell, mas não estamos interessados ​​nisso por enquanto. Antes de começarmos o artigo finalmente, um pequeno lembrete: Mac OS até a versão 9 tem alguns recursos exclusivos sobre o nosso assunto que me levou a ler alguma documentação antes de iniciar o desenvolvimento nele. Por exemplo, em todos os sistemas UNIX (semelhantes), a tecla Enter gera um LF (Feed de linha). No Windows, é CR/LF, e na Apple até o Mac OS 9, é CR. Em suma, todo vendedor comercial do UNIX tentou tornar seu OSS "único" adicionando recursos. Falando em documentação, as páginas manuais do seu sistema serão inestimáveis, embora talvez sejam áridas às vezes, e também um bom livro sobre o Unix Design ficará bem no seu lado.

Vimos Printf () em nossas parcelas anteriores e como imprimir o texto na tela. Também vimos scanf () como um meio de obter texto do usuário. Para caracteres únicos, você pode contar com getchar () e putchar (). Veremos agora algumas funções úteis dos cabeçalhos incluídos na biblioteca padrão. O primeiro cabeçalho sobre o qual falaremos é ctype.h, e contém funções úteis para verificar o caso de um personagem ou alterá -lo. Lembre -se de que todo cabeçalho padrão tem uma página manual, explicando quais funções estão disponíveis e as funções, por sua vez. Aqui está um exemplo que converte todos os caracteres em uma string em minúsculas, usando tolower (). Como você alcançaria o oposto?

#include #include int main () int c; /* O personagem Leia*/ enquanto ((c = getchar ()) != Eof) putchar (tolower (c)); retornar 0;  

Outra pergunta para você é: de que maneira o código deve ser modificado para que imprima o resultado de baixa categoria somente após uma frase? Isto é, desde que a frase seja sempre encerrada por um ponto e um espaço.

printf () em detalhes

Como é uma função tão amplamente utilizada, eu só senti que merece uma subseção. printf () aceita argumentos prefixados com o símbolo '%' e seguido por uma carta (ou mais), dizendo assim que tipo de entrada deve esperar. Já trabalhamos antes com '%d', que significa decimal, o que é apropriado ao trabalhar com números inteiros. Aqui está uma lista mais completa dos especificadores de formato PrintF ():

  • D, I - Inteiro
  • o - octal, sem o prefixo zero
  • x, x - hexadecimal, sem o prefixo 0x
  • u - não assinado int
  • C - CHAR
  • s - string, char *
  • F, E, E, G, G, - Float - Verifique o manual Printf () do seu sistema
  • P - ponteiro, vazio *, dependente da implementação, padrão entre distritos Linux

Eu recomendo que você reserve algum tempo para brincar com esses especificadores, e o fato de eu não ter mais detalhes como precisão é porque você terá que fazer alguma leitura para si mesmo. Enquanto você estiver nisso, preste atenção especial à parte da lista de argumentos variáveis ​​e observe que o Linux tem um comando chamado Printf, como parte do CoreUtils, portanto, use a seção 3 MANPAGE (Linux específica, como outros unices pode ter as seções manuais dispostas de maneira diferente).

scanf () é o oposto do printf, pois é necessário a entrada do usuário em vez de sair para o usuário. Os especificadores de formato são quase os mesmos, com certas exceções sobre carros alegóricas e o fato de não ter um %P. Por que você acha que é isso? Ele também suporta listas de argumentos variáveis, assim como o printf ().

Acesso ao arquivo

Esta é outra parte essencial da E/S e, como C é relativamente baixo de nível, permite que você leia e grava arquivos para disco de uma maneira simples. O cabeçalho que oferece essa funcionalidade simples é stdio.h, e a função que você usará é FOPEN (). Ele toma o nome do arquivo como argumento, bem como o modo que ele deve ser lido (leia/write (r, w). anexar (a) ou binário (b), em oposição ao texto - mas a implementação deste último depende do sistema). fopen () retorna um ponteiro de arquivo, que é um tipo. Antes de qualquer coisa, você precisará de um ponteiro de arquivo, conforme ilustrado:

Arquivo *fp; / *ponteiro de arquivo */ fp = fopen ("/home/user/testfile.txt "," w "); fprintf (fp," meu arquivo de teste.")

Simples: abri um arquivo no meu disco e escrevi a string "meu arquivo de teste". Você pode ter adivinhado, eu tenho alguns exercícios. Faria diferença se o arquivo existir ou não? E se existisse, mas estivesse vazio? Deveria ter usado o apêndice em vez do modo de gravação? Por que?

Depois de usar o arquivo, é preciso fecha-o. Isso é importante, porque, ao fechar o seu programa, informa ao sistema operacional “Ei, eu terminei com este arquivo. Feche todos os buffers sujos e escreva meu arquivo no disco de maneira civilizada, para que não ocorra perda de dados ”.

fclose (FP);

Aqui está um exemplo da vida real de usar a E/S do arquivo do programa mais do Kimball Hawkins, que nos ajuda a lembrar duas coisas: uma, que, por causa do design do Unix (tudo é um arquivo), stdin, stdout e stderr são arquivos, então eles pode ser usado com funções de E/S de arquivo e duas, que a próxima parte trata o stderr e a saída.

void store_time ()  se (time_ok == false) retornar; / * Sem informações de tempo, pule -o */ /* Hora */ se (tfield [0]> 24) fprintf (stderr, "Erro: hora de entrada ruim: '%d' \ n", tfield [0]); saída (1);  theTime-> tm_hour = tfield [0]; / * Minuto */ se (tfield [1]> 0)  se (tfield [1]> 60) fprintf (stderr, "erro: minuto de entrada ruim: '%d' \ n", tfield [1]); saída (1);  theTime-> tm_min = tfield [1]; 

Tratando erros com stderr e saída

Seu programa deve ter alguma maneira de lidar com erros e deixar o sistema operacional e o usuário saber que algo deu errado. Embora essa parte não seja de forma alguma uma dissertação sobre como tratar suas situações possíveis em C, ela lida com um elemento muito útil e bem pensado do UNIX: erros de saída para outro lugar, diferente de Stdin, para que o usuário possa separar o dois ao depurar o problema. Além disso, use códigos de saída para que o usuário saiba quando o programa terminou com sucesso e quando não. É por isso que o stderr existe, para a primeira parte, e é por isso que exit () também existe, para a segunda parte. O leitor astuto já recebeu a idéia da amostra de código acima, então basta dizer ao sistema para não produzir texto na saída padrão/padrão, mas para o "canal" especial que existe especialmente para isso. Em relação à saída (), funciona assim: zero para sucesso, qualquer outro valor entre 1 e 255 em caso de falha. Está incluído em stdlib.h e não retorna um valor. Cabe a você, como você pode ver no código de Kimball acima, para dizer a saída se houver um problema, para que isso possa informar a função pai sobre o status de saída.

Cabeçalhos úteis

Escusado será dizer que sabendo que a biblioteca C padrão é obrigatória se você quiser levar a sério o desenvolvimento C no Linux. Então, aqui estão alguns outros cabeçalhos que oferecem instalações relacionadas à E/S e muito mais:

corda.h

Este cabeçalho será muito útil ao trabalhar com conversões de string (strto*()), comparando strings (strcmp ()) ou verificando o comprimento de uma corda (strlen ()).

ctype.h

Além da conversão de casos, ctype.h Oferece funções que verificam várias propriedades dos personagens. Alguns deles são Isalnum (), Isupper (), Isalpha () ou Isspace (), e você é convidado a adivinhar o que eles fazem e como eles funcionam.

matemática.h

Muitas funções necessárias para mais do que as quatro operações aritméticas básicas podem ser encontradas aqui, incluindo sin (), cos () ou exp ().

Leitura adicional

Os leitores mais experientes me prenderão na cruz por não tratar assuntos mais avançados como Malloc () ou Size_T. Como eu disse repetidamente, esta série não pretendida como um livro on-line para o desenvolvimento de C (de qualquer maneira não existe tal coisa), mas um bom ponto de partida para iniciantes. Eu sinto que o futuro desenvolvedor C deve ser relativamente bem versado em ponteiros e como a alocação de memória funciona antes de começar a ter Nightmares Malloc (). Após o final desta série, é recomendável obter um livro detalhado sobre C, depois de perguntar a algumas opiniões dos antigos (não H.P. Os antigos de Lovecraft, espero), então você evita informações falsas ou enganosas. Enquanto você saberá sobre Free () e Malloc () até terminarmos, provavelmente é melhor conseguir um livro impresso e dormir com ele debaixo do seu travesseiro.

Conclusão

O artigo que seguirá este será um pouco mais longo, pois nos aprofundaremos ainda mais na maneira do Unix de programação C, mas uma boa compreensão do que foi dito aqui é recomendado para que os próximos passos sejam o mais suaves possível.

  • EU. C Desenvolvimento no Linux - Introdução
  • Ii. Comparação entre C e outras linguagens de programação
  • Iii. Tipos, operadores, variáveis
  • 4. Controle de fluxo
  • V. Funções
  • Vi. Ponteiros e matrizes
  • Vii. Estruturas
  • Viii. E/S básico
  • Ix. Estilo de codificação e recomendações
  • X. Construindo um programa
  • XI. Embalagem para Debian e Fedora
  • Xii. Obtendo um pacote nos repositórios oficiais do Debian

Tutoriais do Linux relacionados:

  • Coisas para instalar no Ubuntu 20.04
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Como definir uma zona de firewalld personalizada
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Mastering Bash Script Loops
  • Download do Linux
  • Coisas para fazer depois de instalar o Ubuntu 22.04 Jellyfish…
  • Ubuntu 20.04 Guia
  • Instale Arch Linux na estação de trabalho VMware