2013-04-29 17 views
5

Zastanawiam się, czy istnieje lepszy sposób drukowania tablicy int w c;drukowanie wielu liczb całkowitych w tym samym czasie

W tej chwili robię printf("%d" ,..) dla każdego int w mojej tablicy.

Jednak powoduje to jedno wywołanie systemowe na int? (jeśli moje zrozumienie jest poprawne).

Byłoby lepiej przekonwertować tablicę int na bufor ciągów, a następnie wydrukować bufor w jednym wywołaniu.

Potrafię napisać kod w razie potrzeby.

Q1. czy jest to dobry pomysł, czy też zbyt wiele wysiłku, aby to było tego warte?

Q2. Czy są jakieś biblioteki, które implementują takie rzeczy. (Cokolwiek google wraca do początkujących tutoriale dla liczb całkowitych drukarskich: s)

Edit Wielkość tablicy nie jest znany przed ręką.

+0

printf ("% d% d% d% d \ n", arr [0] arr [1], opr [2]) wykonuje jedno wywołanie write() - co najwyżej wywołanie systemowe, o które się martwisz. –

+0

Tablica @jimmcnamara ma rozmiar dynamiczny .. więc nie można jej zakodować w ten sposób. Zaktualizowałem pytanie. –

+0

Pytasz o pracę w scenariuszu "wielu" wywołań systemowych. To nie jest programowe rozwiązanie, IMO. –

Odpowiedz

3

Podczas korzystania z printf dane wyjściowe są już buforowane. Wywołanie systemowe jest wykonywane tylko po "przepłukaniu" bufora - jawnie przez wywołanie fflush(stdout) lub niejawnie przez wydrukowanie \n do konsoli. Dlatego też wstępne buforowanie po stronie aplikacji sprawi, że kod będzie bardziej złożony, nie oferując żadnych rzeczywistych różnic w wydajności.

Jeśli chodzi o bibliotekę, które pomogą Ci napisać int s do ciągiem idzie, można użyć tego samego <stdio.h> że już używasz: przydziela bufor wystarczająco duże, aby utrzymać swoje całkowite, należy sprintf zamiast printf zapisu to, a następnie wywołaj printf z zawartością całego bufora. Pomoże to uniknąć przepłukiwania pod numerem \n, jeśli zdecydujesz się użyć ich jako separatorów w danych wyjściowych.

+0

dzięki. Jeśli jest buforowany to myślę, że mogę po prostu użyć printf. chociaż sprintf to dobry pomysł. –

+0

@OsamaJaved Jedyny przypadek, w którym "sprintf" byłby użyteczny, to jeśli chciałbyś użyć '\ n' jako separatora, * i * chciałeś napisać do strumienia wyjściowego związanego z konsolą (strumienie wyjściowe plików nie są przepłukiwane '\ n' tak)). – dasblinkenlight

+0

Pominąłeś niebuforowane strumienie - stdout może być ustawiony jako niebuforowany, tak jak domyślnie jest stderr. –

3

Nie, nie powoduje jednego wywołania systemowego na int, chyba że ustawiono stdout na tryb niebuforowany. To jest cały punkt stdio: buforowanie wyników dla ciebie, więc nie musisz tego robić sam. Istnieje minimalna ilość dodatkowego wywołania narzutowego dla samej funkcji printf. Jeśli znajdziesz się potrzebują większej wydajności, można spróbować czegoś takiego:

for (i=0; i+4<=N; i+=4) 
    printf("%d %d %d %d ", a[i], a[i+1], a[i+2], a[i+3]); 
for (; i<N; i++) 
    printf("%d ", a[i]); 
+0

jeśli jest zbuforowany, nie muszę się w ogóle martwić: D. Dzięki –

Powiązane problemy