Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Daniel92

ifstream e ofstream

Recommended Posts

Eu estou tentando criar um programa com a seguinte logica:


  1.  
  2. O programa pede para o usuario informar um nome de arquivo a ser lido. Minha intenção é que seja um simples arquivo de text.
  3. O programa verifica se existe tal arquivo. Como é um programa basico, ele vai ler o arquivo na mesma pasta.
  4. Se ele existir o programa vai abrir e mostrar o que há escrito nele.
  5. Caso não exista, passaremos para a parte que o usuario irá digitar algo no teclado.
  6. O programa irá pegar os numeros que foram escritos pelo usuario e irá jogalos em um vetor. E irá salvar o vetor no bloco de notas (.txt).
  7. Após isso, o programa irá ordenar os vetores, mostrar na tela e verificar se o usuario gostaria de salvar.

 

O meu grande problema é que eu não consigo fazer a função

leitura.open(nome_arquivo)

ser aceita na compilação, provavelmente algo que falta a escrever.

Em todos exemplos que eu vi, no lugar do 'nome_arquivo' eles colocavam algo fixo como "texto.txt", mas eu queria colocar algo em que o usuario definiria o nome. Alguem pode me dar uma luz?

 

OBS: O programa que eu fiz está assim

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


char letra;
int i,z,y,x=0,j=0,aux,w=0;

int main ()

   {
        string nome_arquivo;     //  * string equivale a um vetor de tamanho indeterminado *
        string palavras;
        string numeros;

        ifstream leitura; // * cria o objeto 'leitura' que é comparavel a uma ferramenta que irá abrir o arquivo de nome informado pelo usuario *
        ofstream escreve; // * objeto que usaremos para escrever no arquivo de nome informado na variavel 'nome_arquivo' *

        cout << "Escreva o nome do arquivo a ser aberto\n" ;
        getline(cin, nome_arquivo); //* le o nome do arquivo a ser lido *

        leitura.open(nome_arquivo); // * o programa abrirá o arquivo de nome informado pelo usuario *


        if(!leitura.is_open( ))  // * verifica se o programa conseguiu abrir o arquivo de nome informado pelo usuario *
        {
        cout<<"Não foi possível abrir arquivo!\n";
        leitura.clear( ); //reseta o objeto leitura
        x=1;
        }

        if(x=0) // * essa função escreve na tela tudo que está contido no arquivo que foi aberto anteriormente *
        {
               while (leitura.get(letra)) {cout << letra;}
               leitura.close();
        }

        if(x=1) 
        {
                printf("Digite algo\n");
                getline(cin, palavras);   // * pega o que o usuario escreveu e salva na string 'palavras' *


                for (i=0, i++, i<40)
                {
                    if(isdigit(palavras(i))    // * verifica se a informação salva na casa 'i' da string 'palavras' é um número * 
                    {
                                           numeros(j) = atoi(palavras(i));  // * joga o numero encontrado na primeira casa livre da string 'numeros' *
                                           j=j+1; // * passa para a proxima casa da string 'numeros' *
                    }
                }


                j=0;
        }

        escreve.open(nome_arquivo,.txt); // * associa o objeto 'escreve' ao nome do arquivo informado *
        while (escreve.get(nome_arquivo,.txt)) {escreve << numeros << "\n";} // * salva a string *
        escreve.close(); // * encerra o objeto escreve (?)*


        while (w=0)   // * ordena os numeros presentes na string 'numeros' * 
        {
              w=1;
              for(i=0,i<=40,i++)
              if numeros[i]<numeros[i+1]
              {
                                        w=0;
                                        aux=numeros[i+1];
                                        numeros[i+1]=numeros[i];
                                        numeros[i]=aux;
              }       

        }        
   }  

 

Muitas coisas ai como o 'using namespace std;' eu não faço minima ideia de como funciona. Para fazer esse programa eu peguei 1 exemplo de ifstream e 1 de ofstream e tentei juntar-los.

 

 

EDIT:

Eu resolvi abandonar o getline e o cout porque sempre dava erro e etc. Como estou mais familiarizado com o scan e print, reconstrui o programa com base neles.

 

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


char letra,nome[20],palavra[30];
int i,z,y,x=0,j=0,aux,w=0;
float numero[30],M;
int main ()

   {

        ifstream leitura; // * cria o objeto 'leitura' que é comparavel a uma ferramenta que irá abrir o arquivo de nome informado pelo usuario *
        ofstream escreve; // * objeto que usaremos para escrever no arquivo de nome informado na variavel 'nome_arquivo' *

        printf("Escreva o nome do arquivo a ser aberto\n");
        scanf("%s", &nome); //* le o nome do arquivo a ser lido *

        leitura.open(nome); // * o programa abrirá o arquivo de nome informado pelo usuario *
        while (leitura.get(letra)) {cout << letra;}

        if(!leitura.is_open( ))  // * verifica se o programa conseguiu abrir o arquivo de nome informado pelo usuario *
        {
                cout<<"Não foi possível abrir arquivo!\n";
                leitura.clear( ); // * reseta o objeto leitura *
                leitura.close();  // * fecha o objeto de leitura *

                printf("Digite algo\n");
                scanf("%s", &palavra);   // * pega o que o usuario escreveu e salva na string 'palavras' *
                M=strlen(palavra);

                while(j<M) // * esse while vai tirar todas as letras do vetor palavra e só deixar os numeros *
                {            
                             if(!isdigit(palavra[j]))   
                              {
                                                         while (j<M)
                                                         {palavra[j]=palavra[j+1]; j+=1;}
                                                         j=0;
                                                         M-=1;
                              }
                              else 
                              j+=1;
                }
                j=0;

                escreve.open(nome); // * associa o objeto 'escreve' ao nome do arquivo informado *
                escreve << palavra; // * ele escreve o vetor palavra no arquivo 'nome'
                escreve.close(); // * encerra o objeto escreve (?)*
                printf(" o que foi escrito no arquivo foi: \n"); 
                j=0;
                printf("%s", palavra);
        }
        system("pause");
        return(0);       
   }  

Ainda falta eu fazer a parte em que ele ordena o vetor e salva.

 

Acho que o programa ta funcionando legal agora, mas eu tenho mais algumas duvidas:

 

Tem como eu fazer o usuario nao necessitar digitar o .txt no final?

Existe como eu configurar a string que o usuario vai informar pra ele salvar tpw assim: 12 13 54 65 767 g f r? Tpw um numero com mais de 1 digito e ir separando por espaço?

E se eu tivesse que fazer usando getline, cout e string ao inves de scanf, printf e char[x]?

Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom:

 

1-) veja sobre strcat;

