Ir ao conteúdo
  • Cadastre-se

C++ manipulaçao de dados de um arquivo


Geraldo Carvalho

Posts recomendados

pessoal,tenho uma duvida...

estou com um arquivo .txt com muitos numeros para serem lidos pelo programa e a seguir,esses numeros devem passar separadamente por uma funçao e por final devo criar um novo arquivo .txt com os respectivos resultados da aplicaçao dos numeros na funçao.

consigo ler os numeros do arquivo no compilador,porém eles são apresentados no tipo string, gostaria de saber como posso mudar o tipo desses dados do arquivo de string para float e poder aplicar a funçao a estes numeros..

ate agora so consegui aplicar o ifstream e ver os dados no compilador

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@arfneto e como eu posso aplicar isso ai ao meu código,para considerar cada linha extraida do arquivo como um numero float independente das outras linhas?creio q terei que colocar esses valores em um vetor ne?!

#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
int main()
{
    float y,x;
    int i;
    ifstream arquivoE;
    string linha;
    arquivoE.open("Arq01.txt");
    while(getline(arquivoE,linha)){


        cout<<linha<<endl;
    }
    
}

o cout ta mostrando todos os numeros direitinho,porém estão em forma string ainda.e terei q jogar o valor de cada linha em uma funçao trigonometrica

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

46 minutos atrás, Geraldo Carvalho disse:

e como eu posso aplicar isso ai ao meu código,para considerar cada linha extraida do arquivo como um numero float independente das outras linhas?creio q terei que colocar esses valores em um vetor ne

 

Você ao menos tenteou ler o que está lá nos posts? Eu postei um exemplo, como eu disse, que faz isso de 3 maneiras diferentes, eu acho. E expliquei como funciona. Você leu?

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <math.h>
#include <string>
using namespace std;
using ists = istream_iterator<string>;
using osts = ostream_iterator<string>;

struct filtro
{
    osts saida;
    filtro(osts s) : saida(s){};
    void operator()(string string_x)
    {   const double    PI = 3.1415926536;
        double y = stod(string_x, NULL);
        double x = y * PI / 180.;
        x = x * sin(x) * cos(x);
        *saida = to_string(x);
    };
};  // filtro()

double      f(string); // a propria f(x) = x*sin(x)*cos(x)

void        fase1(string,string);
void        fase2();
void        fase3(string, string);
void        fase4(string, string);

int main(int argc, char** argv)
{
    fase1("entrada.txt","saida1.txt");
    fase2();
    fase3("entrada.txt", "saida2.txt");
    fase4("entrada.txt", "saida3.txt");
    return 0;
};

void fase1(string arquivo_entrada, string arquivo_saida)
{
    ifstream entrada{ arquivo_entrada };
    ofstream saida{ arquivo_saida };
    ists x{ entrada };
    ists fim{};
    osts fx{ saida, "\n" };
    copy(x, fim, fx);
};

void fase2()
{
    const string valores[8]{ "0","30","45","90", "-30","-45","-90","90" };
    for (auto& x : valores)
    {
        cout << "Angulo: " << x << " graus.\tf(x) = " <<
            fixed << f(x) << endl;
    };
}

void fase3(string arquivo_entrada, string arquivo_saida)
{
    ifstream entrada{ arquivo_entrada };
    ofstream saida{ arquivo_saida };
    ists x{ entrada };
    ists fim{};
    osts fx{ saida, "\n" };
    filtro f(fx);
    for_each(x, fim, f);
};

void fase4(string arquivo_entrada, string arquivo_saida)
{
    ifstream entrada{ arquivo_entrada };
    ofstream saida{ arquivo_saida };
    string x;
    entrada >> x;
    while (!entrada.eof())
    {
        saida << to_string(f(x)) << endl;
        entrada >> x;
    };  // while()
    entrada.close();
    saida.close();
};

double      f(string string_x)
{
    const double PI = 3.1415926536;
    double x = stod(string_x, NULL);
    x = x * PI / 180.;
    return (x * sin(x) * cos(x));
};  // f()

// fim

