Gå til innhold

Hvordan endre en linje i terminal?


Anbefalte innlegg

Hei! Jeg har to spørsmål.

Det første er:

hvordan kan jeg få til å endre en linje som programmet mitt printer ut i terminalen?

feks:

#include <iostream>

int main(){
std::cout << "Hello";
std::cout << "World";
return 0;
}

 

Dette eksemplet vil jo vise "Hello World". Men hvordan kan jeg få til at det først står "Hello" også "World"?

 

Mitt andre spørsmål er hvorfor dette ikke vil fungere:

#include <iostream>
#include <math.h>

using namespace std;

int main(){
float a, b, c, answer1, answer2;
bool again;
do{

cout << "Hello!\n";
cout << "ax^2+bx+c=0\n";
cout << "Please enter value a, b and c. \n";
cout << "a: ";
cin >> a;
cout << "b: ";
cin >> b;
cout << "c: ";
cin >> c;
answer1=(-b+sqrt(pow(b,2)-4*a*c))/(2*a);
answer2=(-b-sqrt(pow(b,2)-4*a*c))/(2*a);
cout << "Answer 1(+):" << answer1 << "\n";
cout << "Answer 2(-):" << answer2 << "\n";
cout << "Again?";
cin >> again;
}
while(again);
return 0;
}

 

Alt fungerer helt til den spør om jeg vil gjøre det igjen. Hvis jeg skriver true da, så ser det ut som om det starter opp en loop hvor den bare går igjennom alt igjen, igjen og igjen hvis dere skjønner. Må jeg unsette alle variablene elns for at det skal fungere? Finnes det noen unset() funksjon i c++, eller er det bare å skrive a=0; osv isåfall?

 

Takk for alle svar! :D

Lenke til kommentar
Videoannonse
Annonse

Hvis du bruker Linux kan du bruke ncurses for å få til en del funksjoner i terminalen -- Windows har noe tilsvarende, bare søk på msdn. Du kan evt. tømme skjermen for hver gang du skriver til den, for å lage en enkel effekt.

 

Letteste måten å løse problemet ditt på er å flytte deklarasjonene av variablene inn i løkken. På den måten blir de laget på nytt hver gang løkken kjører en ny runde. Alternativt må du sette dem til null, med a = 0; osv.

 

Svarte dette på spørsmålene dine?

Lenke til kommentar

Takk for svar!

Jeg prøvde å flytte alt innenfor løkken, men da fikk jeg denne erroren:

error: ‘again’ was not declared in this scope

Jeg prøvde da å flytte kun bool again; utenfor løkken, men det fortsatte det samme problemet igjen.

 

Programmerer under linux ja, skal søke på ncurser.

Jeg vil ikke slette alt på skjermen, men endre bare en linje. Slik at noe som står over linjen er uendret osv..

 

