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

Ler/Gravar um arquivo.txt


Sahad

Pergunta

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 para o comentário
Compartilhar em outros sites

23 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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;)*/
}

Editado por Sahad
Link para o comentário
Compartilhar em outros 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.

Editado por kuroi
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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.

Editado por kuroi
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...