Não leu isso lá? Talvez eu não devesse ter deixado com o botãozinho de conteúdo oculto. É que o post era grande e nem todo mundo lê. E menos ainda lê o código.

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@arfneto eu vi sim,acontece que eu não compreendi muito bem o programa,fiquei em duvida de onde inserir o meu arquivo .txt para o programa poder lê-lo.

ao compilar,deu erro nessa parte:

55 minutos atrás, arfneto disse:

using ists = istream_iterator<string>;

using osts = ostream_iterator<string>;

esta acusando erro devivo o ists e o osts,não sei o porque..

 

e na sua fase 2 você declarou as strings no vetor,no meu caso nao teria como fazer isso pois o rquivo que tenho q abrir os dados tem 500 numeros.(em anexo)

 

desculpe minha ignorância.sou iniciante e estou com bastante dificuldade neste código.

 

Arq01.txt

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

41 minutos atrás, Geraldo Carvalho disse:

e na sua fase 2 você declarou as strings no vetor,no meu caso nao teria como fazer isso pois o rquivo que tenho q abrir os dados tem 500 numeros.(em anexo)

 

Acho que mesmo eu tendo dito você não foi lá ler o texto afinal...

 

E por isso não entendeu. Isso aí é um roteiro de como resolver. Eu não queria postar vários programas porque ninguém lê, não queria postar um programa grande porque ninguém lê. Mas na verdade não fez diferença.

 

O que era a fase 2? 

 

é só um EXEMPLO de como aplicar um filtro num fluxo, vindo nesse caso de um vetor de strings. Eu expliquei antes o que é um filtro. Você leu?

 

E a fase1?

 

A fase1() é um filtro, um EXEMPLO, mas apenas copia da entrada para a saída, mas EM UMA ÚNICA LINHA de programa.

 

E qual era o propósito? Pois é: se você tem um filtro e uma função basta juntar os dois e terá o seu programa:: o filtro é a função

E isso foi o que eu mostrei de outras maneiras nas funções fase3() e fase4()... 🤔
 

41 minutos atrás, Geraldo Carvalho disse:

eu vi sim,acontece que eu não compreendi muito bem o programa,fiquei em duvida de onde inserir o meu arquivo .txt para o programa poder lê-lo

 

Tem certeza de que leu o mesmo texto que eu escrevi?

 

Veja as funções:

void fase3(string arquivo_entrada, string arquivo_saida) ;
void fase4(string arquivo_entrada, string arquivo_saida);

 

E se eu disser pra você que a variável arquivo_entrada é o nome do arquivo de entrada e a variável arquivo_saida é o nome do arquivo de saída vai achar razoável?

 

E essa parte do texto:

image.png.ce4fb1756699cd874a2d2cae04aff719.png
Essa parte em negrito mostra como chamar o programa. E o trecho de código ali mostra o que você perguntou.
 

Citação

 

Se sua dúvida é essa: se seu arquivo se chama "dados.txt" você pode escrever assim


    fase3("dados.txt", "saida1.txt");

ou 


    fase4("dados.txt", "saida2.txt");

Para não gravar um resultado em cima do outro

 

 

 

Como funciona?

 

Leu a parte que vem depois do texto em negrito:
 

image.png.37630d0e829cbdfafe90acffd0ffdc54.png

 

E leu isso, no mesmo lugar:
 

Essa linha 

    filtro f(fx);

declara f como sendo aquela struct, e fx é o parâmetro que vai ser usado para a saída. E a conta fecha: era preciso saber só o filtro --- a função de transformação ---  e o arquivo de saída. Declaramos os dois. E se for preciso usar outro filtro ou outro arquivo de saída no mesmo programa sem problemas: basta declarar outros. Note que um programa sólido precisaria ter mais alguns cuidados. Isso aqui é um exemplo, escrito na hora do café. Mas acho que dá pra ver porque é mais rápido criar modelos com esse tipo de linguagem.

    filtro f(fx);

declara f como sendo aquela struct, e fx é o parâmetro que vai ser usado para a saída. E a conta fecha: era preciso saber só o filtro --- a função de transformação ---  e o arquivo de saída. Declaramos os dois. E se for preciso usar outro filtro ou outro arquivo de saída no mesmo programa sem problemas: basta declarar outros. Note que um programa sólido precisaria ter mais alguns cuidados. Isso aqui é um exemplo, escrito na hora do café. Mas acho que dá pra ver porque é mais rápido criar modelos com esse tipo de linguagem.

 