EDIT: I eksemplene til APIet FMODAPI (http://www.fmod.org/) er det mange som gjør det med å endre en linje slik jeg vil, men har ikke funnet ut hvordan man gjør det ifra å lese kodene. Bla. i eksempelet "playsound":

 

main.c:

Klikk for å se/fjerne innholdet nedenfor

/*===============================================================================================
PlaySound Example
Copyright (c), Firelight Technologies Pty, Ltd 2004-2005.

This example shows how to simply load and play multiple sounds.  This is about the simplest
use of FMOD.
This makes FMOD decode the into memory when it loads.  If the sounds are big and possibly take
up a lot of ram, then it would be better to use the FMOD_CREATESTREAM flag so that it is 
streamed in realtime as it plays.
===============================================================================================*/
#include "../../api/inc/fmod.h"
#include "../../api/inc/fmod_errors.h"
#include "../common/wincompat.h"
#include <stdio.h>


void ERRCHECK(FMOD_RESULT result)
{
   if (result != FMOD_OK)
   {
       printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
       exit(-1);
   }
}


int main(int argc, char *argv[])
{
   FMOD_SYSTEM      *system;
   FMOD_SOUND       *sound1, *sound2, *sound3;
   FMOD_CHANNEL     *channel = 0;
   FMOD_RESULT       result;
   int               key;
   unsigned int      version;
   /*
       Create a System object and initialize.
   */
   result = FMOD_System_Create(&system);
   ERRCHECK(result);

   result = FMOD_System_GetVersion(system, &version);
   ERRCHECK(result);

   if (version < FMOD_VERSION)
   {
       printf("Error!  You are using an old version of FMOD %08x.  This program requires %08x\n", version, FMOD_VERSION);
       getch();
       return 0;
   }

   result = FMOD_System_Init(system, 32, FMOD_INIT_NORMAL, NULL);
   ERRCHECK(result);

   result = FMOD_System_CreateSound(system, "../media/drumloop.wav", FMOD_SOFTWARE, 0, &sound1);
   ERRCHECK(result);
   result = FMOD_Sound_SetMode(sound1, FMOD_LOOP_OFF);
   ERRCHECK(result);

   result = FMOD_System_CreateSound(system, "../media/jaguar.wav", FMOD_SOFTWARE, 0, &sound2);
   ERRCHECK(result);

   result = FMOD_System_CreateSound(system, "../media/swish.wav", FMOD_SOFTWARE, 0, &sound3);
   ERRCHECK(result);

   printf("===================================================================\n");
   printf("PlaySound Example.  Copyright (c) Firelight Technologies 2004-2005.\n");
   printf("===================================================================\n");
   printf("\n");
   printf("Press '1' to Play a mono sound using hardware mixing\n");
   printf("Press '2' to Play a mono sound using software mixing\n");
   printf("Press '3' to Play a stereo sound using hardware mixing\n");
   printf("Press 'Esc' to quit\n");
   printf("\n");

   /*
       Main loop.
   */
   do
   {
       if (kbhit())
       {
           key = getch();

           switch (key)
           {
               case '1' :
               {
                   result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound1, 0, &channel);
                   ERRCHECK(result);
                   break;
               }
               case '2' :
               {
                   result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound2, 0, &channel);
                   ERRCHECK(result);
                   break;
               }
               case '3' :
               {
                   result = FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, sound3, 0, &channel);
                   ERRCHECK(result);
                   break;
               }
           }
       }

       FMOD_System_Update(system);

       {
           unsigned int ms = 0;
           unsigned int lenms = 0;
           int          playing = 0;
           int          paused = 0;
           int          channelsplaying = 0;

           if (channel)
           {
               FMOD_SOUND *currentsound = 0;

               result = FMOD_Channel_IsPlaying(channel, &playing);
               if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
               {
                   ERRCHECK(result);
               }

               result = FMOD_Channel_GetPaused(channel, &paused);
               if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
               {
                   ERRCHECK(result);
               }

               result = FMOD_Channel_GetPosition(channel, &ms, FMOD_TIMEUNIT_MS);
               if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
               {
                   ERRCHECK(result);
               }

               FMOD_Channel_GetCurrentSound(channel, &currentsound);
               if (currentsound)
               {
                   result = FMOD_Sound_GetLength(currentsound, &lenms, FMOD_TIMEUNIT_MS);
                   if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
                   {
                       ERRCHECK(result);
                   }
               }
           }

           result = FMOD_Sound_GetLength(sound1, &lenms, FMOD_TIMEUNIT_MS);
           if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
           {
               ERRCHECK(result);
           }

           FMOD_System_GetChannelsPlaying(system, &channelsplaying);

           printf("Time %02d:%02d:%02d/%02d:%02d:%02d : %s : Channels Playing %2d\r", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped", channelsplaying);
           fflush(stdout);
       }

       Sleep(10);

   } while (key != 27);

   printf("\n");

   /*
       Shut down
   */
   result = FMOD_Sound_Release(sound1);
   ERRCHECK(result);
   result = FMOD_Sound_Release(sound2);
   ERRCHECK(result);
   result = FMOD_Sound_Release(sound3);
   ERRCHECK(result);
   result = FMOD_System_Close(system);
   ERRCHECK(result);
   result = FMOD_System_Release(system);
   ERRCHECK(result);

   return 0;
}

 

main.cpp:

Klikk for å se/fjerne innholdet nedenfor
/*===============================================================================================
PlaySound Example
Copyright (c), Firelight Technologies Pty, Ltd 2004-2005.

This example shows how to simply load and play multiple sounds.  This is about the simplest
use of FMOD.
This makes FMOD decode the into memory when it loads.  If the sounds are big and possibly take
up a lot of ram, then it would be better to use the FMOD_CREATESTREAM flag so that it is 
streamed in realtime as it plays.
===============================================================================================*/
#include "../../api/inc/fmod.hpp"
#include "../../api/inc/fmod_errors.h"
#include "../common/wincompat.h"
#include <stdio.h>


