• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błyskawiczne wypisywanie wierszy w c++

Object Storage Arubacloud
0 głosów
1,099 wizyt
pytanie zadane 21 grudnia 2015 w C i C++ przez niezalogowany
edycja 21 grudnia 2015

Witam

Mam problem z prędkością wypisywania wierszy w c++.Do mojego projektu niezbędne jest wypisanie 50 wierszy po 15 znaków w każdym. Niestety problem polega na tym, że wypisanie trwa aż sekundę (Tak... AŻ sekundę...). To powoduje, że widać przez tę sekundę jak kolejno te 50 wierszy się wypisuje. Potrzebne mi jest błyskawiczne, niezauważalne wypisanie. Dopowiem, że chodzi mi o zmianę tylko pojedyńczych znaków, które się pojawiają.

http://pastebin.com/B1j0FdYt

Wyżej jest funkcja wypisania.

Pozdrawiam

3 odpowiedzi

+1 głos
odpowiedź 21 grudnia 2015 przez draghan VIP (106,230 p.)

Popraw tagi, używasz strumieni z C++, więc o programowaniu w C nie ma mowy. ;)

Wąskim gardłem tutaj jest wiele operacji wyjścia. Zamiast wypisywać każdy fragment po kolei, najpierw zapisz wszystko, co chcesz wypisać, do std::string, a potem wypisuj cały ekran jedną instrukcją. :)

Ewentualnie i w ostateczności, spróbuj zamiast cout użyć printf(), które jest bardziej wydajne.

komentarz 21 grudnia 2015 przez niezalogowany
No z tym string to nawet dobry pomysł ale ja to musze mieć podzielone w 50 wierszach. Jak podziele jeden string na 50 części?
komentarz 21 grudnia 2015 przez draghan VIP (106,230 p.)
Co oznacza "ja to musze mieć podzielone w 50 wierszach", bo chyba nie bardzo rozumiem?
komentarz 22 grudnia 2015 przez niezalogowany
Chodzi mi o to, że mam ciąg 15 znaków, każdy pochodzi z innej szufladki i to jest jeden wiersz. Takich wierszy jest 50.
komentarz 22 grudnia 2015 przez draghan VIP (106,230 p.)
Koniec wiersza jest uzyskiwany przez dodanie do łańcucha sekwencji "\n".
komentarz 22 grudnia 2015 przez niezalogowany

Dziękuję, a mogę mieć jeszcze jedno pytanko? Czy jest możliwe "usunięcie" zawartości z zmiennej string? Tak abym mógł od zera zapełniać ją w tej samej pętli?

Już mam, dla potomnych - nazwa_zmiennej.clear();

komentarz 22 grudnia 2015 przez draghan VIP (106,230 p.)

Oczywiście. Spójrz na ten przykład (za wiele sensu to nie ma, ale merytoryka zostaje):

#include <cstdlib>
#include <string>

int main()
{
    std::string s; // definicja zmiennej typu string
    s = "abc"; // przypisanie wartości
    s += "def"; // dopisanie wartości do poprzedniej zawartości
    s += "\nghi"; // dopisanie wartości do poprzedniej zawartości, zwróć uwagę na przejście do nowego wiersza
    cout<<s; // wypisanie
    s = "xyz"; // nadpisanie dotychczasowej zawartości
    system("pause");
    system("cls");
    cout<<s; // wypisanie
    return 0;
}

Jeśli chcesz umieścić liczbę w łańcuchu, musisz użyć funkcji std::to_string().

#include <string>

int main()
{
    std::string s; // definicja zmiennej typu string
    int i = 10;
    double d = 13.4;
    s = "i = " + std::to_string(i); // można też konkatenować łańcuchy operatorem +
    s += "\nd = " + std::to_string(d);
    cout<<s;
    return 0;
}

