Em C, escrever em arquivo fácil

Publicado por Elgio Schlemer em 23/10/2007

[ Hits: 19.833 ]

Blog: https://profelgio.duckdns.org/~elgio

 


Em C, escrever em arquivo fácil



Em C pode-se desviar para um arquivo aberto tudo que seria enviado para a tela fácil fácil. E nem estou falando de executar o código com > na linha de comando (./algo > lixo.txt).

#include <stdio.h>

int main()
{
   close(1);
   fopen("teste.txt", "w");

   printf("teste\n");
}

Explicação: O C trabalha com uma tabela de arquivos abertos onde já existem TRÊS abertos:
  • 0 - entrada padrão, teclado;
  • 1 - saída padrão, tela;
  • 2 - saída padrão de erro, tela.

Ao abrir um novo arquivo, vai ocupar a próxima posição livre. Como eu FECHEI (close) a 1, o arquivo aberto vai usar a 1. Logo, tudo que deveria sair na saída padrão (tela) vai para o arquivo.

Isto é MUITO ÚTIL para sockets, pois um socket TCP ou UDP também ocupa uma posição desta mesma tabela.

Em tempo: isto não é exatamente do C, mas sim do Sistema Operacional e a mesma técnica pode ser usada em Shell.

Outras dicas deste autor

Extrair a data de uma fotografia

Melhore o desempenho do HISTORY

Firewall SIMPLES e eficiente para DESKTOP em 5 linhas

Enviar aspas em PHP de maneira menos suja

DROP ou REJECT no iptables?

Leitura recomendada

Como criar um diretório em C/C++

Listar arquivos de um diretório em C

Seu compilador GCC não funciona mais, como solucionar?

Stay Safe Postcast

Lazarus - Delphi no Linux

  

Comentários
[1] Comentário enviado por removido em 23/10/2007 - 17:35h

tsc...tsc...

[2] Comentário enviado por bruno_dudinha em 07/12/2007 - 16:20h

Nobres colegas...seguidores desta maravilhosa linguagem c!:-)
Tenho algumas dúvidas!:-( Espero que vcs me ajudem!:-)
Estou desenvolvendo um software que pega alguns códigos e tipos de documentos, voltado para este último citado, onde armazena em vetores os códigos de usuário, tipo de documento, etc...
vcs verão no código logo mais. O software em si está quase pronto...está faltando digamos que o método de ordenação dos
tipos de documentos com suas respectivas ordens como por exemplo a data de produção, o "proprietário" do documento que é aberto e salvo como um arquivo no formato .txt!!! Vcs poderiam iluminar os meus pensamentos e me dizer como fazer ou até mesmo me enviar por e-mail um exemplo trabalhado em cima do código que realmente funcione:-) Já tentei de tudo mas não estou conseguindo resolver!
Se puderem me responder o mais rápido possível...fico muito grato! O código é:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
struct documento {
char numero[5];
char ano[5];
char tipo_cod[5];
char resp_cod[5];
char data[10];
char assunto[100];
char inativo[2];
char status;
} doc;
FILE *fdoc;
/*prototipo das funcoes*/
void incluir (void);
void consultar(void);
void excluir(void);
void alterar(void);
void abrir(void);
void listar(void);

