Jump to content
Fórum Script Brasil
  • 0

Ler/Gravar um arquivo.txt


Question

Galera to aprendendo c++ ainda, to com uma duvida na parte de criar um arquivo.txt para gravar e ler informações a partir dele, pois quero fazer um programa, mas quero que quando abra o programa novamente, as informações passadas não sejam perdidas.

Obrigado :rolleyes:

Link to post
Share on other sites

23 answers to this question

Recommended Posts

  • 0
de uma olhada nas funcoes fopen(), fprintf() e fscanf():

http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

http://www.cplusplus.com/reference/clibrary/cstdio/fprintf/

http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

algumas funcoes q aparecem no pe dessas paginas ai tb podem ajudar.

Ok, deu pra ter uma ideia de como usar, aproveitando que voce mencionou, qual a diferença de mandar um "cout<<" e um "printf" ?

Link to post
Share on other sites
  • 0

o printf() era a funcao q existia em c pra escrever na tela, e ai quando saiu o c++, veio o cout, q é mais facil de usar.

se você trabalha com c++, acho q seria recomendavel usar o sempre cout, já q o printf() é uma funcao mais antiga.

entretanto, li por ai q dependendo do caso o printf pode ser mais recomendado, mas se você ta iniciando, é melhor não se preocupar com isso por enquanto.

Link to post
Share on other sites
  • 0

Tava tentando aqui com o seguinte codigo:

#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ofstream myfile ("example.txt");
  if (myfile.is_open())
  {
    myfile << "This is a line.\n";
    myfile << "This is another line.\n";
    myfile.close();
  }
  else cout << "Unable to open file";
  return 0;
}

Mas está dando erro na linha: ofstream myfile ("example.txt");

Link to post
Share on other sites
  • 0

Compilou agora, erro meu, eu tava colocando pra compilar e o destino do executavel ser numa pasta "Nova Pasta" dai tirei o espaço entre nova e pasta e deu certo.

Mas to com uma duvida ainda sobre isso de arquivo, tudo bem os comandos de ler e gravar to conseguindo, o programa que to tentando fazer é so pra organizar umas coisas, como por exemplo tiver uns produtos e o codigo do produto e a quantidade disponivel e uma opção pra modificar e adicionar produto, dai queria que gravasse no arquivo para quando quiser ler a partir do programa aparecer mais ou menos assim:

Produto Codigo Quantidade

Mas não sei como fazer essa parte pra salvar e ler do arquivo, to parado no IF. Vo colocar o codigo abaixo pra voce ter uma ideia de onde parei, é um programa simples so pra treinar mesmo mas so to vendo c++ a pouco tempo.

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    
    int resp;
    while (resp != 0)
    {
          cout<<"*************************************************"<<endl;
          cout<<"*            PROGRAMA TESTE PRODUTOS            *"<<endl;
          cout<<"*************************************************"<<endl<<endl;
          cout<<"Escolha uma das opcoes:"<<endl<<endl;
          cout<<"1 - Listar produtos"<<endl;
          cout<<"2 - Adicionar um produto"<<endl;
          cout<<"3 - Editar um produto"<<endl;
          cout<<"0 - Sair"<<endl<<endl;
          cin>>resp;
          if (resp == 1)
          {
                   
                   
                   }
          }
    system("PAUSE");
    return EXIT_SUCCESS;)*/
}

Link to post
Share on other sites
  • 0

sahad, olha o link q eu passei. esse codigo aqui tem tudo o q você precisa pra ler o arquivo:

// reading a text file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
  string line;
  ifstream myfile ("example.txt");
  if (myfile.is_open())
  {
    while (! myfile.eof() )
    {
      getline (myfile,line);
      cout << line << endl;
    }
    myfile.close();
  }

  else cout << "Unable to open file";

  return 0;
}[/code] enquanto esse outro tem tudo o q você precisa pra escrever nele:
[code]// writing on a text file
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ofstream myfile ("example.txt");
  if (myfile.is_open())
  {
    myfile << "This is a line.\n";
    myfile << "This is another line.\n";
    myfile.close();
  }
  else cout << "Unable to open file";
  return 0;
}

em q parte disso tudo exatamente você esta tendo dificuldade??

você ta conseguindo entender esses exemplos??

Link to post
Share on other sites
  • 0

Entendi sim o funcionamento, so que tem 1 problema, nesse segundo eu gostaria de pedir para o usuario no caso digitar o que ele quer que seja adicionado no arquivo, do jeito que está ai o proprio programa irá colocar essas duas linhas no .txt.