E a fase4() era outro programa?

image.png.a8082c52f3f80fab1d34c80ea2b0d9ec.png

 

Pois é: resolvendo como eu mostrei na fase3() usa DUAS linhas. Do modo antigo na função fase4() SETE linhas.

 

 

adicionado 5 minutos depois
41 minutos atrás, Geraldo Carvalho disse:

deu erro nessa parte:

 

Sobre isso precisa atualizar as definições de nível de linguagem de seu compilador para algo mais atual

 

-std=c++17 


por exemplo. Seu compilador está em uma geração anterior ao "using". Acho que notou que é como um typedef. Claro que não leu isso também lá no post sobre a sua exata questão com uma extensa discussão e vários exemplos prontos cujo link eu te passei...
 

image.png.95caf1678d7112a424727a4f87d21465.png

 

Ou você coloca essa única linha na configuração de sua máquina e usa o normal de C++ nos últimos anos, ou nota que é apenas um typedef e vai lá e troca onde está por exemplo
 

osts e põe o nome todo... ostream_iterator<string>;

adicionado 7 minutos depois

Se tem alguma dúvida específica poste o trecho de código ou a descrição pra gente ver se dá para escrever de outro modo

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@Geraldo Carvalho     esses comandos não  funcionam no c++98 , precisa ter o c++11 ,  e para esse arquivo seu código poderia ser assim  :

