Gå til innhold

system("PAUSE"); uten "Trykk en tast..."


Anbefalte innlegg

Videoannonse
Annonse

charlie di meola, vennligst gi tips om standard C++. Ikke-standard C++ kan dere diskutere på de plattformspesifikke forumene.

 

Den korrekte måten å gjøre det på er slik:

std::cin.ignore(std::numeric_limits<int>::max(), '\n');

 

Hvis du synes det er alt for langt og vanskelig å skrive, kan du definere en funksjon til å gjøre det for deg:

 

void wait()
{
    std::cin.ignore(std::numeric_limits<int>::max(), '\n');
}

int main()
{
    std::cout << "Hei.\n";
    wait();
}

 

 

Du kan alternativt bruke std::cin.get();, men da må du kalle std::cin.ignore(); hver gang du bruker cin. Det blir ganske kjedelig og slitsomt i lengden, for ikke å nevne at koden blir uoversiktlig.

Lenke til kommentar
MYUBI jeg bare tenkte iom at han brukte "pause", så var det store sjanser for bruk av borland eller vs (dermed burde vel getch være til hjelp og poenget er vel å hjelpe her), men jawohl herr fuhrer, skal ta det du sier til etterretning.

Selvfølgelig er det positivt å hjelpe. Jeg poengterer bare at system("pause") er en håpløs fremgangsmåte, og vi klarer bedre.

 

Jeg synes Scott Meyers sier det ganske fint:

 

Strive for portable code. It's not much harder to write portable programs than to write unportable ones, and only rarely will the difference in performance be significant enough to justify unportable constructs (see Item 16). Even programs designed for custom hardware often end up being ported, because stock hardware generally achieves an equivalent level of performance within a few years. Writing portable code allows you to switch platforms easily, to enlarge your client base, and to brag aabout supporting open systems. It also makes it easier to recover if you bet wrong in the operating system sweepstakes.

 

Degeim: Hvis ikke denne kodesnutten virker, anbefaler jeg å bytte kompilator.

 

#include <iostream>
#include <limits>

void wait()
{
   std::cin.ignore(std::numeric_limits<int>::max(), '\n');
}

int main()
{
   std::cout << "Hei.\n";
   wait();
}

Lenke til kommentar

cin.ignore blir ikke helt den samme effekten som system >nul. Ser ikke helt problemet med å bruke _getch eller system("pause >nul") så lenge det er mindre programmer/eksempler du lager.

 

Ellers er det er mulig å emulere _getch i linux. Wrap hele skiten inn i noen makroer og du har en flerplatformversjon av _getch() :) .

 

#if (defined(WIN32) || defined(WINDOWS)) && !defined(__CYGWIN__)

   #include <conio.h>

#elif defined(_POSIX_VERSION)

   #include <cstdio>
   #include <termios.h>
   #include <unistd.h>

   int _getch()
   {
       struct termios oldt, newt;
       int ch;
       tcgetattr( STDIN_FILENO, &oldt );
       newt = oldt;
       newt.c_lflag &= ~( ICANON | ECHO );
       tcsetattr( STDIN_FILENO, TCSANOW, &newt );
       ch = getchar();
       tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
       return ch;
   }

#else
   
   #error "_getch() not configured for your platform/compiler"

#endif


int main()
{
   _getch();
}

 

Selve _getch() funksjonen er forøvrig ikke mitt verk... bare noe jeg fant på et kjapt google-søk.

Endret av kjetil7
Lenke til kommentar
cin.ignore blir ikke helt den samme effekten som system >nul.

Er ikke poenget å vente på at brukeren skal trykke enter, uten å skrive noe tekst til skjermen? Hvis ikke misforstod jeg, og beklager.

 

Ser ikke helt problemet med å bruke _getch eller system("pause >nul") så lenge det er mindre programmer/eksempler du lager.

For det første heter funksjonen i <conio.h> getch(), så vidt jeg vet. Globale identifikatorer med '_'-prefikset er reservert kompilatoren (se seksjon 17.4.3.1.2 i C++-standarden).

 

For det andre: Hvorvidt folk ønsker å "hedre" plattformuavhengighet er selvfølgelig opp til dem selv. Når det derimot finnes en god, veldefinert og standard måte å utføre en oppgave på, ser jeg ingen grunn til ikke å gjøre det på den måten. Like greit å venne seg til god kodepraksis mens man lærer, fremfor å måtte omvende seg når man er mer dreven.

 

(Jeg kjenner for øvrig opptil flere som har skrevet kode med getch() i Windows, for deretter å ha brent seg når de plutselig begynner å utvikle på Linuxmaskiner).

 

