Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda Com Arquivos Em C


rlcdo

Pergunta

Pessoal, preciso de uma função main() que faça o seguinte: leia de um arquivo de entrada e gere um arquivo de saída. Por exemplo, preciso que leia um "if" de um arquivo de entrada e gere um arquivo de saida dizendo que "if é uma palavra reservada". Não estou pedindo nada pronto, apenas uma função main() genérica que faça isso, em linguagem C e de preferência sem usar muito ponteiros (não sou muito bom em ponteiros =( )

ps: preciso disso pois estou fazendo um analisador léxico. Já fiz uma boa parte, mas não to sabendo ler de um arquivo de entrada e gerar um de saída.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

ok, mas acho que vai complicar mais ainda. Nesse código, já tem a main() com entrada e saida de arquivo... o problema é que quem me ajudou a fazer isso foi um amigo da faculdade, e ele encheu isso de ponteiros, e não está conseguindo me ajudar a fazer estaticamente essa parte de arquivos (coloquei até em itálico no código abaixo). Gostaria que vocês me mostrassem uma outra forma de fazer isso, sem usar ponteiros (apenas a parte em itálico). Claro que mudando isso, terei que mudar algumas coisas no código, mas acho que não será difícil. Podem me ajudar?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#define tamHash 47

// Estrutura que representa um Token
typedef struct Token{
    int classe;
    char valor[15];
    int linha, coluna;                
}Ttoken;

// Estrutura que representa o nodo da lista
typedef struct dado{
    Ttoken token;  
    struct dado *prox;
}Tdado;

// Estrutura que representa a lista
// A lista é acessada através de um ponteiro para o seu primeiro nodo, 
// no caso a cabeça da lista
typedef struct lista
{
    Tdado *inicio;
    int tam;
}Tlista;

// Estrutura que representa a Tabela Hash
// Cada elemento da tabela será um ponteiro para um lista
typedef struct thash
{
    Tlista *vet[tamHash];
}THash;

// Função para criar a lista com tamanho zero
Tlista* criaLista()
{
    Tlista *lista = (Tlista*)malloc(sizeof(Tlista));
    lista->inicio = NULL;
    lista->tam = 0;
    return lista;
}

// Função para inserir um nodo no início da lista
void insereInicio(Tlista *lista)
{
    // Inicializa o dado a ser inserido
    int cod;
    Tdado *dado = (Tdado*)malloc(sizeof(Tdado));
    printf("\n Codigo: ");
    scanf("%d", &cod);
//    dado->token = cod;

    // Insere no início da lista
    Tdado *aux;
    aux = lista->inicio;
    lista->inicio = dado;
    dado->prox = aux;
    lista->tam +=1;
}

// Função para exibir os elementos da lista
void exibeLista(Tlista *lista)
{
    int i=0;
    Tdado *noatual = lista->inicio;

    while(  noatual != NULL)
    {
 //       printf("\nCodigo:%s", token->valor);
        noatual = noatual->prox;
    }
}
//verifica se é palavra reservada
int checa_pr(char* palavra)
{
     //vetor palavras reservadas
     int i;
     char **pr=(char**)malloc(33*sizeof(char*));
     for(i=0;i<33;i++)
       pr[i]=(char*)malloc(8*sizeof(char));
     
     pr[0]="mod";
     pr[1]="not";
     pr[2]="procedure";
     pr[3]="function";
     pr[4]="if";
     pr[5]="then";
     pr[6]="else";
     pr[7]="and";
     pr[8]="repeat";
     pr[9]="ultil";
     pr[10]="begin";
     pr[11]="end";
     pr[12]="downto";
     pr[13]="to";
     pr[14]="or";
     pr[15]="var";
     pr[16]="for";
     pr[17]="do";
     pr[18]="while";
     pr[19]="array";
     pr[20]="case";
     pr[21]="const";
     pr[22]="div";
     pr[23]="program";
     pr[24]="integer";
     pr[25]="double";
     pr[26]="char";
     pr[27]="boolean";
     pr[28]="read";
     pr[29]="write";
     pr[30]="writeln";
     pr[31]="true";
     pr[32]="false";

    for(i=0;i<33;i++)
    {
      if(!strcmp(pr[i],palavra)) { return 1; }
    }
    return 0;
    
}
    


[i]main(int argc, char **argv) {
    if(argc!=3) exit(1);
    int coluna=0,linha=0;
    FILE* entrada;
    entrada=fopen(argv[1],"r");
    FILE* saida;
    saida=fopen(argv[2],"w");
    if(entrada==NULL) { printf("Erro ao abrir arquivo"); exit(1); }[/i]
    char palavra[15],c,temp='',teste;
    int iascii=0;
    int i=0,j=0,m=0,ok=0,n=0,li=0,lf=0,sair=0,index,cntletras;
    Tlista* l=criaLista();
    
   
     Ttoken **t=(Ttoken**)malloc(5*sizeof(Ttoken*));
       t[0]=(Ttoken*)malloc(1*sizeof(Ttoken));
       
    for(i=0;i<15;i++)
      palavra[i]='';
      
      
      
    do {
      sair=0;
      c=fgetc(entrada);
      if(c=='\n' || c==EOF || c=='\t')
      {
        linha++;
        coluna=0;
        ok=1;
       // if(c==EOF) break;
      }
      else
      {
        if(c==' ')
        {
          cntletras=strlen(palavra)-1;
          for(i=0;i<=cntletras;i++)
          iascii += palavra[i];
          index = iascii % tamHash;
          ok=1;
        }
        else 
        {
          if(c=='+' || c=='-' || c=='*' || c=='/' || c=='=' || c=='>' || c=='<' || c==';' || c==',' ||
             c==':' || c=='(' || c==')' || c=='.')
          {
            temp=c;
            coluna++;
            ok=1;
          }
          else {
            palavra[m]=c;
            coluna++;
            m++;
          }
        }
      }
      
      



    if(ok==1 && palavra!="" && c!=EOF) {
    do {
    //verifica se é literal flutuante
    if(lf==1) {
      t[n]->classe=4;
    }
    else {
    //verifica se é simbolo especial
    if(!strcmp(palavra,"(") || !strcmp(palavra,")") || !strcmp(palavra,",") ||
       !strcmp(palavra,";") || !strcmp(palavra,":") || !strcmp(palavra,".") ||
       (palavra[0]=='"' && palavra[1]=='')) t[n]->classe=6;
    else {
    
    //verifica se é operador
    if(!strcmp(palavra,"+") || !strcmp(palavra,"-") || !strcmp(palavra,"*") ||
       !strcmp(palavra,"/") || !strcmp(palavra,"=") || !strcmp(palavra,":=") ||
       !strcmp(palavra,">") || !strcmp(palavra,"<") || !strcmp(palavra,">=") ||
       !strcmp(palavra,"<=") || !strcmp(palavra,"<>")) t[n]->classe=5; 
    else {

    //verifica se é palavra reservada (classe 1)
    int a=checa_pr(palavra);
    if(a==1) t[n]->classe=1;
    else {
    //verifica se é literal inteiro
    
    
    for(i=0;i<15 && palavra[i]!='';++i)
      if(palavra[i]=='0' || palavra[i]=='1' || palavra[i]=='2' || 
         palavra[i]=='3' || palavra[i]=='4' || palavra[i]=='5' || 
         palavra[i]=='6' || palavra[i]=='7' || palavra[i]=='8' || 
         palavra[i]=='9') li++;
    if(li==i) t[n]->classe=3;
    else {
      if(palavra[0]!='')
        t[n]->classe=2;
        
    } } } } }
    
    if(t[n]->classe==3 && temp=='.') { ok=0; lf=1; palavra[m]=c; coluna++; m++; temp=''; sair=1; break; }
    else {
    if(!strcmp(palavra,".")) {
      teste=fgetc(entrada);
      if(teste==EOF) { t[n]->classe=8; }
      else { /*palavra[m]=teste; m++; coluna++; sair=1; break;*/ }
    }
    
    if(!strcmp(palavra,":") || !strcmp(palavra,">") || !strcmp(palavra,"<")) {
      palavra[1]=fgetc(entrada);
    }
    else{
        int classe=t[n]->classe;
        strcpy(t[n]->valor,palavra);      
        t[n]->linha=linha;
        t[n]->coluna=coluna;
        fputs(t[n]->valor,saida);
        ok=0;
        m=0;
        li=0;
        lf=0;
        if(sair==0)
        {  
          n++;
          t[n]=(Ttoken*)malloc(1*sizeof(Ttoken));
        }
        for(i=0;i<15;i++)
          palavra[i]='';
    
         
        switch(classe)
        { 
          case 1: 
          {  fputs(" é PALAVRA RESERVADA\n",saida); break; }
          case 2:
          {  fputs(" é IDENTIFICADOR\n",saida); break; }
          case 3:
          {  fputs(" é LITERAL INTEIRO\n",saida); break; }
          case 4:
          {  fputs(" é LITERAL FLUTUANTE\n",saida); break; }
          case 5:
          {  fputs(" é OPERADORES\n",saida); break; }
          case 6:
          {  fputs(" é SIMBOLO ESPECIAL\n",saida); break; }
          case 8:
          {  fputs(" é FIM\n",saida); break; }
          default: 
          { break; }
        }


//        insereInicio(l);



        
        palavra[0]=temp;
        temp='';
    }
    
}
    }while(palavra[0]!='' && palavra!="" && palavra!=" " && sair==0);
    }
    } while(c!=EOF);
    fclose(entrada);
    fclose(saida);
    system("PAUSE");


    
}

Editado por RenatoMejias
Adicionar CODE
Link para o comentário
Compartilhar em outros sites

  • 0

Cara você vai ter que aprender ponteiros... não estou querendo por pilha mas no C uma string e a mesma coisa de ponteiro. Pelo que eu conheço não existe strings estáticas como em outras linguagens. No seu próprio main tem a **argv que é uma string de ponteiros para string ou seja ponteiros não há como (pelo que conheço) capturar uma string na linha de comando (com argv) sem ponteiro. Tenta aprender é bastante vantajoso. Se tiver dúvidas posta aí.

p.s Eu não consegui resolver seu caso mas deve haver uma solução que não conheço. Você é que decide.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...