#include <windows.h>
#include <iostream>
#include <fstream>
#include <cmath>
#include <sstream>
#include <cstring>
#include <vector>
#include <conio.h>
using namespace std;
int funcao_Trigonometrica( float,int );
void pausa();
int main()
{
    float y,x,f;
    int i;
    ifstream arquivoE;
    string linha;
    stringstream st;
    vector<float>vet;
    arquivoE.open("Arq01.txt");
    cout<<"o Que esta no Arquivo :  String  e  Float   Espere !   ";
    pausa();
    while(getline(arquivoE,linha))
    {
        for(int j=0; j<linha.size(); j++)
            if(linha[j] == ',')
                linha[j] = '.';
        cout<<"String "<<linha<<"    ";
        st.clear();
        st << linha;
        st>>f;
        vet.push_back( f );
        cout<<"Float "<<f<<endl;
        Sleep( 10 );
    }
    cout<<"\nO Que esta no Vetor :    Espere !    ";
    pausa();
    for(int j=0; j<vet.size(); j++)
    {
        cout<<vet[j]<<endl;
        Sleep( 10 );
    }
    cout<<"\nHum Grafico :    Espere !    ";
    pausa();
    system("cls");
    for(int j=0; j<vet.size(); j++)
        funcao_Trigonometrica( vet[j], j );
    return 8192;
}
int funcao_Trigonometrica(float f,int w)
{
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),(COORD){abs( f ),w+25});
    printf("#",219);
    Sleep( 30 );
}
void pausa()
{
    for(int a=9; a>=0; a--)
    {
        cout<<a<<" ";
        Sleep(500);
        cout<<"\b\b";
    }
    cout<<"\n"<<endl;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@devair1010 na funçao trigonometrica eu preciso obter os resultados dos valores pela expressao f(x)=x*sen(x)*cos(x),e após isso gravar os resultados  obtidos (um resultado por linha) em um novo arquivo (Arq02.txt) a ser criado pelo programa..pode me ajudar nessa parte tambem?

estou tentando colocar um laço for na funçao trigonometrica para calcular a expressao apos a exibiçao do gráfico e após gravar os resultados no novo arquivo.mas esta dando erro!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

59 minutos atrás, Geraldo Carvalho disse:

na funçao trigonometrica eu preciso obter os resultados dos valores pela expressao f(x)=x*sen(x)*cos(x)

 

Essa função não serviu?

double      f(string string_x)
{
    const double PI = 3.1415926536;
    double x = stod(string_x, NULL);
    x = x * PI / 180.;
    return (x * sin(x) * cos(x));
};  // f()

nem essa?

struct filtro
{
    osts saida;
    filtro(osts s) : saida(s){};
    void operator()(string string_x)
    {   const double    PI = 3.1415926536;
        double y = stod(string_x, NULL);
        double x = y * PI / 180.;
        x = x * sin(x) * cos(x);
        *saida = to_string(x);
    };
};  // filtro()

 

59 minutos atrás, Geraldo Carvalho disse:

estou tentando colocar um laço for na funçao trigonometrica para calcular a expressao apos a exibiçao do gráfico e após gravar os resultados no novo arquivo.mas esta dando erro!

 

E nem esse loop?

    ifstream entrada{ arquivo_entrada };
    ofstream saida{ arquivo_saida };
    string x;
    entrada >> x;
    while (!entrada.eof())
    {
        saida << to_string(f(x)) << endl;
        entrada >> x;
    };  // while()
    entrada.close();
    saida.close();

Aí diz: enquanto não acabar a entrada que é, digamos, a entrada, e que vem do arquivo_entrada, você faz o seguinte:

  • grava em saida que é, digamos, o arquivo de saída, cujo nome é arquivo_saida, o resultado da conversão para string, obtido pela função to_string(), o resultado do cálculo da função f() usando o valor x que veio da entrada.

Você não entendeu isso como um loop que pega os dados da entrada e converte usando a função e depois grava na saída em 7 linhas e com esses nomes de variáveis?

 

E nem essas linhas?

    ifstream entrada{ arquivo_entrada };
    ofstream saida{ arquivo_saida };
    ists x{ entrada };
    ists fim{};
    osts fx{ saida, "\n" };
    filtro f(fx);
    for_each(x, fim, f);

que diz para aplicar o filtro f(fx) em todo x que venha do arquivo de entrada?  Sendo que filtro é aquela classe que está descrita acima?

 

A solução convencional é só o que está na fase3(). E tem 7 linhas fora a função que tem 4. Uma mais esperta é a fase4() que tem só duas linhas. E devia ter lido a discussão sobre o porque de escrever assim.

 

Acha que esse programa

#include <fstream>
#include <iostream>
#include <math.h>
#include <string>
using namespace std;

double      f(string); // a propria f(x) = x*sin(x)*cos(x)

int main(int argc, char** argv)
{
    string arquivo_entrada = "arq01.txt";
    string arquivo_saida = "saida.txt";
    ifstream entrada{ arquivo_entrada };
    ofstream saida{ arquivo_saida };
    string x;
    entrada >> x;
    while (!entrada.eof())
    {
        saida << to_string(f(x)) << endl;
        entrada >> x;
    };  // while()
    entrada.close();
    saida.close();
    return 0;
};

double      f(string string_x)
{
    const double PI = 3.1415926536;
    double x = stod(string_x, NULL);
    x = x * PI / 180.;
    return (x * sin(x) * cos(x));
};  // f()
// fim

não é o loop que cria o arquivo de saída usando a função fornecida, lendo os dados do arquivo de entrada?

 

O que você não entendeu? 

Porque não pergunta nada?

 

59 minutos atrás, Geraldo Carvalho disse:

mas esta dando erro!

 

E porque não posta o código para alguém poder ajudar com o tal erro? E porque não diz qual o erro?

adicionado 13 minutos depois
8 horas atrás, devair1010 disse:

vector<float>vet;

 

Devair, não há razão para manter o vetor inteiro na memória se só vai usar um x de cada vez para calcular f(x) e gravar na saída na mesma ordem. Eu não sou o instrutor do curso, mas se eu fosse e um cara viesse com um programa assim ia perder boa parte da nota. Pense bem: e se fosse meio milhão de pontos?
 

Citação


Para que vai manter na memória todos os dados para DEPOIS calcular e gravar um por um na mesma ordem?
 


 

8 horas atrás, devair1010 disse:

printf("#",219);


Que pretende com essa linha? Rodou o programa?

Conseguiu algum resultado positivo com aquele gráfico? Se acompanhou o outro post sobre o mesmo exercício --- o link está acima --- sabe que eles usam 
 

image.png.77af9e7e8d27db3774261a74c1ad763b.png

MatLab e podem plotar o gráfico com eixos, legendas e... um gráfico profissional. Esse tipo de programa não é interativo. O programa lê um texto, gera um arquivo. E eventualmente o gráfico da função, quem sabe em uma folha A3 ou em um arquivo para o banco de imagens.

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@arfneto  eu não consegui compilar esse seu programa ai por conta do erro que eu disse anteriormente nessa parte:

15 horas atrás, Geraldo Carvalho disse:

using ists = istream_iterator<string>;

using osts = ostream_iterator<string>;

o meu compilador ta acusando erro ai nesse ists e osts. e como nao entendo muito bem,não consegui fazer modificaçoes para que funcionasse!

 

1 hora atrás, arfneto disse:

Conseguiu algum resultado positivo com aquele gráfico?

realmente esse grafico não ajuda em nada no programa!

  • Amei 1
Link para o comentário
Compartilhar em outros sites

42 minutos atrás, Geraldo Carvalho disse:

o meu compilador ta acusando erro ai nesse ists e osts. e como nao entendo muito bem,não consegui fazer modificaçoes para que funcionasse!

 

claro que não leu no post a parte em que diz que isso é só um recurso para não ficar escrevendo o nome completo em todas as declarações, já que eu acho ists mais fácil de escrever que  istream_iterator<string>;

 

Entendeu que como @devair1010 disse você deixou seu ambiente configurado para usar a versão da linguagem de 1998, ano em que muitos dos frequentadores do forum aqui sequer haviam nascido? Deve imaginar que a linguagem evoluiu nesses 22 anos

 

Notou que eu disse que basta uma linha na configuração de seu ambiente para mudar isso? A tal -std=C++17, uma única vez para todos os seus programas?

 

Notou que o programa que está acima resolve seu problema, tem o loop que precisa, não tem a cláusula using, ainda tem 7 linhas e a função f(x) ainda tem 4 linhas?

 

adicionado 4 minutos depois
double      f(string string_x)
{
    const double PI = 3.1415926536;
    double x = stod(string_x, NULL);
    x = x * PI / 180.;
    return (x * sin(x) * cos(x));
};  // f()

A função acima

#include <fstream>
#include <iostream>
#include <math.h>
#include <string>
using namespace std;

double      f(string); // a propria f(x) = x*sin(x)*cos(x)

int main(int argc, char** argv)
{
    string arquivo_entrada = "arq01.txt";
    string arquivo_saida = "saida.txt";
    ifstream entrada{ arquivo_entrada };
    ofstream saida{ arquivo_saida };
    string x;
    entrada >> x;
    while (!entrada.eof())
    {
        saida << to_string(f(x)) << endl;
        entrada >> x;
    };  // while()
    entrada.close();
    saida.close();
    return 0;
};

E o programa acima

 

servem de exemplo para o que quer fazer. A função fase3() que eu mostrei é provavelmente mais adequada para os tempos modernos e tem só 2 linhas de processamento.

    filtro f(fx);
    for_each(x, fim, f);

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@arfneto     Olá ,  e nessa Linha :

int funcao_Trigonometrica(float f,int w)
{
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),(COORD){abs( f ),w+25});
    printf("#",219);   <---  Aqui
    Sleep( 30 );
}

eu havia colocado o Caractere 219 para formar os pontos de hum Gráfico , mas  depois usei o # e me pareceu com melhor Apresentação  , e como eu já estava praticamente dormindo em cima da mesa , acabei me esquecendo de deletar esse número 219  .

  e Aquele Gráfico , Realmente não tem nada a ver com o exercício , não , mas é que eu gosto de movimento , e quando vi aqueles números tive huma ideia e resolvi fazer o gráfico usando o scroll up do próprio console  . 

Link para o comentário
Compartilhar em outros sites

14 minutos atrás, devair1010 disse:

Caractere 219 para formar os pontos de hum Gráfico , mas  depois usei o # e me pareceu com melhor Apresentação  , e como eu já estava praticamente dormindo em cima da mesa , acabei me esquecendo de deletar esse número 219

 

:) foi o que eu pensei. Mas sabe que precisaria da codepage certa para escrever aquilo, certo? E o printf() ficou errado. Entendeu que o autor (autores) tem acesso a MatLab então esse gráfico não faria assim um sucesso? E não implementou a função afinal. 

Esse programa não é interativo. Apenas gera o arquivo de saída. Provavelmente ninguém vai ver a tela afinal.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...