Ir para conteúdo
Fórum Script Brasil
  • 0

Executar programa externo C++ (RESOLVIDO)


amp35br

Pergunta

Fiz um programa em C++ que cria um arquivo .txt com três colunas. Meu objetivo é fazer com que o Gnuplot coloque as duas últimas colunas em gráfico. O arquivo .txt está sendo gerado normalmente, e o script do Gnuplot está funcionando normalmente. O problema é que quando chamo o Gnuplot pelo C++, o arquivo .txt não funciona mais. Alguém sabe o problema?

Estou enviando os dois arquivos abaixo: criaFile.cpp e livplot.gnu

Arquivo criaFile.cpp

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


int main (){

        FILE *teste;


        /*if(teste == NULL){
                printf("Arquivo não pode ser aberto\n");
                getchar();
                exit(1);
        }*/
        system("gnuplot liveplot.gnu");

        for (int i=0; i<20; i++){
                int a = i;
                int b = i+i;
                int c = i*i;
                teste = fopen("testefile.txt", "a");
                fprintf(teste, "%d \t %d \t %d \n", a, b, c);
                fclose(teste);
                sleep(1);

        }
        return 0;
}

 

Arquivo liveplot.gnu

set xrange [0:20]
set yrange [0:400]
plot "testefile.txt" using 1:2 with lines
replot "testefile.txt" using 1:3 with lines
pause 1
reread

 

 

 

Editado por amp35br
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Não sei usar muito bem o tal gnuplot, mas depois de fazer umas provas me funcionou dessa forma:
 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


int main () {

    //criamos o ponteiro
    FILE *teste;
    
    //abrimos o arquivo para escritura. Cada abertura o arquivo novo sobreescreve o antigo
    teste = fopen ( "testefile.txt", "w" );
    
    //Comprovamos se abriu
    if ( teste == NULL ) {
        perror ( "Erro: " );//<- para comprocar é com perror e não com printf
        getchar();
        exit ( 1 );
    }
    
    //gerando o arquivo de dados
    for ( int i = 0; i < 20; i++ ) {
        int a = i;
        int b = i + i;
        int c = i * i;
        
        fprintf ( teste, "%d \t %d \t %d \n", a, b, c );
        
    }
    
    //Importante! Devemos fechar o arquivo para que as mudanças sejam guardadas corretamente.
    fclose ( teste );
    
    //system ( "gnuplot liveplot.gnu" );
    
    //Se quiser executar diretamente o txt use essa linha
    //system("gnuplot -p -e \"plot 'testefile.txt'\"");
    
    //Se queremos ler o arquivo liveplot.gnu usamos o comando:
    system("gnuplot \"liveplot.plt\""); //note que mudei o formato do arquivo para .plt pois em windows esse formato é um dos associados com o programa.
    
    getchar();
    return 0;
}

tive que mudar o nome de liveplot.gnu a liveplot.plt na hora de chamar, pois como ja comentei o formato plt é reconhecido no windows, e não sei se vc está usando windows. De todas formas como falei não sei muito bem usar o tal gnuplot muito bem, só tinha curiosidade mesmo. >_<

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Vangodp,

Obrigado por sua contribuição. Mas deixa eu ser mais claro no meu problema: Embora sua solução esteja funcionando perfeitamente, o que eu estou querendo é rodar o Gnuplot enquanto o arquivo .txt com os dados está sendo incrementado, ou seja, quero um gráfico sendo construído em tempo real, e não que ele seja apresentado todo de uma vez.

Eu andei lendo mais e vi que vou precisar a função fork() e exec(), eu acho. Pois a função system() para a execução do C e só depois que o programa chamado for totalmente executado, ele volta a rodar.

Em fim, quero gerar um gráfico de linhas para uma sequência de dados (2 colunas). Só que estes dados são adicionados no arquivo a cada 1 segundo e consequentemente o gráfico é alterado nessa frequência.

Link para o comentário
Compartilhar em outros sites

  • 0

Resolvido! Gastei um tempinho mas deu certo. A solução foi criar um processo filho usando a função fork(). Aí vai como ficou o código:

criaFile.cpp

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main (){

	FILE *teste;

	pid_t pID = fork();

	if(pID == 0){
		system("gnuplot liveplot.gnu");
		_exit(0);
			}
	else{

	for (int i=0; i<20; i++){
		int a = i;
		int b = i+i;
		int c = i*i;
		teste = fopen("testefile.txt", "a");
		fprintf(teste, "%d \t %d \t %d \n", a, b, c);
		fclose(teste);
		sleep(1);
			}
	}
	return 0;
}

e o arquivo abaixo que é um script para executar no Gnuplot:

liveplot.gnu

set xrange [0:20]
set yrange [0:400]
plot "testefile.txt" using 1:2 with lines
replot "testefile.txt" using 1:3 with lines
pause 1
reread

Estou usando o sistema operacional Linux.

O único problema ainda é que toda vez que for rodar novamente o programa, tem que apagar o arquivo testefile.txt

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...