Em C, escrever em arquivo fácil

Publicado por Elgio Schlemer em 23/10/2007

[ Hits: 19.615 ]

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

Cálculo da potência modular de forma eficiente

Enviar aspas em PHP de maneira menos suja

Usando rm para apagar arquivos esquisitos

Inserir comentários em regras do iptables

DROP ou REJECT no iptables?

Leitura recomendada

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

Listar arquivos de um diretório em C

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

Instalando o Atom editor no Funtoo/Gentoo

Pacotes proibidos do Mandrake!!!

  

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