[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: entrada



Olá,

On Sun, Jun 23, 2002 at 01:01:50PM -0700, Zhang He wrote:
> Olá, tenho uma duvida sobre a entrada de dados para um executavel.
> Por exemplo, meu ep funciona assim " a.out < dados/tes-peq " . Assim
> o programa só pega os dados do arquivo e nao dá pra o usuario entrar
> outros dados que nao estao no arquivo (por ex pontos aleatorios). Tem
> algum jeito de pular fora do arquivo durante a execuçao do programa? 

A forma "a.out < arquivo" na verdade faz o seguinte: os dados contidos em
"arquivo" são direcionados para a entrada padrão do programa a.out.
Como o seu executável lê os dados da entrada padrão, obtém-se o efeito da
leitura dos dados do arquivo. Porém. é importante lembrar que o
direcionamento de dados desta forma é uma característica do shell que você
usa (exemplos de shells: bash, tcsh, o shell do DOS, etc.), e nem todos os
shells possuem este recurso.

Para que o programa realmente realize manipulação de arquivos, em C,
pode-se utilizar ponteiros para arquivos e as funções fscanf, fprintf, etc. 

Um programa simples para exemplificar o uso de ponteiros para arquivos (este
programa faz uma cópia do conteúdo de um arquivo para outro) é o seguinte:

#include <stdio.h>

int main()
{

// ponteiros para arquivos: o arquivo que será copiado, e o arquivo de destino
FILE *arq_entrada, *arq_saida;

char buf[200000];
int i, n;

/* guardarão os nomes dos arquivos */
char nome_arq_entrada[256], nome_arq_saida[256]; 

/* solicita o nome do arquivo de entrada */
printf("Dê o nome do arquivo de entrada: ");
scanf("%s", nome_arq_entrada);

/* Tenta abrir o arquivo de entrada, em modo de leitura ("r") */
arq_entrada = fopen(nome_arq_entrada, "r");
if (arq_entrada == NULL) {
  printf("Erro na abertura do arquivo %s!\n", nome_arq_entrada);
  return 1;
}

/* Lê o arquivo de entrada e guarda seu conteúdo no buffer */
i = 0;
while (fscanf(arq_entrada, "%c", &buf[i]) != EOF) i++;

/* fecha o arquivo de entrada */
fclose(arq_entrada);

/* solicita o nome do arquivo de saída */
printf("Dê o nome do arquivo de saída: ");
scanf("%s", nome_arq_saida);

/* tenta abrir o arquivo de saída em modo de escrita ("w"). Note que o modo "w"
fará com que o arquivo aberto seja sobrescrito (caso ele não exista, um novo 
arquivo será criado. Existe também o modo "append" ("a"), onde o que o seu
programa escrever será concatenado ao final, ao invés de sobrescrever o
arquivo */
arq_saida = fopen(nome_arq_saida, "w");
if (arq_saida == NULL) {
  printf("Erro na abertura do arquivo %s!\n", nome_arq_saida);
  return 1;
}  

/* copia o buffer para o arquivo de saída */
n = i;
for (i = 0; i < n; i++) {
  fprintf(arq_saida, "%c", buf[i]);
}

/* fecha o arquivo de saída */
fclose(arq_saida);

return 0;

}

Para conseguir fazer o que você perguntou, você pode abrir um ou mais arquivos
e processá-los individualmente, na ordem que desejar (ou abrir um ou mais
arquivos, processá-los e depois esperar mais dados na entrada padrão). Pode
ser interessante dar uma lida nas man pages das funções fscanf, fprintf, fopen,
fclose e fgetc (executando "man nome_da_função").

Boa sorte!

Daniel