Ir para conteúdo

Arquivado

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

MatheusMouraoficial

Problemas ofstram dentro de if/else ou switch case

Recommended Posts

Bom noite,

Estou começando a estudar programação e estou com um problema em um programa em c++

O código do programa é:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
int opcao;
string produtos;
do{ // inicio do loop
cout << "1- Cadastrar item " << endl;
cout << "2- Verificar quantidade em estoque " << endl;
cout << "3- Cadastrar quantidade" << endl;
cout << "0- Sair"<< endl;
cin >> opcao;
switch (opcao){
case 1:
cout <<"Digite o nome do produto a ser cadastrado\n";
getline(cin, produtos);
ofstream escreve;
escreve.open("produtos.txt");
escreve << produtos;
escreve.close();
break;
}
}while(opcao != 0 ); // fim do loop
}
Acontece o seguinte sempre que coloco ofstream dentro de alguma condicional o programa simplesmente desconsidera a condição e cai em um loop infinito. Já testei as estruturas separadas, teste somente o loop com condições simples sem o ofstream e testei tambem o ofstream separado para verificar possiveis erros.
Desde já agradeço a atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Olá!
Há alguns erros de sintaxe no código.
1. O principal causador deste problema que você citou é o getline(). Apenas use 'cin >> produtos'
2. Além disso, quando 'case' tiver mais de uma ação, você deve coloca-lo em um scope.
3. Quando fizer switch(), sempre coloque 'default:' para filtrar outras entradas.
4. (não tão importante) Sempre que for usar 'ofstream::open', antes de começar a escrever, utilize a função 'ofstream::is_open' para checar se o arquivo foi aberto (apenas por segurança)
5. (não importante) Coloquei o 'system("cls")' para limpar a tela quando a ação do switch acabar e aparecer o menu de novo.
int opcao = 0;
string produtos;
do { // inicio do loop 
	system("cls"); // limpa a tela para o proximo loop
	cout << "1- Cadastrar item " << endl;
	cout << "2- Verificar quantidade em estoque " << endl;
	cout << "3- Cadastrar quantidade" << endl;
	cout << "0- Sair" << endl;

	cin >> opcao;

	switch (opcao) {
	case 1:
	{ // este é o scope que citei
		cout << "Digite o nome do produto a ser cadastrado\n";
		cin >> produtos;
		ofstream escreve;
		escreve.open("produtos.txt");
		if(escreve.is_open()) // apenas segurança
		{
			escreve << produtos;
			escreve.close();
		}
		break;
	} // fim do scope
	default:
		break;
	}

} while (opcao != 0); // fim do loop

 

Algumas dicas de fstream:

 

Caso queira, você pode usar apenas:

fstream file;
file.open("file.txt", ios_base:: -- opcoes)

Tipos de ios_base:

ios_base::out // abre o arquivo para escrever

ios_base:in // abre o arquivo para leitura

ios_base:binary // lêr/escrever em binário

ios_base::trunc // quando abre o arquivo apaga tudo o que está la dentro (truncate)

ios_base::app // começa a escrever a partir da última linha (append), ou seja, não apaga o que já estava salvo

 

Exemplos:

file.open("file.txt", ios_base::out | ios_base::app | ios_base::binary)
// Irá abrir o arquivo em forma de escrita, irá anexar no que já está salvo e em binário

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.