2-) se for em tempo que o usuario escreve, vai ter q ler caracter por caracter, senaum, da pra fazer isso depois usando isdigit pra saber se é digito.

3-) vamos tentar mudar?

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

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


char letra,nome_arquivo[20],palavra[30],z[30];
int i,y=0,x=0,j=0,aux,w=0;
float numero[30],M;

int main ()

   {
        z[0]='s'; 

        char sf[5]; // * essa variavel serve para que o usuario não precise digitar .txt no final do nome do arquivo *
        sf[0]='.';
        sf[1]='t';
        sf[2]='x';
        sf[3]='t';

        ifstream leitura; // * cria o objeto 'leitura' que é comparavel a uma ferramenta que irá abrir o arquivo de nome informado pelo usuario *
        ofstream escreve; // * objeto que usaremos para escrever no arquivo de nome informado na variavel 'nome_arquivo' *

        printf("Escreva o nome do arquivo a ser aberto\n");
        scanf("%s", &nome_arquivo); //* le o nome do arquivo a ser lido *
        strcat(nome_arquivo,sf);    // * strcat(s1,s2) onde s1 e s2 são 2 strings; essa função joga a s2 na s1, sem apagar o que havia antes na s1; ex: s1=oi, s2=tchau, strcat(s1s2), printf("%s",s1)=oitchau * 


        leitura.open(nome_arquivo); // * o programa abrirá o arquivo de nome informado pelo usuario *
        while (leitura.get(letra)) {cout << letra;} // * se o arquivo for aberto com sucesso o programa irá escrever todo seu conteudo na tela *
        printf("\n");

        if(!leitura.is_open( ))  // * verifica se o programa conseguiu abrir o arquivo de nome informado pelo usuario *
        {
                cout << "Nao foi possível abrir arquivo!\n\n";
                leitura.clear(); // * reseta o objeto leitura *
                leitura.close();  // * fecha o objeto de leitura *

                while(z[0]=='s')
                {

                          printf("Digite algo\n");
                          scanf("%s", &palavra);   // * pega o que o usuario escreveu e salva na string 'palavras' *

                          M=strlen(palavra); // * strlen() é o tamanho da string. Ex: z[100]='ola', strlen(z) será 3 *

                          while(j<M) // * esse while vai tirar todas as letras do vetor palavra e só deixar os numeros *
                          {            
                                       if(!isdigit(palavra[j]))   
                              {
                                                         while (j<M)
                                                         {
                                                               palavra[j]=palavra[j+1]; j+=1;
                                                         }
                                                         j=0;
                                                         M-=1;
                              }
                              else 
                              j+=1;
                          }
                j=0;

                escreve.open(nome_arquivo, ofstream::app); // * associa o objeto 'escreve' ao nome do arquivo informado, ofstream::app serve para ele não apagar o que já existia anteriormente no arquivo *
                escreve << palavra << "\n"; // * ele escreve o vetor palavra no arquivo 'nome_arquivo' *
                escreve.close(); // * encerra o objeto escreve (?)*

                printf("O que foi escrito no arquivo foi: \n"); // * mostra o que efetivamente foi escrito no arquivo *
                printf("%s \n", palavra);

                printf("\n\n Deseja escrevar na proxima linha do arquivo? (s/n) \n"); // * da a opção para o usuario escrever na proxima linha do arquivo *
                scanf("%s",&z);
                while ( ((z[0]!='s')&&(z[0]!='n')) || (strlen(z)!=1))
                {
                printf(" sim (s) ou nao(n) \n");
                scanf("%s",&z);
                }

                y=1;
                }
        }
        system("pause");
        return(0);       
   }  

 