void ERRCHECK(FMOD_RESULT result)
{
   if (result != FMOD_OK)
   {
       printf("FMOD error! (%d) %s\n", result, FMOD_ErrorString(result));
       exit(-1);
   }
}


int main(int argc, char *argv[])
{
   FMOD::System     *system;
   FMOD::Sound      *sound1, *sound2, *sound3;
   FMOD::Channel    *channel = 0;
   FMOD_RESULT       result;
   int               key;
   unsigned int      version;

   /*
       Create a System object and initialize.
   */
   result = FMOD::System_Create(&system);
   ERRCHECK(result);

   result = system->getVersion(&version);
   ERRCHECK(result);

   if (version < FMOD_VERSION)
   {
       printf("Error!  You are using an old version of FMOD %08x.  This program requires %08x\n", version, FMOD_VERSION);
       getch();
       return 0;
   }

   result = system->setOutput(FMOD_OUTPUTTYPE_ALSA);
   ERRCHECK(result);

   result = system->init(32, FMOD_INIT_NORMAL, 0);
   ERRCHECK(result);

   result = system->createSound("../media/drumloop.wav", FMOD_SOFTWARE, 0, &sound1);
   ERRCHECK(result);
   result = sound1->setMode(FMOD_LOOP_OFF);
   ERRCHECK(result);

   result = system->createSound("../media/jaguar.wav", FMOD_SOFTWARE, 0, &sound2);
   ERRCHECK(result);

   result = system->createSound("../media/swish.wav", FMOD_SOFTWARE, 0, &sound3);
   ERRCHECK(result);

   printf("===================================================================\n");
   printf("PlaySound Example.  Copyright (c) Firelight Technologies 2004-2005.\n");
   printf("===================================================================\n");
   printf("\n");
   printf("Press '1' to Play a mono sound using software mixing\n");
   printf("Press '2' to Play a mono sound using software mixing\n");
   printf("Press '3' to Play a stereo sound using software mixing\n");
   printf("Press 'Esc' to quit\n");
   printf("\n");

   /*
       Main loop.
   */
   do
   {
       if (kbhit())
       {
           key = getch();

           switch (key)
           {
               case '1' :
               {
                   result = system->playSound(FMOD_CHANNEL_FREE, sound1, 0, &channel);
                   ERRCHECK(result);
                   break;
               }
               case '2' :
               {
                   result = system->playSound(FMOD_CHANNEL_FREE, sound2, 0, &channel);
                   ERRCHECK(result);
                   break;
               }
               case '3' :
               {
                   result = system->playSound(FMOD_CHANNEL_FREE, sound3, 0, &channel);
                   ERRCHECK(result);
                   break;
               }
           }
       }

       system->update();

       {
           unsigned int ms = 0;
           unsigned int lenms = 0;
           bool         playing = 0;
           bool         paused = 0;
           int          channelsplaying = 0;

           if (channel)
           {
               FMOD::Sound *currentsound = 0;

               result = channel->isPlaying(&playing);
               if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
               {
                   ERRCHECK(result);
               }

               result = channel->getPaused(&paused);
               if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
               {
                   ERRCHECK(result);
               }

               result = channel->getPosition(&ms, FMOD_TIMEUNIT_MS);
               if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
               {
                   ERRCHECK(result);
               }
              
               channel->getCurrentSound(&currentsound);
               if (currentsound)
               {
                   result = currentsound->getLength(&lenms, FMOD_TIMEUNIT_MS);
                   if ((result != FMOD_OK) && (result != FMOD_ERR_INVALID_HANDLE) && (result != FMOD_ERR_CHANNEL_STOLEN))
                   {
                       ERRCHECK(result);
                   }
               }
           }

           system->getChannelsPlaying(&channelsplaying);

           printf("Time %02d:%02d:%02d/%02d:%02d:%02d : %s : Channels Playing %2d\r", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped", channelsplaying);
           fflush(stdout);
       }

       Sleep(10);

   } while (key != 27);

   printf("\n");

   /*
       Shut down
   */
   result = sound1->release();
   ERRCHECK(result);
   result = sound2->release();
   ERRCHECK(result);
   result = sound3->release();
   ERRCHECK(result);
   result = system->close();
   ERRCHECK(result);
   result = system->release();
   ERRCHECK(result);

   return 0;
}

Endret av 0lav
Lenke til kommentar
Hei! Jeg har to spørsmål.

Det første er:

hvordan kan jeg få til å endre en linje som programmet mitt printer ut i terminalen?

feks:

#include <iostream>

int main(){
std::cout << "Hello";
std::cout << "World";
return 0;
}

 

Dette eksemplet vil jo vise "Hello World". Men hvordan kan jeg få til at det først står "Hello" også "World"?

 

Noe slikt du vil?

std::cout << "Hello" << std::endl;

Lenke til kommentar
Mitt andre spørsmål er hvorfor dette ikke vil fungere:

#include <iostream>
#include <math.h>

using namespace std;

int main(){
float a, b, c, answer1, answer2;
bool again = false;
int test; //variavel til å teste for ny runde....
do{

cout << "Hello!\n";
cout << "ax^2+bx+c=0\n";
cout << "Please enter value a, b and c. \n";
cout << "a: ";
cin >> a;
cout << "b: ";
cin >> b;
cout << "c: ";
cin >> c;
answer1=(-b+sqrt(pow(b,2)-4*a*c))/(2*a);
answer2=(-b-sqrt(pow(b,2)-4*a*c))/(2*a);
cout << "Answer 1(+):" << answer1 << "\n";
cout << "Answer 2(-):" << answer2 << "\n";
cout << "Again?";
cin >> t;
if(t=0) // ny runde
   again = true;
}
while(!again);
return 0;
}

 

 

La inn noen forandringer i koden din, kansje du heller vil bruke j/n for testen. Men der er ikke vanskelig å forandre.

Lenke til kommentar

Du hvis du tar "the easy way" og bare tømmer skjermen, som Lstor foreslår, bør du vel også ha en enkel sleep funksjon, slik at du rekker å se begge deler:

void sleep(int ms)
{
    clock_t time = clock();
    while(time/CLOCKS_PER_SEC/1000 + ms < clock())
        ;
}

 

og så ...

//...
std::cout << "Hello ";
sleep(500);
system("clear");  // evt. system("cls") hvis du er på Windows..
std::cout << "world!" << std::endl;
// ...

Lenke til kommentar

Jeg har tenkt på det å tømme skjermen, men det vil ikke fungere helt hvis jeg f.eks. har to linjer med tekst men kun vil endre den nederste og den øverste enda skal stå igjen urørt..

 

Takk for alle tipsene ang. mitt andre spørsmål også... :)

