Má execução deste code, help!!

1. Má execução deste code, help!!

Nameless
theThux

(usa Debian)

Enviado em 05/01/2018 - 12:27h

Boa tarde galera, criei esse code para adicionar produtos em um .txt
o problema é que na execução "trava " por algum motivo, não consigo ver qual é
alguém poderia me ajudar?

typedef struct st_produto{
   int codigo;
   string descricao;
   float preco;
} produto;

bool existe(int codigo){ // funcao bool para verificar se o codigo digitado ja existe no banco de dados
	int codigo_lido;
	FILE *arquivo; // ponteiro do arquivo
	arquivo = fopen("/sdcard/produtos.txt", "r");
	while(!feof(arquivo)){ 
		fscanf(arquivo, "%i\n", &codigo_lido);
		if(codigo_lido == codigo){
			fclose(arquivo);
    		return false;     
		}else{
			fclose(arquivo);
			return true;
		}
	}
	fclose(arquivo);
    return false;
} // existe

int cadastrar_produto() // função de cadastro de produtos no banco de dados
{
	ofstream arquivo; // cria um objeto de fluxo de output
	arquivo.open ("produtos.txt", ofstream::app); // abre o arquivo para testar se ele pode ser aberto
	if (arquivo.is_open()){ // "se o arquivo estiver aberto, o codigo continua"
		int i = 1;
		arquivo.close(); // fecha o arquivo, pois inicialmente fora feito apenas um teste
		while(i != 0){
			
			arquivo.open ("produtos.txt", ofstream::app); // abre o arquivo para gravar dados nele
			system("cls");
			cout << "\t\tBem vindo ao sistema de cadastro de produtos da papelaria RCGA\n\n";
			produto novo;
			
			/**
				No trecho de codigo abaixo grava-se os dado na estrutura
			**/
			
  		    cout << "Codigo: ";
 		    scanf("%i",&novo.codigo);
 		    cin.ignore();

 	        cout << "Descrição: ";
			getline(cin, novo.descricao);
            cout << "Preço: ";
 		    scanf("%f",&novo.preco);  
 		   //cout << "\nCódigo: " << novo.codigo << "\nDescrição: " << novo.descricao << "\nPreço: " << novo.preco << endl;
 		   if(existe(novo.codigo)){ // if para verificar a partir da funcao, se o codigo digitado existe ou nao
        		arquivo << novo.codigo << " " << novo.descricao << " " << novo.preco << "\n"; // envia os dados agrupados ao arquivo
            	arquivo.close(); // fecha o arquivo
        		cout << "\n\t\tProduto cadastrado!\n\nPara sair pressione [0] Continuar [1]" << endl;
   	    	 cin >> i; // variável que controla o loop
		    }else{
        		cout << "\n\t\tO codigo deste produto ja existe!\n\n" << endl;
        		return 0;
      	  } //if else
      
		}//while
	}// if
	return 0;
} // cadastrar_produto(); 



  


2. Re: Má execução deste code, help!!

Perfil removido
removido

(usa Nenhuma)

Enviado em 05/01/2018 - 12:46h

Olá, eu vou mostrar os pontos que achei "suspeitos" do seu codigo:


