FILE function in C

Asked

Viewed 83 times

0

what needs to be done: develop an algorithm where calculates from file input values . txt or values entered by the user, a value in percentage that is outside the allowed, in case +-3 for all cases, where the program performs a media and compares value by value if it is inside or outside the expected, which it should, show the result in percentage of what was not expected;

So far, I’ve accomplished this:

#include<stdio.h>
#include<string.h>
int main(void)
{
//decalara entrada de file.txt
float file_ent[]={0};
//declara saida de file.txt 
float saida;

// declara entrada de temperatura 
float vetor[15000]={0};
//declara contador e entrada de menu
int ent, ent_aux, cont,/* cont_aux,*/ cont_ex /*, cont_out*/;
//declara saida onde apresenta resultado obtido
float ex, cont_out, cont_aux,media;
//variaveis para log-in
int num_key;

//cabecalho inicial insercao de senha
do
{
    puts("\n\n\t*********************************************");
    puts("\t*                                           *");
    puts("\t*     Calculador de temperatura             *");
    puts("\t*                                           *");
    puts("\t*                                           *");
    puts("\t*                                           *");
    puts("\t*          DIGITE SUA SENHA                 *");
    puts("\t*                                           *");
    puts("\t*                                           *");
    puts("\t*                                           *");
    puts("\t*  DIGITE 0 PARA SAIR                       *");
    puts("\t*********************************************");
    scanf("%i",&num_key);
    if(num_key == 0)
    {
        return 0;
    }
    if (num_key!= 123456)
    {
        printf(" TENTE NOVAMENTE ");
    }


}while(num_key!=123456);

//cabecalho de escolha de entrada de arquivo ou digitacao
do
{
    puts("\n\n\t*********************************************");
    puts("\t*                                           *");
    puts("\t*     Calculador de temperatura             *");
    puts("\t*                                           *");
    puts("\t*                                           *");
    puts("\t*                                           *");
    puts("\t*       Escolha entre importar o arquivo    *");
    puts("\t* ou digitar manualmente os valores, caso   *");
    puts("\t* digite 1 (SIM) para importar e 0 (NAO)    *");
    puts("\t* para nao importar o arquivo.              *");
    puts("\t*                                           *");
    puts("\t*                                           *");
    puts("\t*     Lembrando que o arquivo deve estar    *");
    puts("\t* nomeado como \"entrada.txt\"                *");
    puts("\t*                                           *");
    puts("\t*                                           *");
    puts("\t*  DIGITE 0 PARA SAIR                       *");
    puts("\t*********************************************");
    scanf("%i",&num_key);

    // importar o arquivo para o programa
    if(num_key == 1)
    {
        printf(" VOCE OPTOU POR IMPORTAR O ARQUIVO ");

        FILE *file_ent;
        file_ent = fopen("entrada.txt", "r");
        for(cont=0;file_ent != NOF; cont++)
        {
            fscanf("%f",&file_ent);
        }
    }

    // nao importar e digitar manualmente
    if (num_key== 0)
    {

    }

    // caso nao 1 e caso nao 0
    if((num_key!=1) && (num_key!=0))
    {
        printf(" ***  OPCAO INVALIDA  ***");
    }


}while((num_key!=1) && (num_key!=0));



do
{
//cabecalho
puts("\n\n\t*********************************************");
puts("\t*                                           *");
puts("\t*     Calculador de temperatura             *");
puts("\t*                                           *");
puts("\t*        Calculador de temperatura          *");
puts("\t* mostrando somente a porcentagem de desvio *");
puts("\t*                                           *");
puts("\t* SELECIONE UMA OPCAO DESEJADA:             *");
puts("\t*                                           *");
puts("\t* 1           3 graus celcius               *");
puts("\t* 2          -3 graus celcius               *");
puts("\t* 3          -5 graus celcius               *");
puts("\t* 4          -8 graus celcius               *");
puts("\t* 5         -12 graus celcius               *");
puts("\t* 6         -15 graus celcius               *");
puts("\t* 7         -18 graus celcius               *");
puts("\t*                                           *");
puts("\t*                                           *");
puts("\t* Digite 66 para sair                       *");
puts("\t*                                           *");
puts("\t*                                           *");
puts("\t*  Caso erre algum valor no meio digite 999 *");
puts("\t*  onde abrira alguma opcoes para alterar o *");
puts("\t*   que voce errou. Apenas siga os passos   *");
puts("\t*                                           *");
puts("\t* Selecione uma opcao:                      *");
puts("\t*********************************************");

//le valor digitado e atribui a ent
scanf("%i",&ent);
//se ent == 0 programa finaliza
if(ent==66)
{
    return 0;
}

// se entrada for numeros de 1 a 7 entra no codigo
if((ent==1)||(ent==2)||(ent==3)||(ent==4)||(ent==5)||(ent==6)||(ent==7))
{           
//mostar opcao selecionada  
printf("\nVOCE SELECIONOU A OPCAO: %i\n\n",ent);

/*
laço for onde cont menor ou igual a 15000
ele repete ate o contador atingir valor desejado
*/

for (cont; cont<=15000;cont++)
{
    printf("Digite os valores de temperaturas desejadas: ");
    printf(" INDICIE: %i :   ",cont);
    cont_aux=cont;
    cont_ex=cont;       
    ex=ex+cont;                     

    /*
    le os valores do usuario e atribui ao vetor na variavel 
    escolhida pelo contador (cont)

    juntamente compara se for zero cai fora da operacao dando fim ao algoritmo

    caso o usuario tenha digitado algum valor errado
    ele podera alterar este valor e corrigir 
    conforme sua necessidade
    */

    scanf("%f",&vetor[cont]);
    if(vetor[cont]==66)
    {
        cont--;
        break;
    }   
    if(vetor[cont]==999)
    {
    // cabeçalho correcao de valor por indicie
    puts("\n\n\t***********************************************");
    puts("\t*             -- ATENCAO --                   *");
    puts("\t*    Neste momento voce pode altar algum      *");
    puts("\t* valor que foi digitado errado, preste       *");
    puts("\t* muita atencao no indicie do valor desejado  *");
    puts("\t* e siga os passos para que possamos auxuliar *");
    puts("\t* na correcao do mesmo                        *");
    puts("\t*                                             *");
    puts("\t*                                             *");
    puts("\t*                                             *");
    puts("\t*                                             *");
    puts("\t*     Digite o valor do indicie desejado:     *");
    puts("\t*                                             *");
    puts("\t* Digite 66 para sair                         *");
    puts("\t***********************************************");              
    // le entrada
    scanf("%i",&cont);
    printf("  Voce digitou o indicie: %i",cont);
    printf("  Digite o novo valor para este indicie: ");
    //le o indicie do valor errado
    scanf("%i",&vetor[cont]);
    printf("\n\t *** CONTINUANDO ***\n");
    //contador principal recebe ultimo contador armazenado por auxiliar
    cont=cont_aux;  
    /*
    decrementa em 1 o contador para repor o valor aonde foi digitado 
    o numero magico para alterar o valor errado e continuar de onde parou
    */
    cont--;                             
    }       
    if (vetor[cont]==66)
    {
        cont=15002;
    }           
}
//cabecalho de entrada de temperatura
puts("\n\n\t***********************************************");
puts("\t*                                             *");
puts("\t*     Apos digitar todos os valores desejados *");
puts("\t* vamos prosseguir com mais alguns passos     *");
puts("\t*     Primeiramente voce devera entrar com o  *");
puts("\t* valor da temperatura em questao que deseja  *");
puts("\t* calcular.                                   *");
puts("\t*                                             *");
puts("\t*     Digite a temperatura desejada           *");
puts("\t*                                             *");
puts("\t* Digite 66 para sair                         *");
puts("\t***********************************************");
scanf("%i",&ent_aux);
/*
para contador de 0 ate auxiliar aque recebe ultimo valor de contador
faça, contador + 1 no laço comparando se os valores do vetor forem maior
ou menor do que 3 acrescenta +1 no contador de saida com objetivo calcular
qual a porcentagem que ficou fora do calculado 
*/
for(cont=0;cont<=cont_aux;cont++)
{
    if((vetor[cont]>(ent_aux-3))&&(vetor[cont]<(ent_aux+3)))
    {
        cont_out++;
    }
    /*else
        {
            cont_out++;
        }*/
}

//calcula resultado
cont_out*100;
ex=cont_out/cont_aux;
ex=ex*100;

/*                      
//calcula media de temperatura
for(cont=0;cont<=cont_aux;cont++)
{
    media=vetor[cont]+media;
}
cont--;
media=media/cont;
media=media/2;
*/

//imprime em tela o resultado final
printf("\n\t\nVOCE OBETEVE: %.2f porcento dentro do esperado\n\n",ex);
//printf("\n\t\nMEDIA DE TEMPERATURA: %.2f",media);
}

// caso a entrada nao seja um valor de 1 a 7 imprime mensagem   
else
{
    printf ("\n\n\tValor invalido!\n\n");
}

//zera os valores dos contadores a cada fim de programa
cont=0;
cont_aux=0;
cont_out=0;

}while (ent!=66);
return 0;
}   