Endret av 0lav
Lenke til kommentar
Jeg har tenkt på det å tømme skjermen, men det vil ikke fungere helt hvis jeg f.eks. har to linjer med tekst men kun vil endre den nederste og den øverste enda skal stå igjen urørt..

8438964[/snapback]

 

Du kan jo evt. skrive ut all teksten flere ganger, og la være å endre den øverste.

Jeg tror også det finnes et bibliotek for å gjøre nettopp dette, som f.eks. wget o.l. bruker, men jeg er ikke sikker på hva det heter. Det er dessverre ganske lenge siden jeg har programmert terminal-baserte programmer.

Lenke til kommentar

Ok.. Takk for svar. wget gjør akurat det sammes om jeg vil gjøre ja. Ingen som greier å se i en av de to kodene jeg postet hva den gjør for å endre teksten? Det er denne linjen som blir endret når programmet kjører:

printf("Time %02d:%02d:%02d/%02d:%02d:%02d : %s : Channels Playing %2d\r", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped", channelsplaying);

Lenke til kommentar
  • 1 måned senere...
Ok.. Takk for svar. wget gjør akurat det sammes om jeg vil gjøre ja. Ingen som greier å se i en av de to kodene jeg postet hva den gjør for å endre teksten? Det er denne linjen som blir endret når programmet kjører:

printf("Time %02d:%02d:%02d/%02d:%02d:%02d : %s : Channels Playing %2d\r", ms / 1000 / 60, ms / 1000 % 60, ms / 10 % 100, lenms / 1000 / 60, lenms / 1000 % 60, lenms / 10 % 100, paused ? "Paused " : playing ? "Playing" : "Stopped", channelsplaying);

8444136[/snapback]

Så vidt jeg vet kan du fjerne tegn ved å bruke \b:

printf("Hallo\b\b\bha");

gir "Haha".

Lenke til kommentar
  • 2 uker senere...

Du bruker "\r". "\r" hopper til begynnelsen av linjen og lar deg overskrive det som står der allerede.

 

#include <stdio.h>

int main() {
       long int j = 0;

       printf("\n");
       for (; j < 1000000; j++)
               printf("\r %d", j );
       printf("\n");
       return 0;
}

Skal skrive ut tallene 0 - 999999 på samme linje ( dvs. overskrive hverandre )

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...