Linguagem C : Arquivos por linha de comando – Argc e Argv
Postado em | fevereiro 5, 2010 | 2 Comments
E aí pessoal! Tudo bem com vocês? Espero que sim! Bem, hoje nós vamos aprender um pouco mais sobre a linguagem C, e o assunto de hoje é : Manipulando arquivos através da linha de comando (Argc e Argv) . Talvez você ainda não tenha pensado em algo parecido com o que vou falar adiante. Mas imagine. Muitas vezes, seria bastante útil se pudéssemos “conversar” com um programa no momento em que o executamos, fornecendo-o informações para que ele efetuasse determinada ação! Na linguagem C, isso é possível: Essas informações podem ser passadas para o programa através da função principal, que se chama main(), na linha de comando.
Então vejamos: Quando vamos executar um programa,no linux por exemplo, nós o chamamos da seguinte forma no terminal: “./nomedoprograma” (sem as aspas). Se quisermos passar alguma informação para este programa no mesmo momento em que o chamamos, faríamos assim: “./nomedoprograma informacao1 informacao 2[...]” que na verdade seriam os argumentos para a função main().
Entendido isso, precisamos saber que existem dois argumentos internos a essa função que são usados para receber as informações vindas da linha de comando. Vamos falar do primeiro: Argument Counter(Argc).
O Argument Counter representa a quantidade de argumentos (informações) que você forneceu ao seu programa. Esse argumento, trata-se de um número inteiro e é NO MÍNIMO 1 porque o nome do programa é considerado o primeiro argumento. Esse argumento tem a função de CONTAR a quantidade de argumentos que você forneceu. Ok?
Por exemplo: Se você chamar por somente “./nomedoprograma”, o seu Argc já é 1, pois o nome do programa também é contabilizado. Caso fosse “./nomedoprograma argumento1″ o seu Argc valeria 2. E assim por diante.
E o outro argumento interno, chama-se Argument Values (Argv), que trata-se de um PONTEIRO de PONTEIRO, ou melhor, de um ponteiro para uma matriz de ponteiros para caractere. Complicou? Vamos tentar descomplicar através do nosso exemplo.
Vamos comentar blocos de um programinha bem simples por sinal, que terá a função de escrever uma string (vetor de caractere) em um arquivo de texto, sendo que esta string será passada para que o programa possa escrevê-la em um arquivo de texto através da linha de comando.
Passaremos 3 argumentos pela linha de comando para o nosso programa, ou seja, o nosso Argc terá valor 3. Chamaremos o programa na linha de comando passando o caractere I(de Inserir) e a string entre aspas que será escrita no arquivo de texto, dessa forma:
./nomedoprograma I “Thiago Ribeiro”
Vamos ao código do programa:
#include<stdio.h>
/*Inclusão da biblioteca que contém funções de INPUT/OUTPUT(ENTRADA/SAÍDA) do C.*/
#include<stdlib.h>
/*Biblioteca de acesso à estrutura FILE*/
#define T 60
/*Diretiva de pré-processamento. Isso significa que o compilador ao vê-la, irá atribuir o valor 60 a qualquer T (maiúsculo) que encontrar no programa. Lembrando que o C, é CASE-SENSITIVE, ou seja, T (maiúsculo) não é o mesmo que t(minúsculo).*/
typedef char string[T];
/*Typedefinition. Estamos apenas definindo um tipo. No C, não temos o tipo string. Uma string trata-se de um vetor de caracteres, e no nosso caso, definimos um vetor de caracteres com T(60) posições.Estipulamos um limite de 60 caracteres para as strings que iremos passar pela linha de comando. Fazendo isso, criamos o tipo string, como o tipo char ou int que já conhecemos. Alterando o valor de T para 100 por exemplo, você teria um tipo string com limite de 100 caracteres.*/
void incluir (FILE *fp,string str);
/*Cabeçalho da nossa função que ira escrever a string passada pela linha de comando, dentro do arquivo de texto. Na implementação da função há mais detalhes.*/
int main (int argc,char *argv[])
{
/* Cabeçalho da função principal do C, com os devidos argumentos internos:Argc(um inteiro) e o Argv(Ponteiro).*/
FILE *fp;
char opcao;
/* Criação de um ponteiro de arquivo, chamado “file pointer”. Mas poderíamos chamá-lo de qualquer nome. Criamos também uma variável do tipo caractere chamada “opcao”, que posteriormente irá receber o caractere I de Inserir, que terá de ser passado pela linha de comando, para que o programa reconheça que queremos Incluir uma string no arquivo de texto.*/
if (argc<3){
printf(“Erro. Uso incorreto\n”);
printf(“Maneira adequada: ./nomedoprograma caractere string\n”);
exit(1);
}
/* Verifica se a quantidade de argumentos está correta: ./nomedoprograma(primeiro) I(seg.) “string”(terc.) Se estiver algo errado, iremos informar ao usuário que algo está errado, e indicar a maneira correta. Obs.:A função exit() terá o papel de parar o programa. Ela recebe por parâmetro um inteiro que será o valor de retorno do programa, e geralmente, 0 significa sucesso, e qualquer número diferente de zero, um erro.*/
fp = fopen(“saida.txt”,”a+”);
/* a função fopen() irá abrir o arquivo no formato de anexo. Colocamos neste modo pois nós queremos acrescentar strings ao final do Arquivo.O “+” indica que se o arquivo não existe no S.O o mesmo será criado. E caso já exista, sobreescrito.A fopen() retorna um ponteiro de arquivo. Como temos um ponteiro de arquivo chamado “fp”, podemos atribuir o retorno da nossa função fopen() ao nosso ponteiro. O nome do nosso arquivo pode ser especificado. No nosso caso chamaremos de saida.txt, porém, você pode alterá-lo para qualquer nome que desejar. Lembrando que se existir algum arquivo no S.O com este nome e tipo, o mesmo será sobreescrito.*/
if (fp == NULL){
printf(“Erro ao tentar abrir o arquivo!\n”);
exit(1);
}
/* Caso o ponteiro que a função fopen() retorne seja um ponteiro NULO, então informaremos ao usuário que ocorreu um erro quando a função tentou abrir o arquivo no S.O.*/
opcao = argv[1][0];
/*Aqui atribuímos à variável opcao(do tipo caractere) o argv[1][0], que é o I passado pela linha de comando. O 1 significa que a posição do caractere na linha de comando é a posição 1. E o 0,significa que o I está na primeira posição de um vetor de caractere. Lembrando que em C, o índice de uma matriz(array) começa em 0.*/
switch(opcao){
case ‘I’:
incluir(fp,argv[2]);
break;
}
/* Comando switch(). Passamos como parâmetro o I,de Incluir que veio na linha de comando. Vamos verificar se o caractere que o usuário passou foi o mesmo que queríamos através do comando case. Se for, chamamos a função incluir() passando o ponteiro que vai abrir o arquivo, e a string que escrevemos entre aspas na linha de comando, o argv[2], que é o terceiro parâmetro. Lembrando novamente que no C, a indexação de uma matriz(array) inicia no 0.*/
fclose (fp);
/*Fechando o arquivo com a função fopen(). É extremamente importante fechar um arquivo, depois de efetuar alguma ação no mesmo. Uma falha ao fechar um arquivo, pode acarretar uma série de problemas para o S.O, como por exemplo, perda de dados.*/
return 0;
/*Escrever o return 0, é considerado uma boa prática de programação, mesmo que a função main() não retorne nada.*/
}
void incluir (FILE *fp,string str)
{
fprintf(fp,”%s\n”,str);
}
/*A função do tipo VOID trata-se de um procedimento, uma função que não precisará retornar nada. Passamos como parâmetro para a função fprintf() o ponteiro que irá abrir o arquivo, e a string que virá pela linha de comando.Também há um \n para que pular uma linha após a inserção da string.*/
Compilando o programa e passando as devidas informações pela linha de comando, veja a figura:
*Feito isso, será gerado o nosso arquivo de texto chamado “saída.txt” e dentro dele, estará contida a string “Thiago Ribeiro”. E se você repetir o processo para uma nova string, a mesma será colocada abaixo de “Thiago Ribeiro”.
Download do código do programa corretamente identado:
Obs.: Ao compilar o programa,o compilador gcc irá dar um aviso pelo uso da função exit(). Mas não há nenhum erro de compilação ok?
Bem pessoal, por hoje é só. Qualquer dúvida sua, ou equívoco meu, favor comunicar. Obrigado pelos comentários no post anterior, e eu espero que tenha ajudado com mais este artigo. Um grande abraço, e até mais!
Comente este artigo:
2 comentários em “Linguagem C : Arquivos por linha de comando – Argc e Argv”
Deixe um comentário


fevereiro 6th, 2010 @ 3:25
Isso aê, Tico!
Boa iniciativa a sua, cara! O site/blog está bem interessante!! Vai em frente que sei que ainda tem muita coisa legal por vir!
abração
fevereiro 11th, 2010 @ 13:15
Acho, muito importante, os seus comentários, continue assim muito legal mesmo. Parabéns