Estava vendo em algumas apostilas outras formas e achei uma, so que está dando erro na seguinte linha:

O "Case 2" e "Case 3" ainda não fiz.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{
    int resp;
    inicio:
    system("cls");
    cout<<"*************************************************"<<endl;
    cout<<"*         ORGANIZADOR DE PRODUTOS         *"<<endl;
    cout<<"*************************************************"<<endl<<endl;
    cout<<"Escolha uma das opcoes:"<<endl<<endl;
    cout<<"1 - Listar produtos"<<endl;
    cout<<"2 - Adicionar um produto"<<endl;
    cout<<"3 - Editar um produto"<<endl;
    cout<<"0 - Sair"<<endl<<endl;
    switch(resp) {
    
    case 0:
    exit(0);
    break;
    
    case 1:
    cout<<"\n\nLista de produtos"<<endl;
    fstream produtos;
    produtos.open ("series.txt", ios::in)
    produtos.close();     // Ta dando erro nessa linha!
    goto inicio;
    break;

    case 2:
    cout<<"\n\nAdicionar um produto"<<endl;
    getch();
    goto inicio;
    break;

    case 3:
    cout<<"\n\nEditar um produto"<<endl;
    getch();
    goto inicio;
    break;
    
    system("PAUSE");
    return EXIT_SUCCESS;)*/
}

Edited by Sahad
Link to post
Share on other sites
  • 0

então, é so você imprimir a variavel onde ele digitou dentro do arquivo da mesma forma q o texto esta sendo impresso;

aqui ta um exemplo:

#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ofstream myfile ("example.txt");
  if (myfile.is_open())
  {
    char c[30];
  
    cin >> c;
  
    myfile << c; //Aqui copia o texto q ele digitou pra dentro do arquivo.
    myfile.close();
  }
  else cout << "Unable to open file";
  return 0;
}[/code]

EDITADO:

e a mensagem de erro deve ser porque faltou um ponto e virgula na linha de cima.

Edited by kuroi
Link to post
Share on other sites
  • 0

Fiz o teste, até certo ponto, compilou OK so que quando vou rodar ele abre e fexa o programa na mesma hora.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{
    int resp;
    inicio:
    system("cls");
    cout<<"*************************************************"<<endl;
    cout<<"*         ORGANIZADOR DE PRODUTOS         *"<<endl;
    cout<<"*************************************************"<<endl<<endl;
    cout<<"Escolha uma das opcoes:"<<endl<<endl;
    cout<<"1 - Listar produtos"<<endl;
    cout<<"2 - Adicionar um produto"<<endl;
    cout<<"3 - Editar um produto"<<endl;
    cout<<"0 - Sair"<<endl<<endl;
    switch(resp) 
{
    
    case 0:
    exit(0);
    break;
    
    case 2:
    cout<<"\n\nLista de produtos"<<endl;
    ofstream myfile ("produtos.txt");
    if (myfile.is_open())
    {
    char c[30];
  
    cin >> c;
  
    myfile << c; 
    myfile.close();
    }
    else cout << "Unable to open file";
    goto inicio;
    break;

    system("PAUSE");
    return EXIT_SUCCESS;
}
}

Link to post
Share on other sites
  • 0

Sim faltava isso, erro meu, pronto consegui está gravando no arquivo, mas se eu gravo tipo "produto" dai fecho o programa, abro denovo e gravo "produto2" dai ele apaga o "produto" e coloca "produto2". Ai está declarado um char, tentei colocar string pois quero colocar mais dados assim como numeros.

Aí está so o case como ficou:

case 2:
    cout<<endl<<"Adicionar um produto"<<endl
                           <<"Digite como no exemplo: Produto 5512 15"<<endl;
    ofstream myfile ("data.txt");
    if (myfile.is_open())
    {
    char pData[40];
  
    cin >> pData;
  
    myfile << pData;
    myfile.close();
    }
    else cout << "Unable to open file";
    goto inicio;
    break;

Link to post
Share on other sites
  • 0

Aí está o codigo e os erros que ocorreram quando coloquei:

