Problemas com system() en c++

Iniciado por Diego_Rocha, 02 de Março de 2007, 16:40

tópico anterior - próximo tópico

solanoalves

é isso ae cara C++ eh meio confuso e eu por enquanto não estou afim de aprender, espero que não seja obrigatório na faculdade também pq quero ficar no C mesmo

Lamego

Diego,
não é por utilizar cout/cin no lugar de printf/scan que um porgrama passa de C++ para C, o seu programa já era em C (não utilizava objectos) misutrado com operadores de C++ cin/cout.
Na minha opinião saber C é um requisito para aprender C++.
João Luís Marques Pinto
Mais programs e jogos para o Ubuntu

Diego_Rocha

Citação de: Lamego online 03 de Março de 2007, 18:10
Diego,
não é por utilizar cout/cin no lugar de printf/scan que um porgrama passa de C++ para C, o seu programa já era em C (não utilizava objectos) misutrado com operadores de C++ cin/cout.
Na minha opinião saber C é um requisito para aprender C++.

Obrigado pelo esclarecimento estou iniciando agora em programação, se quiser me ajudar nessa caminhada serei grato XD, eu e o solano anda trocando umas ideias a respeito de fazer algum programa so para praticar e trocar conhecimentos, se quiser fazer parte seja muito bem vindo cara t++

Darcamo

Resolvi fazer uma versão em C++ com a mesma finalidade do seu programa. Certamente várias melhorias ainda podem ser feitas como, por exemplo, implementar testes para saber se o path e o nome da imagem estão corretos, se a pasta fornecida como ponto de montagem existe (e se não existir criá-la), etc. Mas a idéia é ser simples pra ficar fácil de entender.

Arquivo main

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include "mounter.h"

using namespace std;

int main(int argc, char *argv[])
{
Mounter mounterObj; // Declara um objeto da classe Mounter

string pathStr, imagemStr, pontoDeMontagemStr;

cout << "Digite o path para a imagem (Ex: /home/user/)" << endl;
cin >> pathStr;
cout << "Digite o nome da imagem (Ex: imagem.iso)" << endl;
cin >> imagemStr;
cout << "Digite o ponto de montagem da imagem (Ex: /mnt/iso)" << endl;
cin >> pontoDeMontagemStr;

mounterObj.setPath( pathStr );
mounterObj.setImagem( imagemStr );
mounterObj.setPontoDeMontagem( pontoDeMontagemStr );

mounterObj.mount();

  return EXIT_SUCCESS;
}



Definição da classe Mounter

#ifndef MOUNTER_H
#define MOUNTER_H

#include <string>
#include <iostream>

using namespace std;

class Mounter{
public:
Mounter();

~Mounter();

void setPath(string pPathStr);
void setImagem(string pImagemStr);
void setPontoDeMontagem(string pPontoDeMontagemStr);
void mount();

protected:
string pathStr;
string imagemStr;
string pontoDeMontagemStr;
string opcoesStr;
};

#endif


Implementação da classe Mounter

#include "mounter.h"

Mounter::Mounter()
{
pathStr = "/";
imagemStr = "imagem.iso";
pontoDeMontagemStr = "/mnt/iso";
opcoesStr = "-t iso9660 -o loop";
}


Mounter::~Mounter()
{
}


void Mounter::setPath( string pPathStr )
{
pathStr = pPathStr;
if(pathStr[pathStr.length()-1] != '/')
pathStr+="/";
}


void Mounter::setImagem( string pImagemStr )
{
imagemStr = pImagemStr;
}


void Mounter::setPontoDeMontagem( string pPontoDeMontagemStr )
{
pontoDeMontagemStr = pPontoDeMontagemStr;
}


void Mounter::mount()
{
string comando = "sudo mount " + opcoesStr + " " + pathStr + imagemStr + " " + pontoDeMontagemStr;
system(comando.c_str()); // A função c_str converte uma string para um array de char no estilo de C puro, que é o que a função "system" espera receber.
}



A primeira vista parece que em C++ ficou é mais complicado. 3 arquivos só pra fazer o que vc fez em poucas linhas no C puro. Mas é porque esse programa é bem simples. Programas maiores certamente são mais fáceis de entender em C++ do que em C.

Diego_Rocha

MEU DEUS que isso cara tem que saber muito para fazer isso que voce fez, eu ainda estou começando a programar valeu mesmo pelo exemplo e muito obrigado pelo tempo dedicado a me explicar como seria em c++, vc so podia ter comentado o que as linha do codigo faz  ;D, porem sei que isso ficaria demorado demais para voce fazer ne, muito obrigadoooooo mesmo sanou minha duvida me assutou um pouco na realidade  ;D mas nada que com o tempo e com estudo eu não seja capaz de fazer é isso um abraço e t++

Darcamo

Minha intenção não foi complicar. Na verdade fiquei curioso em usar a função system e resolvi fazer uma versão para C++.

Quanto a explicar as linhas, eu não usei nada demais. Apenas criei uma classe (chamada Mounter), criei um objeto dessa classe no arquivo main e usei algumas funções definidas nessa classe para setar o path, o nome da imagem, o ponto de montagem e finalmente montar a imagem iso. A parte

mounterObj.setPath( pathStr );
mounterObj.setImagem( imagemStr );
mounterObj.setPontoDeMontagem( pontoDeMontagemStr );
mounterObj.mount();


Pega um bom livro de C++ que dê uma noção de orientação a objetos que vale a pena.

solanoalves

realmente muito confuso C++, 3 arquivos só para captar dados e executar um system.

Bom aproveitando o momento queria perguntar uma coisa que me deixa realmente frustrado:

Alguns programadores criam 3 arquivos:


1. codigo fonte
2. mais um arquivo em formato .c
3. e o header

Vejo que no arquivo 2 ele declara por exemplo:  int numero(int a , int b);
E no arquivo 3 a mesma coisa só que agora com a função toda .....
E pra piorar no codigo fonte ele novamente repete int numero(int a, int b); que chama de prototipo.

agora pergunto: por que se deve encher tanta linguiça?
não é necessario só o header?

Diego_Rocha

Citação de: Darcamo online 04 de Março de 2007, 13:30
Minha intenção não foi complicar. Na verdade fiquei curioso em usar a função system e resolvi fazer uma versão para C++.

Quanto a explicar as linhas, eu não usei nada demais. Apenas criei uma classe (chamada Mounter), criei um objeto dessa classe no arquivo main e usei algumas funções definidas nessa classe para setar o path, o nome da imagem, o ponto de montagem e finalmente montar a imagem iso. A parte

mounterObj.setPath( pathStr );
mounterObj.setImagem( imagemStr );
mounterObj.setPontoDeMontagem( pontoDeMontagemStr );
mounterObj.mount();


Pega um bom livro de C++ que dê uma noção de orientação a objetos que vale a pena.

Sei que sua intenção não foi complicar de forma alguma disse isso fiquei muito grato por ter tido pasciencia de fazer um exemplo para me mostrar como seria, enquanto aprender c++ tem muita gente me dissendo primeiro para mim aprender c e depois que ja estiver bem com o c ai sim partir para o c++, acho que vai ser isso que vou fazer ate porque se não complica muito meu aprendizado, volto a agradecer pelo exemplo XD,