Aprenda C++

  • Página Inicial
  • Contato!
  • Tudo sobre C++ Parte 1!
  • Tudo sobre C++ Parte 2!
  • Tudo sobre C++ Parte 3!
  • Tudo sobre C++ Parte 4!
  • Tudo sobre C++ Parte 5!
  • Tudo sobre C++ Parte 6!
  • Tudo sobre C++ Parte 7!
  • Tudo sobre C++ Parte 8!
  • Tudo sobre C++ Parte 9!
  • Tudo sobre C++ Parte 10!
  • Tudo sobre C++ Parte 11!
  • Tudo sobre C++ Parte 12!
  • Tudo sobre C++ Parte 13!
  • Tudo sobre C++ Parte 14!
  • Tudo sobre C++ Parte 15!
  • Tudo sobre C++ Parte 16!
  • Tudo sobre C++ Parte 11

    System

    O system é utilizado para executar comandos do Prompt do Windows (ou Terminal em sistemas Unix), isso é útil para determinados programas. Veja um exemplo de uso (importe cstdlib):

    
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main() {
        system("dir");
    
        return 0;
    }
    
    

    No caso acima, o dir (Windows), exibe as pastas e arquivos do diretório encontrado.

    Outros comandos que podem ser muito usados são o cls (limpeza da tela) e pause (para pausar o programa).

    Um exemplo que podemos usar também é o color, para mudar a cor do programa:

    
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main() {
        system("color FD");
    
        return 0;
    }
    
    

    PS: Só é possível utilizar sempre a mesma cor para o programa todo.

    Só que tem um porém, o comando cd não funciona no system (pelo fato dele não manter os dados após cada chamada), nesse caso é necessário utilizar o chdir (importe unistd.h) ou o SetCurrentDirectory (só em Windows, importe windows.h) para navegarmos por pastas no programa, dessa forma:

    
    #include <iostream>
    #include <cstdlib>
    #include <unistd.h>
    
    using namespace std;
    
    int main() {
        chdir("C:/Users");
        system("dir");
    
        return 0;
    }
    
    

    PS: Utilize sempre barras pra direita, as pra esquerda são interpretadas como sequências de escape. Caso use algum comando que tenha aspas, como os de navegação de pastas ou manipulação de registro, use sequências de escape \" e \\, aonde estiver " e \.

    As variáveis do DOS/Terminal (como %username% em Windows ou $HOME em Unix) não são identificadas por esse método, nesse caso usamos o getenv, sem qualquer símbolo de indicação de variável. Veja um exemplo:

    
    #include <iostream>
    #include <cstdlib>
    #include <unistd.h>
    
    using namespace std;
    
    int main() {
        chdir(getenv("USERPROFILE"));
        chdir("Desktop");
    
        system("dir");
    
        return 0;
    }
    
    

    PS: Em Windows é possível e até preferível usar no lugar do chdir, SetCurrentDirectory(), nesse caso importe windows.h.

    O getenv funciona com esse parâmetros:

    Variável Conteúdo Exibido
    USERPROFILE C:\Users\UsuarioAtual
    PROGRAMDATA C:\Programdata
    ALLUSERSPROFILE C:\Programdata
    WINDIR C:\Windows
    SYSTEMROOT C:\Windows
    PROGRAMFILES C:\Program Files
    COMMONPROGRAMFILES C:\Program Files\Common Files
    USERNAME "UsuarioAtual"
    COMPUTERNAME Nome do Computador
    LOCALAPPDATA C:\Users\Usuário Atual\AppData\Local
    APPDATA C:\Users\Usuário Atual\AppData\Roaming
    ERRORLEVEL Código de Erro do Último Comando (quando é diferente de 0).
    CD Pasta Atual
    USERDOMAIN Nome do Computador
    SYSTEMDRIVE C:
    HOMEDRIVE C:
    SYSTEMDIRECTORY C:\Windows\System32
    COMSPEC C:\Windows\System32\cmd.exe
    TEMP C:\Users\Usuário Atual\AppData\Local\Temp
    TMP C:\Users\Usuário Atual\AppData\Local\Temp
    HOMEPATH \Users\Usuário Atual
    PATH Retorna o path do sistema
    PATHEXT Retorna as extensões de executáveis
    OS Retorna o nome do Sistema Operacional
    PROCESSOR_IDENTIFIER Retorna dados sobre o processador
    PROCESSOR_ARCHITECTURE Retorna a arquitetura do processador

    Para usar em Linux, o processo é o mesmo, só mudando a navegação entre pastas (seria coisas como /usr/local/bin) e os comandos do getenv, que são esses:

    Variável Conteúdo Exibido
    HOME /home/UsuarioAtual
    USER "UsuarioAtual"
    LOGNAME "UsuarioAtual"
    PWD Diretório Atual
    LANG Idioma Atual
    SHELL /bin/bash (ou o Shell Atual)
    TERM Tipo de Terminal Usado
    PATH Diretórios a Pesquisar
    MAIL E-mail Definido
    OSTYPE Tipo de Sistema Usado

    Operações com Arquivos - Parte 1 - Ofstream

    Primeiramente, importe a biblioteca fstream. Basicamente, o ofstream é pra saída, o ifstream é de entrada e o fstream pode ser configurado para ambos.

    Nessa parte, trabalharemos só com o ofstream. Que podemos fazer assim:

    
    int main() {
        ofstream arquivo; // Importe fstream
    
        return 0;
    }
    
    

    Para criar o arquivo (se existir ele sobreescreverá o já existente), basta usar o método open(), assim:

    
    int main() {
        ofstream arquivo; // Importe fstream
        
        arquivo.open("arquivo.txt");
    
        return 0;
    }
    
    

    E para armazenar conteúdo nesse arquivo, basta fazer que nem o cout, o substituindo pela variável criada, assim:

    
    int main() {
        ofstream arquivo; // Importe fstream
        
        arquivo.open("arquivo.txt");
        
        arquivo << "Texto que será armazenado no arquivo!\n";
    	
        cout << "Arquivo Escrito com Sucesso!" << endl
    
        return 0;
    }
    
    

    PS: Para liberar a memória, não esqueça de fechar o arquivo com o método close(), assim:

    
    int main() {
        ofstream arquivo; // Importe fstream
    
        arquivo.open("arquivo.txt");
    
        arquivo << "Texto que será armazenado no arquivo!\n";
        
        arquivo.close();
    	
        cout << "Arquivo Escrito com Sucesso!" << endl
    
        return 0;
    }
    
    

    PS: Ao executar novamente, ele vai substituir o texto escrito no arquivo, caso esteja outra coisa.

    Para podermos adicionar conteúdo ao arquivo sem substituir, usamos um parâmetro adicional no open, o ios::app, assim:

    
    arquivo.open("arquivo.txt", ios::app);
    
    

    Podemos ter mais de uma inserção de conteúdo ao mesmo tempo, assim:

    
    int main() {
        ofstream arquivo; // Importe fstream
    
        arquivo.open("arquivo.txt");
    
        arquivo << "Linha 1!\n";
        arquivo << "Linha 2!\n";
        arquivo << "Linha 3!\n";
    
        arquivo.close();
    	
        cout << "Arquivo Escrito com Sucesso!" << endl
    
        return 0;
    }
    
    

    Operações com Arquivos - Parte 2 - Ifstream

    Para ler arquivos, usamos o ifstream, mas também precisaremos de uma string e um laço while para isso, como podemos ver no código, aproveitando o txt do programa anterior:

    
    int main() {
        ifstream entrada; // Importe fstream
        string linha;
        
        entrada.open("arquivo.txt");
        
        if(entrada.is_open()) {
            while(getline(entrada, linha)) {
                cout << linha << endl;
            }
            entrada.close();
        }
        else {
            cout << "Não foi possível abrir o arquivo!" << endl;
        }
    
        return 0;
    }
    
    

    Operações com Arquivos - Parte 3 - Fstream

    Na classe Ofstream, só podemos usar para escrever no arquivo, assim como na classe Ifstream que só podemos usar para ler, mas podemos usar a classe Fstream para ambas as funções, com uma classe só.

    Esse é o código que colocaremos no programa:

    
    int main() {
        fstream arquivo;
        char opc;
        string nome, linha;
        
        arquivo.open("arquivo.txt", ios::out); // Saída do programa pro arquivo.
        
        do {
            cout << "Digite um nome: ";
            cin >> nome;
            
            arquivo << nome << "\n";
            
            cout << "Deseja digitar mais nomes? [S/N] ";
            cin >> opc;
            
            system("cls"); // Importe cstdlib, use clear no Linux
        }
        while((char)toupper(opc) == 'S'); // Importe cctype
        
        arquivo.close();
    
        return 0;
    }
    
    

    Como visto, a única diferença no open, ao usar o fstream, é a indicação ios::out, que indica a saída do programa para o arquivo.

    PS: Para não sobreescrever o arquivo, da mesma forma, podemos colocar o app no out, dessa forma:

    
    arquivo.open("arquivo.txt", ios::out | ios::app);
    
    

    Para ler o mesmo arquivo (entrada do arquivo para o programa)., use ios::in. Podemos fazer assim (coloque esse código logo abaixo do programa, antes do return):

    
    arquivo.open("arquivo.txt", ios::in); // Entrada do arquivo pro programa.
    
    if(arquivo.is_open()) {
        cout << "Nomes digitados: " << endl << endl;
    
        while(getline(arquivo, linha)) {
            cout << linha << endl;
        }
        arquivo.close();
    }
    else {
        cout << "Não foi Possível Abrir o Arquivo!" << endl;
    }