ofstream myfile ("data.txt", ios::out | ios::app);
Codigo Inteiro:
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{
    int resp;
    inicio:
    system("cls");
    cout<<"*************************************************"<<endl;
    cout<<"*         ORGANIZADOR DE PRODUTOS         *"<<endl;
    cout<<"*************************************************"<<endl<<endl;
    cout<<"1 - Listar produtos"<<endl;
    cout<<"2 - Adicionar um produto"<<endl;
    cout<<"3 - Editar um produto"<<endl;
    cout<<"0 - Sair"<<endl<<endl;
    cout<<"Escolha uma das opcoes: ";
    cin>>resp;
    switch(resp) 
{
    
    case 0:
    exit(0);
    break;
    
    case 1:
    cout << "Lista de produtos" << endl << endl;
    ofstream myfile ("data.txt", ios::out | ios::app); // LINHA 31
    goto inicio;
    break;
    
    case 2: // LINHA 35
    cout << endl << "Adicionar um produto" << endl
                           <<"Digite como no exemplo: Produto 5512 15"<<endl;
    ofstream myfile ("data.txt"); // LINHA 38
    if (myfile.is_open())
    {
    char pData[40];
  
    cin >> pData;
  
    myfile << pData;
    myfile.close();
    }
    else cout << "Unable to open file";
    goto inicio;
    break;

    system("PAUSE");
    return EXIT_SUCCESS;
}
}

Erros:

C:\Dev-Cpp\projeto_series.cpp In function `int main(int, char**)':

35 C:\Dev-Cpp\projeto_series.cpp jump to case label

31 C:\Dev-Cpp\projeto_series.cpp crosses initialization of `std::ofstream myfile'

38 C:\Dev-Cpp\projeto_series.cpp redeclaration of `std::ofstream myfile'

31 C:\Dev-Cpp\projeto_series.cpp `std::ofstream myfile' previously declared here