EDIT: albo - jak piszesz - metodą std::string::clear(), chociaż bardzo rzadko jej używam - zazwyczaj chcę ponownie użyć tej zmiennej, w związku z czym używam po prostu operatora przypisania, który  dotychczasową wartość zastępuje czymś nowym.

komentarz 22 grudnia 2015 przez niezalogowany
edycja 22 grudnia 2015

Odnośnie dodawania liczb do string.

wiersze = wiersze + "|" + std::to_string(lista[x]);

Coś takiego zrobiłem. I czy usuwam std (bo mam using namespace std;) czy jest z std to wyskakuje mi błąd

'to string' is not member of 'std'

Jak temu zaradzić? Bo szczerze mówiąc te dodawanie liczb do string by mi się przydało a sprawdzałem kopiując Twój kod i pisząc sam, zarówno w devie i w C:B i w obu programach ten sam błąd

//EDIT: tutaj zamieszczam obecny stan funkcji wypisującej

http://pastebin.com/Pg5WCCBh

komentarz 22 grudnia 2015 przez draghan VIP (106,230 p.)

To jest funkcja ze standardu jedenastego. Upewnij się, że w opcjach kompilatora masz włączoną flagę

-std=c++11

A jeśli używasz kompilatora MinGW, to może być problem, jako że akurat ta funkcja nie jest przez ten kompilator wspierana. Masz w takim wypadku kilka wyjść. Albo napisać własne funkcje konwersji (nietrudne przy pomocy stringstream), albo zainstalować inny kompilator, np. MSVC lub MinGW-w64 (co polecam, bo MinGW-w64 poprawia sporo błędów i niedociągnięć "zwykłego" MinGW).
Możesz też (oparte na http://stackoverflow.com/questions/8542221/stdstoi-doesnt-exist-in-g-4-6-1-on-mingw/8543540#8543540 ) edytować plik nagłówkowy:

ŚCIEŻKA-DO-KOMPILATORA/lib/gcc/mingw32/NUMER_WERSJI/include/c++/bits/basic_string.h

i usunąć makro:

!defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)

z linii 2754, chociaż akurat tego rozwiązania nie sprawdzałem.

+1 głos
odpowiedź 22 grudnia 2015 przez Sebastian Fojcik Nałogowiec (43,040 p.)
edycja 22 grudnia 2015 przez Sebastian Fojcik

Spróbuj tak:

Najpierw wyniki przesyłasz do Twojego własnego strumienia (nie na ekran), a jak wszystko zostanie zebrane, to wypisujesz całą zawartość strumienia na raz.

Przykładowy kod, który udało mi się zmontować:

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
	char znak = 'a';
	stringstream strumien;
	for( int i = 0; i < 50; i++ )
	{
		strumien << znak << endl;
		if( znak < 'z' )
			znak++;
		else
			znak = 'a';
	}

	cout << strumien.rdbuf() << flush;

	return 0;
}

Można to wypisać jeszcze szybciej posługując się funkcjami z WinAPI Write(). Jest to trochę trudniejsze.

0 głosów
odpowiedź 21 grudnia 2015 przez criss Mędrzec (172,590 p.)

Jeśli chodzi o zmiane tylko pojedynczych znaków, to użyj gotoxy.

void gotoxy(int x, int y)
{
  COORD c;
  c.X = x - 1;
  c.Y = y - 1;
  SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}

Aczkolwiek dziwne, że tyle mu to zajmuje. Jeśli nie pracujesz na jakimś wyjątkowo wolnym pececie to nie wiem..

Podobne pytania

0 głosów
2 odpowiedzi 244 wizyt
pytanie zadane 18 lutego 2018 w C i C++ przez Paweł Piech Użytkownik (720 p.)
0 głosów
3 odpowiedzi 669 wizyt
pytanie zadane 21 października 2018 w C i C++ przez Wroteq98 Nowicjusz (200 p.)
0 głosów
0 odpowiedzi 455 wizyt

92,631 zapytań

141,498 odpowiedzi

319,869 komentarzy

62,011 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...