[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
- References:
- entrada
- From: Zhang He <zhe_br@yahoo.com.br>