파도가 칠 때는 서핑을

Soon as possible

Wait!

공부/C\C++

[C/C++] write와 printf의 혼용으로 인한 문제 (printf 출력 순서 이상)

hyeonhki 2021. 3. 31. 16:15
728x90

write와 printf의 혼용 문제

printf 구현 과정 중, 구현한 printf를 main 함수에서 결과를 확인하는 과정에서 출력 순서가 이상하게 도출되었다.
printf 구현 중에는 write 함수만 사용했기에, printf와 write 함수가 혼용되면서 생긴 문제였다.

뭐가 문제인지 몰라 printf출력 순서 이상하다고 검색 참 많이 했다.


int main()
{
    write(1, "1", 1);
    printf("23");
    write(1, "4", 1);
    printf("56");
    write(1,"7", 1);
}

출력 결과는 놀랍게도 1472356으로 나온다.
보이는 것 처럼 write로 인한 출력결과가 먼저 나오고 printf의 출력 결과는 나중에 나오게 된다.

이러한 이유는 write 함수는 버퍼에 있는 내용을 그대로 출력하지만, printf 함수는 표준 출력 모드로 동작하여 종료 문자(\n, \0)을 만났을 때 내용을 출력하기 때문!

해결 방법 1. fflush

int main()
{
    write(1, "1", 1);
    printf("23");
    fflush(stdout); //printf 이후 버퍼 비우기
    write(1, "4", 1);
    printf("56");
    fflush(stdout); //printf 이후 버퍼 비우기
    write(1,"7", 1);
}

다음과 같이 printf 사용후 fflush를 사용해준다.
fflush(stdout)은 버퍼 안에 데이터를 강제로 비운다.

해결 방법 2. setbuf

int main()
{
    setbuf(stdout, NULL); //<stdio.h>
    write(1, "1", 1);
    printf("23");
    write(1, "4", 1);
    printf("56");
    write(1,"7", 1);
}

setbuf는 스트림 버퍼를 설정하는 함수다.

void setbuf(FILE *fp, char *buf)
//fp는 버퍼를 설정할 파일 포인터
//buf는 버퍼로 사용할 배열 공간 주소

stdout 같은 터미널은 line buffer로 지정되면서 개행문자를 만나야 화면에 출력된다.

buf 인자에 NULL을 넣게되면 none buffer를 의미하며 null이 아닌 값을 넣게 되면 해당 버퍼를 full buffer로 사용하게 된다.
쓰기 작업을 하자마자 바로 출력된다는 말!

📚 참고 서적 및 웹사이트

728x90