Ellers er det er mulig å emulere _getch i linux. Wrap hele skiten inn i noen makroer og du har en flerplatformversjon av _getch() :) .

Det er lettere å bruke std::cin.ignore(std::numeric_limits<int>::max(), '\n'); fra begynnelsen av. Det fungerer dessuten på alle plattformer, og ikke bare på Windows og Linux.

Lenke til kommentar
For det første heter funksjonen i <conio.h> getch(), så vidt jeg vet. Globale identifikatorer med '_'-prefikset er reservert kompilatoren (se seksjon 17.4.3.1.2 i C++-standarden).

http://msdn.microsoft.com/library/default....2c_._getche.asp

 

Navn med "_" prefiks er reservert implementasjonens bibliotek (seksjon 17.4 heter "Library wide requirements"). Og det er akkurat det ms har gjort, siden dette ikke er en standardisert funksjon. Linux har en getch(), men den har ikke helt samme funksjonalitet som _getch(). Grunnen til at getch() eventuelt forstatt fungerer i Windows, tror jeg er fordi den het det i eldre versjoner. Men for å følge en konsekvent og korrekt navnsetting ble den gjort om til _getch() såvidt jeg vet.

 

Andre har forøvrig gjort akkurat det samme, f.eks. Digital Mars: http://www.digitalmars.com/rtl/conio.html

 

 

For det andre: Hvorvidt folk ønsker å "hedre" plattformuavhengighet er selvfølgelig opp til dem selv. Når det derimot finnes en god, veldefinert og standard måte å utføre en oppgave på, ser jeg ingen grunn til ikke å gjøre det på den måten. Like greit å venne seg til god kodepraksis mens man lærer, fremfor å måtte omvende seg når man er mer dreven.

Det er ikke snakk om å "hedre" noe som helst. Det dreier seg om hva som er praktisk og hensiktsmessig i en gitt situasjon. Ikke alle programmer er ment å kjøre på alle mulige platformer heller. Dessuten er jeg sikker på at selv de mest hardbarka Linuxidealister klarer å bytte ut _getch() med sin egen funksjon. Men ved å bruke makroer kan man faktisk gjøre "alle" fornøyde :) .

 

Og som sagt: wait() funkjonen du viste har ikke samme funksjonalitet som "pause >nul" og _getch() (som er "trykk en tast" for å gå videre - uten å vise tegn på skjermen). Det er faktisk ikke mulig å gjøre det samme med standardbiblioteket. Men på en annen side er jeg enig i at det er liten forskjell på de to variantene.

 

Det er lettere å bruke std::cin.ignore(std::numeric_limits<int>::max(), '\n'); fra begynnelsen av. Det fungerer dessuten på alle plattformer, og ikke bare på Windows og Linux.

Ved å bruke noe lignende jeg viste dekker du alle Windows- og POSIX-baserte systemer. Jeg mener at det er ikke er så verst. Selvfølgelig er det ikke hensiktsmessig å ha noe slikt i et lite program/eksempel, men da er det ikke noe stor jobb å bytte ut system("pause >nul") heller.

Endret av kjetil7
Lenke til kommentar
Joda, denne system("pause"<nul") funker fint, men jeg skulle gjerne hatt en kode som stopper alt helt også, ikke bare til brukeren tryker på noe.

Er ikke helt sikker på hva du mener. Ønsker du å avslutte programmet? Hvis du ønsker å stoppe "alt" kan du i Windows bruke Sleep:

 

#include <windows.h>

int main()
{
   Sleep(1000); // venter 1000 ms (1 sekund)

   Sleep(INFINITE); // meningsløst, men dog...;)
}

Lenke til kommentar
  • 3 uker senere...

Bare ein liten ting. Kan du, Myubi, forklare denne linja bit for bit?

std::cin.ignore(std::numeric_limits<int>::max(), '\n');

Eg ser jo at du brukar funksjonen ignore i klassen cin i namespaset std, men kva gjer denne ignore? Eg har aldri høyrt om han... Og kva er dette for noko: std::numeric_limits<int>::max()?

 

Kunne søkt på google, men her kan det vere fleire som har nytte av ei forklaring...

Lenke til kommentar
Funker det ikke å bare bruke cin og drite i det den gir?

Det er nettopp det std::cin.ignore(std::numeric_limits<int>::max(), '\n'); gjør. Funksjonen ignorerer n antall tegn i strømmen, eller alle tegn frem til en '\n' -- avhengig av hvilken av dem som inntreffer først.

 

n er den høyeste verdien en int kan representere (std::numeric_limits<int>::max()).

 

 

Effekten i praksis er at programmet venter til brukeren trykker enter.

 

 

Alex_2xA: Nei. Det er, som diskutert utallige ganger her på forumet, en dårlig løsning.

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...