Adicionei a opção de escrever na próxima linha do arquivo de texto.

Retirei a necessidade de escrever .txt no nome do arquivo graças a função strcat (obrigado quitZAUMMM).

 

Porém ainda tem algumas coisas que eu gostaria de entender:

Existe algum meio de eu, quando abrir o arquivo, gravar os numeros e orientalos? Por exemplo:

 

Abri o arquivo xxx.txt, ai o programa escreveu:

676

335

46

345

86

 

Ai o programa le e ordena:

46

86

335

345

676

 

Gostaria de uma forma para orienta-los em ordem crescente e regravar no arquivo. Acho que poderia ser usado com a função

leitura.get(letra)

, porém não tenho ideia de seu funcionamento.

Poderia me dar uma luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Poderia me dizer uma coisa? Por quê está misturando C++ com C usando bibliotecas da C em C++?

 

Use ao invés disso (é a mesma coisa, só que nos padrões C++):

 

<stdio.h> => <cstdio>

<stdlib.h> => <cstdlib>

<string.h> => <cstring> (para usar a o tipo de dado string, não uma matriz de caracteres, inclua <string> também)

<math.h> => <cmath>

<ctype.h> => <cctype>

 

Como pode ver, nas bibliotecas da C convertidas em C++, é só adicionar um C antes e tirar o .h

 

 

Misturar as 2 linguagens não é uma boa prática. Use C ou C++.

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Poderia me dizer uma coisa? Por quê está misturando C++ com C usando bibliotecas da C em C++?

 

Use ao invés disso (é a mesma coisa, só que nos padrões C++):

 

<stdio.h> => <cstdio>

<stdlib.h> => <cstdlib>

<string.h> => <cstring> (para usar a o tipo de dado string, não uma matriz de caracteres, inclua <string> também)

<math.h> => <cmath>

<ctype.h> => <cctype>

 