int main(void){
char opcao[2], op;
do{
do{
system("cls");
printf("\n\n\n\n\n\n\n");
printf("\t########################################################\n");
printf("\t# #\n");
printf("\t# Programa de Controle de Documentos #\n");
printf("\t# #\n");
printf("\t########################################################\n\n");
printf("\n Digite uma das opcoes\n\n");
printf("\n I - Incluir");
printf("\n A - Alterar");
printf("\n E - Excluir");
printf("\n C - Consultar");
printf("\n L - Listar");
printf("\n S - Sair");
printf("\n\n\n Opcao:");
gets(opcao);
op=tolower(*opcao);
} while(!strchr("iaeclsh",op));
switch(op){/*D*/
case 'i' : incluir(); break;
case 'a' : alterar(); break;
case 'e' : excluir(); break;
case 'c' : consultar(); break;
case 'l' : listar(); break;
case 's' : exit(0);
}
}while(1);
}
/*Funcoes*/
void abrir(char tipo[3])
{
if((fdoc=fopen("C:\documento.txt", tipo))==NULL)
{printf("\nO arquivo nao pode ser aberto!! \n");
getch();
exit(1);
}
}
void incluir(void)
{
abrir("ab+");
fseek(fdoc,0L, SEEK_END);

do
{
printf("\n Digite o numero ou <FIM> para sair:\n\n");
gets(doc.numero);

if ((strcmp(doc.numero,"fim")!=0)&&(strcmp(doc.numero,"FIM")!=0)){
printf("\n Ano(1990):"); gets(doc.ano);
printf("\n Tipo(codigo):"); gets(doc.tipo_cod);
printf("\n Responsavel(codigo):"); gets(doc.resp_cod);
printf("\n Data (31/12/1990):"); gets(doc.data);
printf("\n Assunto:"); gets(doc.assunto);
printf("\n Inativo (0=Ativo e 1=Inativo):"); gets(doc.inativo);
doc.status='1';
if(fwrite(&doc, sizeof(struct documento), 1, fdoc) != 1)
{
printf("\n Erro de gravacao!");
getch();
}
else
{ printf("\n Gravacao feita com sucesso!\n\n");}
}
}while((strcmp(doc.numero,"fim")!=0)&&(strcmp(doc.numero,"FIM")!=0));
fclose(fdoc);
}
int busca (void){
int achou=-1,posicao=0;
char numerop[5];
abrir("rb");
printf("\nDigite o numero para consultar:");
gets(numerop);
rewind(fdoc);
while((!feof(fdoc))&&(achou==-1))
{
fread(&doc, sizeof(struct documento), 1, fdoc);
if (!feof(fdoc))
{if (strcmp(numerop, doc.numero)==0)
{if (doc.status=='0')
{posicao=-2;}
achou=1;
}
else{posicao++;}
}
else{posicao=-1;}
}
if (achou==-1)
{posicao=-1;}
fclose(fdoc);
return(posicao);
}
void consultar(void){
int pos;
pos=busca();
if(pos==-1)
{
printf("\nNumero inexistente!");
getch();
}
else if(pos==-2)
{
printf("\nNumero inexistente no arquivo!");
getch();
}
else
{
abrir("rb+");
fseek(fdoc,pos*sizeof(struct documento),SEEK_SET);
fread(&doc, sizeof(struct documento), 1, fdoc);
printf("\n\n----------------------------------------");
printf("\nNumero:%s",doc.numero);
printf("\nAno:%s",doc.ano);
printf("\nTipo:%s",doc.tipo_cod);
printf("\nResponsavel:%s",doc.resp_cod);
printf("\nData:%s",doc.data);
printf("\nAssunto:%",doc.assunto);
printf("\nInativo:%",doc.inativo);
getch();
}
fclose(fdoc);
}
void alterar(void){
int pos;
pos=busca();
if (pos==-1)
{
printf("\nNumero inexistente no arquivo");
getch();
}
else if(pos==-2)
{
printf("\nNumero inexistente no arquivo!");
getch();
}
else
{
abrir("rb+");
fseek(fdoc,pos*sizeof(struct documento),SEEK_CUR);
fread(&doc, sizeof(struct documento), 1, fdoc);
printf("\nDeseja alterar o seguinte registro?");
printf("\nNumero:%s",doc.numero);
printf("\nAno:%s",doc.ano);
printf("\nTipo:%s",doc.tipo_cod);
printf("\nResponsavel:%s",doc.resp_cod);
printf("\nData:%s",doc.data);
printf("\nAssunto:%s",doc.assunto);
printf("\nInativo:%s",doc.inativo);
getch();
printf("\nDigite as informacoes corretas:");
printf("\nNumero:");
gets(doc.numero);
printf("\nAno:");
gets(doc.ano);
printf("\nTipo:");
gets(doc.tipo_cod);
printf("\nResponsavel:");
gets(doc.resp_cod);
printf("\nData:");
gets(doc.data);
printf("\nAssunto:");
gets(doc.assunto);
printf("\nInativo:");
gets(doc.inativo);
doc.status='1';
fseek(fdoc,pos*sizeof(struct documento),SEEK_SET);
if(fwrite(&doc, sizeof(struct documento),1, fdoc)!=1)
{
printf("\nErro na gravacao!");
}
else
{
printf("\nAlteracao feita com sucesso!");
getch();
}
}
fclose(fdoc);
}
void listar(void) {
int cont=0;

abrir("rb");
fseek(fdoc, 0L, SEEK_SET);
fread(&doc, sizeof(struct documento),1, fdoc);
do
{
if (doc.status!='0')
{
printf("\n---------------------------------------");
printf("\nNumero:%s",doc.numero);
printf("\nAno:%s",doc.ano);
printf("\nTipo:%s",doc.tipo_cod);
printf("\nResponsavel:%s",doc.resp_cod);
printf("\nData:%s",doc.data);
printf("\nAssunto:%s",doc.assunto);
printf("\nInativo:%s",doc.inativo);
cont++;
}
fread(&doc, sizeof(struct documento),1, fdoc);
}while(!feof(fdoc));
printf("\n#Numero de Registros=%d",cont);
getch();
}
void excluir(void){
int pos;
pos=busca();
if(pos==-1)
{
printf("\nNumero inexistente no arquivo");
getch();
}
else
{
if(pos==-2)
{
printf("\nNumero excluido do arquivo");
getch();
}
else
{
abrir("rb+");
fseek(fdoc, pos*sizeof(struct documento), SEEK_SET);
fread(&doc, sizeof(struct documento), 1, fdoc);
printf("\n---------------------------------------");
printf("\nNumero: %s",doc.numero);
printf("\nAno: %s",doc.ano);
printf("\nTipo: %s",doc.tipo_cod);
printf("\nResponsavel: %s",doc.resp_cod);
printf("\nData: %s",doc.data);
printf("\nAssunto: %s",doc.assunto);
printf("\nInativo: %s",doc.inativo);
printf("\nEste Registro #%d sera excluido",(pos+1));
getch();
//strcpy(reg.status,"0");
doc.status='0';
fseek(fdoc, pos*sizeof(struct documento), SEEK_SET);
if(fwrite(&doc, sizeof(struct documento), 1, fdoc)!=1)
{
printf("\nErro na gravacao!");
getch();
}
else
{
printf("\nExclusao feita com sucesso!");
getch();
}
}
}
fclose(fdoc);
}

...o meu e-mail é: bruno_duda1@yahoo.com.br
Aguardo a resposta e valeu pela atenção!:-)



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts