Istniejącemu strumieniowi (czy standardowemu czy też plikowemu), możesz stawiać różne wymagania.
Jeśli chcesz np. aby wczytywanie danych lub zapis do/z pliku odbywało się z maksymalną szybkością, możesz osiągnąć to alokując bufor w pamięci o wielkości BUFSIZ. Często urządzenia wyjściowe (np. dyski), mają "ulubioną" wielkość porcji danych które zapisują z maksymalną prędkością (8192 lub 4092 bajtów).
Jeśli zainteresowany jesteś raportowaniem błędów lub zapisem natychmiastowym danych do pliku (strumień stderr, log aplikacji), będziesz chciał wyłączyć całkowicie buforowanie na tym strumieniu. Cokolwiek do niego trafi, natychmiast znajdzie się w pliku, konsoli lub gdziekolwiek gdzie prowadzi ostatecznie strumień.
Jeśli system ma mało pamięci a chcesz przetwarzać dane linia po linii (np. interpreter komend), najprawdopodobniej przestawisz strumień w tryb pracy liniowy.
Właśnie do tych zadań służy setbuf(...) i setvbuf(...).
Jeśli istnieje bufor na danym strumieniu, chcesz kontrolować kiedy nastąpi jego opróżnienie nie tylko gdy sam się wypełni. Być może np. chcesz by dane były w pliku teraz! Występuje to czasem np. przy okazji programowania wielowątkowego. Czasem w aplikacji otwarte jest kilka strumieni i gdy na jednym coś się pojawia, chcesz zapisać i być pewnym zapisu tej informacji w innym. Od tego masz fflush(...).