Como pode ver, nas bibliotecas da C convertidas em C++, é só adicionar um C antes e tirar o .h

 

 

Misturar as 2 linguagens não é uma boa prática. Use C ou C++.

 

Abraços :D

 

Veja bem, eu nem fazia ideia que eu estava usando o C++. Para mim, isso tudo era C.

Pelo o que você falo, as bibliotecas com de C++ começam com C e tiram o .h? Mas tem algum comando que eu esteja usando que não esta de acordo com C?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

As bibliotecas da C tem o .h no final. As bibliotecas da C adaptadas para C++ começam com c, seguidas do nome da biblioteca da C e sem o .h no final. As bibliotecas somente da C++ (na maioria das vezes) não começam com c e (em todas as vezes) não tem o .h do final.

 

Além disso, a instrução using namespace std; é somente da C++.

 

Sugiro que leia um livro para aprender a diferenciar as 2.

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vlw por falar isso. Eu perguntei para meu professor e ele confirmou. Ele falou também que não liga de misturarmos C com C++, mas todavia tentarei evitar de misturar ambas as linguagens. Obrigado a todos.

Para quem quiser ver como meu codigo ficou, abaixo se encontra ele.

 

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

char letra,nome_arquivo[20],palavra[30],z[30],a[30],n[15];
int i,y=0,x=0,j=0,aux,w=0,k[30],aa,aux2,aux3;
float numero[30],M;