while(i != 0){
_c_compiler: Objeto While, não e possivel quebrar.

system("cls");
_c_compiler: Objeto "cls" in system.bash não está disponivel, use: clear

scanf (cout << ) objects:
_c_compiler: Objeto: scanf is a c lang library, and not a c++

while(!feof(arquivo)){ 
_c_compiler: Objeto While, não e possivel quebrar.

(com.c-compiler.process[1]): Missing a class (init) in file.
(com.c-compiler.process[2]): Missing a #include files to read.

Erros: While inquebraveis, Include libs não existe, Classe init não existe. Funções do linux que não existe.
 


Tente fazer os whiles quebraveis, pois eles ficaram repetindo, a classe init não existe. O Cls não existe no linux.


Frases que fazem sentido.
Flutuações Quânticas podem Existir, assim como o Decaimento do Vácuo.
O Futuro não importa, o que importa e da para frente. HAHAHA



3. Re: Má execução deste code, help!!

Nameless
theThux

(usa Debian)

Enviado em 05/01/2018 - 13:08h

AndrewUser escreveu:

Olá, eu vou mostrar os pontos que achei "suspeitos" do seu codigo:


while(i != 0){
_c_compiler: Objeto While, não e possivel quebrar.

system("cls");
_c_compiler: Objeto "cls" in system.bash não está disponivel, use: clear

scanf (cout << ) objects:
_c_compiler: Objeto: scanf is a c lang library, and not a c++

while(!feof(arquivo)){ 
_c_compiler: Objeto While, não e possivel quebrar.

(com.c-compiler.process[1]): Missing a class (init) in file.
(com.c-compiler.process[2]): Missing a #include files to read.

Erros: While inquebraveis, Include libs não existe, Classe init não existe. Funções do linux que não existe.
 


Tente fazer os whiles quebraveis, pois eles ficaram repetindo, a classe init não existe. O Cls não existe no linux.


Frases que fazem sentido.
Flutuações Quânticas podem Existir, assim como o Decaimento do Vácuo.
O Futuro não importa, o que importa e da para frente. HAHAHA




Sim, eu sei que não existe, porém estou no Windows. até gostaria de usar o sleep do Linux mas ...

então, como assim quebraveis? sempre com um termino?

não faço ideia do que estou errando...-


4. Re: Má execução deste code, help!!

Perfil removido
removido

(usa Nenhuma)

Enviado em 05/01/2018 - 14:29h

theThux escreveu:

AndrewUser escreveu:

Olá, eu vou mostrar os pontos que achei "suspeitos" do seu codigo:


while(i != 0){
_c_compiler: Objeto While, não e possivel quebrar.

system("cls");
_c_compiler: Objeto "cls" in system.bash não está disponivel, use: clear

scanf (cout << ) objects:
_c_compiler: Objeto: scanf is a c lang library, and not a c++

while(!feof(arquivo)){ 
_c_compiler: Objeto While, não e possivel quebrar.

(com.c-compiler.process[1]): Missing a class (init) in file.
(com.c-compiler.process[2]): Missing a #include files to read.

Erros: While inquebraveis, Include libs não existe, Classe init não existe. Funções do linux que não existe.
 


Tente fazer os whiles quebraveis, pois eles ficaram repetindo, a classe init não existe. O Cls não existe no linux.


Frases que fazem sentido.
Flutuações Quânticas podem Existir, assim como o Decaimento do Vácuo.
O Futuro não importa, o que importa e da para frente. HAHAHA




Sim, eu sei que não existe, porém estou no Windows. até gostaria de usar o sleep do Linux mas ...

então, como assim quebraveis? sempre com um termino?

não faço ideia do que estou errando...-


Tipo assim:

#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;

int main() {
     int main2 = 1;
     string instr;
     while(main2<1000) {
          cout << "Bem Vindo ao Shell de comandos. Coloque Sim ou Sair" << endl;
          cout << "Comando: ";
          cin >> instr;
          if(instr=="sair") {
                break;
          }
          /* Code Here */
       }
}

 


E preciso sempre fechar o while. Além disso, pode mostrar todo o codigo, com a função init?


Frases que fazem sentido.
Flutuações Quânticas podem Existir, assim como o Decaimento do Vácuo.
O Futuro não importa, o que importa e da para frente. HAHAHA



5. Re: Má execução deste code, help!!

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/01/2018 - 00:37h

theThux escreveu:

Boa tarde galera, criei esse code para adicionar produtos em um .txt
o problema é que na execução "trava " por algum motivo, não consigo ver qual é
alguém poderia me ajudar?

typedef struct st_produto{
   int codigo;
   string descricao;
   float preco;
} produto;

bool existe(int codigo){ // funcao bool para verificar se o codigo digitado ja existe no banco de dados
	int codigo_lido;
	FILE *arquivo; // ponteiro do arquivo
	arquivo = fopen("/sdcard/produtos.txt", "r");
	while(!feof(arquivo)){ 
		fscanf(arquivo, "%i\n", &codigo_lido);
		if(codigo_lido == codigo){
			fclose(arquivo);
    		return false;     
		}else{
			fclose(arquivo);
			return true;
		} 


Em ambos os casos, você sai do laço de repetição, sem efetivamente fazer repetição alguma. Isso tem toda a cara de não estar certo.

Adicionalmente, parece-me que o nome da função está equivocado, pois ela retorna verdadeiro (true) quando o registro não existe, e falso (false) quando ele existe.

	}
	fclose(arquivo);
    return false;
} // existe

int cadastrar_produto() // função de cadastro de produtos no banco de dados
{
	ofstream arquivo; // cria um objeto de fluxo de output
	arquivo.open ("produtos.txt", ofstream::app); // abre o arquivo para testar se ele pode ser aberto
	if (arquivo.is_open()){ // "se o arquivo estiver aberto, o codigo continua" 


Existem vários meios de testar se a abertura do arquivo funcionou, mas eu acho que esse que você escolheu não é um dos melhores, nem um dos mais comuns.

Além disso, testar se pode ser aberto, para logo em seguida o fechar, e quase imediatamente abri-lo novamente acaba sendo desperdício. Acho que você poderia repensar essa decisão.

Além disso, o nome do arquivo aqui não é exatamente o mesmo usado na função existe(). É isso mesmo?

		int i = 1; 


Essa variável não passa de um indicador para garantir que o laço de repetição com while será executado pelo menos uma vez. Isso indica que você deveria, então, usar do/while em lugar de while, e a variável de controle (que poderia ser do tipo bool) poderia ser definida apenas dentro do laço, não antes dele.

		arquivo.close(); // fecha o arquivo, pois inicialmente fora feito apenas um teste
		while(i != 0){
			
			arquivo.open ("produtos.txt", ofstream::app); // abre o arquivo para gravar dados nele
			system("cls"); 


Por causa da imprevisibilidade (o compilador não tem como identificar se o que está dentro das aspas está correto ou não), não-portabilidade (ficar amarrado a um sistema específico, e até a uma configuração particular dentro desse sistema) e do custo envolvido (criar processo, executar nesse processo novo um ou mais comandos externos, tratar a terminação desses comandos e cuidar de encerrar os processos), eu geralmente não gosto quando se chama um programa externo, ainda mais quando é apenas para limpar a tela, e especialmente quando isso acontece dentro de um laço de repetição.

Recomendo fortemente que você use uma solução mais elegante. Uma delas, acredite, é simplesmente não limpar a tela.

			cout << "\t\tBem vindo ao sistema de cadastro de produtos da papelaria RCGA\n\n";
			produto novo;
			
			/**
				No trecho de codigo abaixo grava-se os dado na estrutura
			**/
			
  		    cout << "Codigo: ";
 		    scanf("%i",&novo.codigo);
 		    cin.ignore(); 


Essa mistura de operações em std::cin e stdin geralmente pode e deve ser ser evitada, até porque é teoricamente possível que eles estejam dissociados ou não-sincronizados.

Além disso, conviria que você verificasse se as operações de entrada estão funcionando a contento. Em lugar disso, você está supondo que todas elas são sempre bem sucedidas.

 	        cout << "Descrição: ";
			getline(cin, novo.descricao);
            cout << "Preço: ";
 		    scanf("%f",&novo.preco);  
 		   //cout << "\nCódigo: " << novo.codigo << "\nDescrição: " << novo.descricao << "\nPreço: " << novo.preco << endl;
 		   if(existe(novo.codigo)){ // if para verificar a partir da funcao, se o codigo digitado existe ou nao 


Como vimos acima, a função existe() tem o problema de não verificar nada além do primeiro registro. Cuidado com isso.

        		arquivo << novo.codigo << " " << novo.descricao << " " << novo.preco << "\n"; // envia os dados agrupados ao arquivo
            	arquivo.close(); // fecha o arquivo
        		cout << "\n\t\tProduto cadastrado!\n\nPara sair pressione [0] Continuar [1]" << endl;
   	    	 cin >> i; // variável que controla o loop
		    }else{
        		cout << "\n\t\tO codigo deste produto ja existe!\n\n" << endl;
        		return 0;
      	  } //if else
      
		}//while
	}// if
	return 0;
} // cadastrar_produto(); 









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts