Ir ao conteúdo
  • Cadastre-se

C++ Selecionar apenas palavras especificas no código


Posts recomendados

Boa tarde pessoal,

 

tenho uma dúvida aqui e se alguem puder me dar uma ajuda.

Estou escrevendo um código em C++ que lê um arquivo de dados (inúmeras colunas com float e string). Em certo momento do código ele vai ler uma string "nome_string". Se o primeiro "nome_string" for igual a um certo valor quero que ela não seja contabilizada e que o coódigo ignore o resto do texto a partir dela. No entanto, se a "nome_string" estiver no meio do texto não quero que o código ignore.

 

É basicamente um ante-e-depois. Se a "nome_string" estiver na primeira linha, ignora todas as outras linhas que vem depois. No entanto, se "nome_string" estiver no meio, não ignora o que vem antes e nem o que vem depois.

 

Espero que tenha dada pra entender. Se alguem ja passou por isso e conseguir me dar uma dica agradeço.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

O que você está escrevendo é só um filtro. Esse registro da string com um certo valor muitas vezes é chamado em C++ de sentinela --- sentinel record. 

 

Foi você que gerou a entrada? Basta seguir o formato. Imagine um arquivo csv por exemplo.
 

Veja essa planilha no popular programa Excel
 

image.png.625e09f6cb92570f203d8be7b37da41a.png

 

Equivale a um arquivo assim

numero;float coisa;string;outra
1;2.3;teste;ouros
2;;lklk;1
3;4;lklk;jh
4;;kklkl;jh
5;2;gtt;jh
6;2;kl;jh
7;0;gtt;jh
8;;ggg;jh
9;;ggg;jh

no formato csv que você pode adotar. O delimitador aqui foi ';' claro.

 

O que importa é que por exemplo podia usar algo como o campo coisa, a terceira coluna, igual a "kl" por exemplo e assim seu programa para de ler a partir da linha 6.

 

Apenas leia registro a registro da entrada em um loop determinado o valor do campo "sentilena" e se encontrar aja de acordo.

 

Ontem por acaso eu postei um programa assim, um filtro em C++. É trivial alterar para fazer o que você quer. Você chama o programa passando os nomes dos arquivos de entra e saída e ele copia de um pro outro. Basta você alterar o processamento de cada registro.

//#include <algorithm>
#include <iostream>
#include <fstream>
//#include <istream>
//#include <ostream>
#include <string>
using namespace std;
string atbash(string);

int main(int argc, char** argv)
{
	string arquivoEntrada = "entrada.txt";
	string arquivoSaida = "saida.txt";
	if (argc > 1)
	{   // o cara pode usar "programa [entrada [saida]]"
		arquivoEntrada = argv[1];
		if (argc > 2) arquivoSaida = argv[2];
	};	// if()

	ifstream entrada{ arquivoEntrada };
	ofstream saida{ arquivoSaida };
	string conteudo = "";
	while (getline(entrada, conteudo))
	{
		int tamanho = conteudo.size();
		for (int i = 0; i < tamanho; i++)
			if ('A' <= conteudo[i] and conteudo[i] <= 'Z')
				conteudo[i] = 'A' + 'Z' - conteudo[i];
		saida << conteudo << endl;
		//*(it_out) = conteudo, ++it_out;
	};	// while()
	return 0;
};	// main()

// fim do texto

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, arfneto disse:

O que você está escrevendo é só um filtro. Esse registro da string com um certo valor muitas vezes é chamado em C++ de sentinela --- sentinel record. 

 

Foi você que gerou a entrada? Basta seguir o formato. Imagine um arquivo csv por exemplo.
 

Veja essa planilha no popular programa Excel
 

image.png.625e09f6cb92570f203d8be7b37da41a.png

 

Equivale a um arquivo assim


numero;float coisa;string;outra
1;2.3;teste;ouros
2;;lklk;1
3;4;lklk;jh
4;;kklkl;jh
5;2;gtt;jh
6;2;kl;jh
7;0;gtt;jh
8;;ggg;jh
9;;ggg;jh

no formato csv que você pode adotar. O delimitador aqui foi ';' claro.

 

O que importa é que por exemplo podia usar algo como o campo coisa, a terceira coluna, igual a "kl" por exemplo e assim seu programa para de ler a partir da linha 6.

 

Apenas leia registro a registro da entrada em um loop determinado o valor do campo "sentilena" e se encontrar aja de acordo.

 