As far as my knowledge was concerned I did a good part, just need that in a few moments the user enters with certain values, and in others he can import a file . txt with "input.txt" name and at the end of the calculation return "output.txt" with the final result and in some moments, it can enter values manually.

Up to a point I tried declaring a FILE but I don’t quite know how it does, and finally it didn’t work! I ask you to help me and explain how to proceed.

1 answer

0

Friend, your doubt is not very precise about your problem.

However, taking into consideration your last paragraph, the error contained where you want to import the file into the program is as follows:

  1. Has two equal variable statements file_ent. One being a vector float and another being FILE *.
  2. The function fscanf receives as the 1st argument FILE* and the rest of the parameters are the same as the scanf.
  3. In case you want to check if the FILE* already reached the end of the file should be checked with EOF (which means End-of-file), I also suggest using the function feof() - defined in the header <stdio.h>.

Otherwise, other errors that will appear will be due to previous errors. For example, you probably want to give a scanf in the file and store it in the vector of float, thus, you must indicate which índice do vetor you want to go through referência for the function fscanf.

In addition, its vector of float file_ent is created with size 1, in view of the boot you made and for not containing numbers in the brackets. If you know what the size of the vector is required for this task, put it in the brackets, otherwise you will have to manipulate it as ponteiro and use tools from alocação dinâmica.

  • but in case it can vary the input value, today can be 1000 values tomorrow 15000 never know exactly, and I will make available to an end user the . exe, where neither I nor he can keep changing accordingly, with the input. If we put the EOF in the case, and left the vector with [15000], it would not work?

  • Well, given that you want something dynamic, why not ask the user this size at the time of execution? scanf and the declaration of the vector as file_ent[variavel], being variavel what you will "scan" with the scanf.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.