35 C:\Dev-Cpp\projeto_series.cpp [Warning] destructor needed for `myfile'

35 C:\Dev-Cpp\projeto_series.cpp [Warning] where case label appears here

35 C:\Dev-Cpp\projeto_series.cpp [Warning] (enclose actions of previous case statements requiring destructors in their own scope.)

C:\Dev-Cpp\Makefile.win [build Error] [../Users/Raiff/Desktop/projeto_series/projeto_series.o] Error 1

Link to post
Share on other sites
  • 0

isso ai é porque você ta declarando o myfile duas vezes. uma vez no case 1 e outra vez no case 2.

você pode adicionar umas chaves pra separar a declaracao dos dois objetos, assim você restringe o alcance deles e não vai ter conflito. tipo assim:

case 1:
{
    cout << "Lista de produtos" << endl << endl;
    ofstream myfile ("data.txt", ios::out | ios::app); // LINHA 31
    goto inicio;
}
break;

case 2: // LINHA 35
{
    cout << endl << "Adicionar um produto" << endl
                       <<"Digite como no exemplo: Produto 5512 15"<<endl;
    ofstream myfile ("data.txt"); // LINHA 38
    if (myfile.is_open())
    {
    char pData[40];

    cin >> pData;

    myfile << pData;
    myfile.close();
    }
    else cout << "Unable to open file";
    goto inicio;
}
break;[/code]

a e tb o ios::out | ios::app de q eu falei era pra por la embaxo quando você abre o arquivo no case 2. esses dois flags significam q você ta abrindo o arquivo pra output e append (pra escrever dentro dele, q é exatamente o q faz o case 2). e se você fizer isso no case 1, você tb não deve conseguir ler os dados.

Edited by kuroi
Link to post
Share on other sites
  • 0

Agora compilou sem erros, mas esse listar não esta saindo bem, eu abro o programa, coloco a opção 2, adiciono um nome, volto pro menu, escolho a opção 1( listar) dai ele tava listando e voltando pro menu na mesmo hora, coloquei um getch(); dai ele n volta pro menu ate apertar 1 tecla, mas não ta listando. Fica assim a tela abaixo das opções:

Lista de produtos
_

O "_" coloquei simbolizando ele piscando. Ou seja não está aparecendo o que foi digitado e gravado no arquivo.

Link to post
Share on other sites
  • 0

mas como ta o seu codigo pra listar os produtos??

esse aqui não vai listar nd mesmo:

case 1:
    cout << "Lista de produtos" << endl << endl;
    ofstream myfile ("data.txt", ios::out | ios::app); // LINHA 31
    goto inicio;[/code]

olha la o codigo de exemplo, você devia dar usar o getline() pra pegar as linhas e depois um cout pra escrever na tela.

a e no caso, pra ler o arquivo, não é pra ser ofstream e sim ifstream. ofstream é so pra escrever no arquivo.

Link to post
Share on other sites
  • 0

Não teria outra forma de salvar os dados sem ser os colocando em um arquivo .txt?

Pois é mais complicado que apenas escrever 1 linha e ler, seria varias linhas escritas com nomes e numeros, daí teria que ler todas as linhas para colocar na tela, e quando fosse editar, qual seria a ideia? tipo, supor que estaria assim:

PRODUTO CODIGO QUANTIDADE

produtoxyw 14215325 10
produtoy 09352 25
produtozy 1421 05

Dai como faria pra editar o codigo e/ou a quantidade? Qual seria a outra alternativa para salvar essas informações? :wacko:

Link to post
Share on other sites
  • 0
Não teria outra forma de salvar os dados sem ser os colocando em um arquivo .txt?

teria, você pode usar banco de dados. mas qual seria o objetivo?? você ta tentando so estudar c++ ou ta pretendendo criar um sistema mesmo??

Dai como faria pra editar o codigo e/ou a quantidade? Qual seria a outra alternativa para salvar essas informações? :wacko:

o q você teria q fazer seria procurar o registro dentro do txt baseado no codigo, e ai, no meu modo de ver, você teria q reescrever o txt inteiro, copiando todas as linhas e, na hora de escrever essa linha q ele editou, em vez de copiar a q esta no txt você grava os dados q ele digitou.

Link to post
Share on other sites
  • 0

É mais pra estudar e tambem pra fazer um programa que seria util ate aqui, não de produtos, mas a mesma ideia. Vou continuar vendo as apostilas aqui, e para esse caso vou pequisar pois não sei nada ainda sobre banco de dados. Valeu pela ajuda :)

Link to post
Share on other sites
  • 0
Em 03/03/2010 at 01:04, Sahad disse:

Galera to aprendendo c++ ainda, to com uma duvida na parte de criar um arquivo.txt para gravar e ler informações a partir dele, pois quero fazer um programa, mas quero que quando abra o programa novamente, as informações passadas não sejam perdidas.

 

Obrigado :rolleyes:

Fiz esse código para aula de C++ onde faço que você disse que precisa. espero que ajude a expandir suas possibilidades.

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<cstdio>
#include<conio.h>
#define PATH_ARQUIVO "C:\\Aula_Arquivos\\produtos.txt"

using namespace std;

struct Produto
{
    int Codigo;
    char Nome[50];
    float preço;
    int Ativo;
};

int recuperarOpcao();
void montarMenu();
void cadastrarProduto();
void listarTodos();
void editaProduto();
void contarProdutos();
void excluir();

int main()
{
    int op;
    
    do
    {
        montarMenu();
        op = recuperarOpcao();
        
        switch(op)
        {
            case 1:
                cadastrarProduto();
            break;
            
            case 2:
                listarTodos();
            break;            
            
            case 3:
                editaProduto();
            break;
            
            case 4:
                excluir();
            break;
            
            case 5:
                contarProdutos();
            break;
            
            case 6:
                return 1;
            break;
            default:
                cout << "Opcao invalida.";
            break;
        }
    
        cout << "\n\nPressione ESC para sair.";
    }
    while(getch() != 27);
    
    return 1;
}

int recuperarOpcao()
{
    int opcao;
    cout << "Digite sua opcao: ";
    cin  >> opcao;
    cin.ignore();
    return opcao;
}

void montarMenu()
{
    system("CLS");
    cout << "..:: Cadastro de Produtos ::.."
         << "\n\n1 - Cadastrar"
         << "\n2 - Listar todos"
         << "\n3 - Editar"
         << "\n4 - Excluir"
         << "\n5 - Contar Produtos"
         << "\n6 - Sair\n\n";
}

void contarProdutos()
{
    fstream arq;
    arq.open(PATH_ARQUIVO, ios::in | ios::app | ios::binary);
    arq.seekg(0, ios::end);
    
    double tamanhoArquivo;
    tamanhoArquivo = arq.tellg();
    
    int qtdProdutos;
    qtdProdutos = tamanhoArquivo / sizeof(Produto);
    
    system("CLS");
    cout << "..:: Contagem de Produtos ::..\n\n";
    cout << "Nosso arquivo contem " << qtdProdutos << " produtos.";
    
    arq.close();
}

void listarTodos()
{
    system("CLS");
    cout << "..:: Produtos Cadastrados ::..\n";
    
    fstream arq;
    arq.open(PATH_ARQUIVO, ios::in | ios::app | ios::binary);
    arq.seekg(0, ios::beg);
    
    Produto prod;
    
    while(arq.read((char*)&prod, sizeof(Produto)))
    {
        if(prod.Ativo == 1)
        {
            cout << "\nCodigo: " << prod.Codigo;
            cout << "\nNome: " << prod.Nome;
            cout << "\nPreco: " << prod.preço << "\n";
        }
    }
    
    arq.close();
}

void cadastrarProduto()
{
    Produto prod;
    system("CLS");
    cout << "..:: Cadastrar um Produto ::..";
    
    cout << "\n\nDigite o codigo: ";
    cin  >> prod.Codigo;
    cin.ignore();
    
    cout << "Digite o nome: ";
    gets(prod.Nome);
    
    cout << "Digite o preço: ";
    cin  >> prod.preço;
    cin.ignore();
    
    prod.Ativo = 1;
    
    fstream arq;
    arq.open(PATH_ARQUIVO, ios::out | ios::app | ios::binary);
    arq.seekp(0, ios::end);
    arq.write((char*)&prod, sizeof(Produto));
    arq.flush();
    arq.close();
}

void editaProduto()  //
{
    system("CLS");
    cout << "..:: Editar um Produto ::..\n\n";
    //
    int codEdit, posRegistro = -1, contador = 0;
    Produto prod;
    
    cout << "Digite o codigo a ser editado: ";
    cin  >> codEdit;
    cin.ignore();
    
    ifstream fin(PATH_ARQUIVO, ios::binary);
    fin.seekg(0, ios::beg);
    
    while(fin.read((char*)&prod, sizeof(Produto)))
    {
        if(prod.Codigo == codEdit && prod.Ativo == 1)
        {
            cout << "\nProduto a ser editado\n";
            
            cout << "\nCodigo: " << prod.Codigo;
            //cin  >> (prod.Codigo = -1);
            
            cout << "\nNome: " << prod.Nome << "\n";
            cin  >> prod.Nome;
            cin.ignore();
            
            cout << "\nPreco: " << prod.preço << "\n";
            cin  >> prod.preço;
            cin.ignore();
            
            posRegistro = contador;
            break;
        }
        
        contador++;
    }
    
    fin.close();
    
    if(posRegistro > -1)
    {
        char confirma;
        cout << "\nConfirma a edicao do iten? (s/n): ";
        cin  >> confirma;
        cin.ignore();
        
        if(confirma == 'S' || confirma == 's')
        {
            fstream fout(PATH_ARQUIVO, ios::in | ios::out | ios::binary);
            
            fout.seekp(posRegistro * sizeof(Produto), ios::beg);
            fout.write((char*)&prod, sizeof(Produto));
            fout.flush();
            fout.close();
        }
    }
    else
    {
        cout << "Produto não localizado.";
    }
    //
}

void excluir()
{
    system("CLS");
    cout << "..:: Excluir Produtos ::..\n";
    
    int codExcluir, posRegistro = -1, contador = 0;
    Produto prod;
    
    cout << "\nDigite o codigo a ser excluido: ";
    cin  >> codExcluir;
    cin.ignore();
    
    ifstream fin(PATH_ARQUIVO, ios::binary);
    fin.seekg(0, ios::beg);
    
    while(fin.read((char*)&prod, sizeof(Produto)))
    {
        if(prod.Codigo == codExcluir && prod.Ativo == 1)
        {
            cout << "\nProduto a ser excluido\n";
            cout << "\nCodigo: " << prod.Codigo;
            cout << "\nNome: " << prod.Nome;
            cout << "\nPreco: " << prod.preço << "\n";
            posRegistro = contador;
            break;
        }
        
        contador++;
    }
    
    fin.close();
    
    if(posRegistro > -1)
    {
        char confirma;
        cout << "\nDeseja realmente excluir (s/n): ";
        cin  >> confirma;
        cin.ignore();
        
        if(confirma == 'S' || confirma == 's')
        {
            fstream fout(PATH_ARQUIVO, ios::in | ios::out | ios::binary);
            
            prod.Ativo = 0;
            
            fout.seekp(posRegistro * sizeof(Produto), ios::beg);
            fout.write((char*)&prod, sizeof(Produto));
            fout.flush();
            fout.close();
        }
    }
    else
    {
        cout << "Produto não localizado.";
    }
}

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      149296
    • Total Posts
      645693
×
×
  • Create New...