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