int main ()
   {
        hell:
        y=0;
        x=0;
        j=0;
        w=0;
        z[0]='s';


        char sf[5]; // * essa variavel serve para que o usuario não precise digitar .txt no final do nome do arquivo *
        sf[0]='.';
        sf[1]='t';
        sf[2]='x';
        sf[3]='t';

        ifstream leitura; // * cria o objeto 'leitura' que é comparavel a uma ferramenta que irá abrir o arquivo de nome informado pelo usuario *
        ofstream escreve; // * objeto que usaremos para escrever no arquivo de nome informado na variavel 'nome_arquivo' *

        printf("Escreva o nome do arquivo a ser aberto\n");
        scanf("%s", &nome_arquivo); //* le o nome do arquivo a ser lido *
        strcat(nome_arquivo,sf);    // * strcat(s1,s2) onde s1 e s2 são 2 strings; essa função joga a s2 na s1, sem apagar o que havia antes na s1; ex: s1=oi, s2=tchau, strcat(s1s2), printf("%s",s1)=oitchau * 

        leitura.open(nome_arquivo); // * o programa abrirá o arquivo de nome informado pelo usuario *
        while (leitura.get(letra)) {cout << letra;} // * se o arquivo for aberto com sucesso o programa irá escrever todo seu conteudo na tela *
        printf("\n");

        if(!leitura.is_open( ))  // * verifica se o programa conseguiu abrir o arquivo de nome informado pelo usuario *
        {
                cout << "Nao foi possível abrir arquivo!\n\n";
                leitura.clear(); // * reseta o objeto leitura *
                leitura.close();  // * fecha o objeto de leitura *

                while(z[0]=='s')
                {                           
                          printf("Digite algo\n");
                          scanf("%s", &palavra);   // * pega o que o usuario escreveu e salva na string 'palavras' *

                          M=strlen(palavra); // * strlen() é o tamanho da string. Ex: z[100]='ola', strlen(z) será 3 *

                          while(j<M) // * esse while vai tirar todas as letras do vetor palavra e só deixar os numeros *
                          {            
                                       if(!isdigit(palavra[j]))   
                              {
                                                         while (j<M)
                                                         {
                                                               palavra[j]=palavra[j+1]; j+=1;
                                                         }
                                                         j=0;
                                                         M-=1;
                              }
                              else 
                              j+=1;
                          }
                j=0;

                escreve.open(nome_arquivo, ofstream::app); // * associa o objeto 'escreve' ao nome do arquivo informado, ofstream::app serve para ele não apagar o que já existia anteriormente no arquivo *
                escreve << palavra << "\n"; // * ele escreve o vetor palavra no arquivo 'nome_arquivo' *
                escreve.close(); // * encerra o objeto escreve (?)*

                printf("O que foi escrito no arquivo foi: \n"); // * mostra o que efetivamente foi escrito no arquivo *
                printf("%s \n", palavra);

                printf("\n\n Deseja escrevar na proxima linha do arquivo? (s/n) \n"); // * da a opção para o usuario escrever na proxima linha do arquivo *
                scanf("%s",&z);
                while ( ((z[0]!='s')&&(z[0]!='n')) || (strlen(z)!=1))
                {
                printf("sim (s) ou nao(n) \n");
                scanf("%s",&z);
                }

                y=1;
                }
        }

        leitura.clear(); // * reseta o objeto leitura *
        leitura.close();  // * fecha o objeto de leitura *

        printf("Deseja ordenar os numeros presentes no arquivo? (s/n) \n");     // * verificando se o usuario deseja usar a função de ordenar os numeros presentes no arquivo *
        scanf("%s",&z);
        while ( ((z[0]!='s')&&(z[0]!='n')) || (strlen(z)!=1))
                {
                printf("sim (s) ou nao(n) \n");
                scanf("%s",&z);
                }

        i=0;
        j=0;   
        aux3=0;     
        if(z[0]=='s')
        {
                     leitura.open(nome_arquivo);                                              
                     while(leitura.getline(n, 15))   // * essa função vai pegar cada linha do arquivo 'nome_arquivo', retirar todas as letras e salvar cada linha em uma casa de um vetor de inteiros *                                         
                     {                   

                                               M=strlen(n); // * strlen() é o tamanho da string. Ex: z[100]='ola', strlen(z) será 3 *

                                               while(j<M) // * esse while vai tirar todas as letras do vetor 'n' e só deixar os numeros *
                                               {            
                                                            if(!isdigit(n[j]))   
                                                            {
                                                                                       while (j<M)
                                                                                       {
                                                                                             n[j]=n[j+1]; 
                                                                                             j+=1;
                                                                                       }
                                                            j=0;
                                                            M-=1;
                                                            }

                                                            else 
                                                            j+=1;
                                               }
                                               j=0;                 
                                               k[i] = atoi (n);                                                
                                               i+=1;
                      }


                     leitura.close();
                     aux3=i;         // * como o strlen() só serve para vetores do tipo char, esse aux nos será util futuramente para saber quantos numeros efetivamente foram salvos no vetor 'k[]' *

                     aa=1;                      
                     while(aa==1)  // * esse while vai ordenar o vetor de numeros inteiros o qual está salvo os numeros do arquivo 'nome_arquivo' *
                     {
                                 i=0;
                                 aa=0;
                                 while(i<((aux3)-1))
                                 {
                                                 if(k[i]>k[i+1])
                                                 {
                                                                aux2=k[i];
                                                                k[i]=k[i+1];
                                                                k[i+1]=aux2;
                                                                aa=1;
                                                 }
                                  i+=1;
                                 }
                     }

                     i=0;

                     escreve.open("Arquivo_ordenado.txt");            // * essa parte se destina a salvar, na ordem crescente, os numeros do arquivo 'nome_arquivo' *     
                     printf("O arquivo foi re-escrito da seguinte forma:\n");
                     while(i<aux3)
                     {
                                  printf("%d \n",k[i]);
                                  escreve << k[i] << "\n";
                                  i+=1;
                     }
                     escreve.close();                                      // * onde termina o processo de salvar os numeros no novo arquivo, em ordem *
        }





        printf("Repitir o programa? (s/n)\n");  // * ciclo de repetição do programa
        scanf("%s",&a);
        while ( ((a[0]!='s')&&(a[0]!='n')) || (strlen(a)!=1))
        {
                printf("sim (s) ou nao(n) \n");
                scanf("%s",&a);
        }
        if(a[0]=='s')
        {
                     system("cls");
                     goto hell;
        }

        return(0);       
   }  

 

Sei que dava para eu separar em varias funções, não usar goto e etc. Mas ainda vou fazer muitos exercicios ao longo do meu curso de engenharia eletrica, intaum vou aprendendo sobre isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.