Ontem por acaso eu postei um programa assim, um filtro em C++. É trivial alterar para fazer o que você quer. Você chama o programa passando os nomes dos arquivos de entra e saída e ele copia de um pro outro. Basta você alterar o processamento de cada registro.


//#include <algorithm>
#include <iostream>
#include <fstream>
//#include <istream>
//#include <ostream>
#include <string>
using namespace std;
string atbash(string);

int main(int argc, char** argv)
{
	string arquivoEntrada = "entrada.txt";
	string arquivoSaida = "saida.txt";
	if (argc > 1)
	{   // o cara pode usar "programa [entrada [saida]]"
		arquivoEntrada = argv[1];
		if (argc > 2) arquivoSaida = argv[2];
	};	// if()

	ifstream entrada{ arquivoEntrada };
	ofstream saida{ arquivoSaida };
	string conteudo = "";
	while (getline(entrada, conteudo))
	{
		int tamanho = conteudo.size();
		for (int i = 0; i < tamanho; i++)
			if ('A' <= conteudo[i] and conteudo[i] <= 'Z')
				conteudo[i] = 'A' + 'Z' - conteudo[i];
		saida << conteudo << endl;
		//*(it_out) = conteudo, ++it_out;
	};	// while()
	return 0;
};	// main()

// fim do texto

 

 

Oi arfneto, obrigada pela resposta. 

 

Eu gerei o arquivo de entrada, é arquivo padrão de um projeto que faço parte. Anexei uma imagem de como é esse arquivo. Ali voce ve inumeras colunas com numero e la no final tem uma string. É essa string que estou tentando fazer a implementação. Vou tentar o que você passou ai. Vê se funciona com o meu código. 

 

Meu código consegue ler todos os elementos de todas as colunas perfeitamente. Só preciso mesmo saber como implementar essa operaçao de ignorar depois de uma certa palavra ou o código continuar rodando.

 

hits.jpg

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 minuto atrás, Ana Maria Garcia disse:

Eu gerei o arquivo de entrada, é arquivo padrão de um projeto que faço parte. Anexei uma imagem de como é esse arquivo. Ali voce ve inumeras colunas com numero e la no final tem uma string. É essa string que estou tentando fazer a implementação. Vou tentar o que você passou ai. Vê se funciona com o meu código. 

 

 

Apenas mude aquele (único) loop e vai continuar funcionando.

 

Escreva seu programa em torno DOS DADOS. Escreva uma classe Hit. Está usando C++ e é muito mais fácil escrever essas coisas nessa linguagem do que em C ou Pascal por exemplo.

 

E entenda que o programa que te mostrei funciona na linha de comando então você pode testar com vários arquivos sem ter que compilar ou gerar o programa de novo: basta mudar o nome dos arquivos

 

Como a entrada é texto, você pode editar o próprio arquivo de teste no IDE ou no bloco de notas e gerar outros arquivos de teste sem mexer no programa

 

Por falar nisso, quando você posta algo assim poste algumas linhas do arquivo EM FORMATO TEXTO assim se alguém quiser testar em um programa pode recortar direto da tela... ;) 

 

Seu projeto devia usar csv. É mais prático e facilitaria importar e editar os dados em planilhas como o Google Planilhas ou o Excel. Não há razão pra usar texto e não usar csv.

 

Você pode criar uma função que recebe o valor do registro sentinela e devolve o próximo conjunto de dados, assim é só trocar no loop e pronto. Dentro dela você coloca o seu código que já lê o registro e devolve 1 se tem um próximo registro e 0 se encontrou o tal registro sentinela. Nada mais.

 

Exemplo

	int proximo(Hit* registro, string sentinela);

 

E se o final for o último campo valer pmtTarget_U14_phys

 

você muda uma única linha no loop

		proximo(leitura,"pmtTarget_U14_phys"); 

E o programa já roda com o loop assim

	while (proximo(&leitura, "pmtTarget_U14_phys"))
	{
		// processa o registro
		saida << conteudo << endl;
	};	// while()

C++

class Hit
{
	int		hit;
	double	sensor[5];
	string	target;
};

 

Entenda que o normal é criar uma classe Leitura e colocar esse comportamento DENTRO da classe. Talvez você pudesse explicar a lógica do processamento... Essa acima de pouco serve já que não tem nada dentro exceto so dados.

 

 

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!