fprintf, printf 및 sprintf의 차이점은 무엇입니까?


233

사람의 차이점에 대한 간단한 영어로 설명 할 수 printf, fprintfsprintf예제와 함께?

어떤 스트림에 있습니까?

"C의 파일 처리"에 대해 읽는 동안이 세 가지가 혼동됩니다.


4
샘플 코드를 작성하여 실험 해보십시오. 그것은 그들 사이의 차이점 을 명확하게 이해하는 매우 쉬운 방법 입니다.
Nawaz

14
바보 같은 버퍼 오버플로를 피하려면 snprintf ()를 sprintf ()보다 선호하십시오.
Maxim Egorushkin

3
바보 같은 버퍼 오버플로와 불쾌한 유형 안전 버그를 피하기 위해 스트림 또는 Boost 포맷터를 선호하십시오
John Dibling

7
@Maxim, 유효한 포인트를 올리는 동안 내 버퍼가 오버플로되지 않고 내 앱이 폭발하지 않는다는 것을 알고 안전을 보장합니다. 스트림 / 부스트 포맷터로 인해 병목 현상이 발생하는 경우에만 이러한 기능을 살펴 봤습니다. :)
Moo-Juice

1
@Maxim : 포인트는 필요 없습니다. 내 코드는 병목 현상이 아닙니다. 5m / sec는 교환 할 수있는 메시지 수이며 처리 할 수있는 메시지 수는 아닙니다. 그렇다면 왜 조기에 최적화해야합니까?
John Dibling

답변:


237

C에서 "스트림"은 추상화입니다. 프로그램의 관점에서 보면 단순히 바이트의 생산자 (입력 스트림) 또는 소비자 (출력 스트림)입니다. 디스크의 파일, 파이프, 터미널 또는 프린터 나 tty와 같은 다른 장치에 해당 할 수 있습니다. FILE유형은 스트림에 대한 정보가 포함되어 있습니다. 일반적으로 FILE객체의 내용을 직접 엉망으로 만들지 않고 다양한 I / O 루틴에 포인터를 전달하면됩니다.

표준 스트림에는 세 가지 표준 스트림이 있습니다. stdin표준 입력 스트림에 stdout대한 포인터, 표준 출력 스트림에 stderr대한 포인터, 표준 오류 출력 스트림에 대한 포인터입니다. 대화식 세션에서 세 개는 일반적으로 콘솔을 참조하지만 다른 파일이나 장치를 가리 키도록 리디렉션 할 수는 있습니다.

$ myprog < inputfile.dat > output.txt 2> errors.txt

이 예에서 stdin이제 가리키는 inputfile.dat, stdout포인트 output.txtstderr포인트 errors.txt.

fprintf 서식이 지정된 텍스트를 지정한 출력 스트림에 씁니다.

printffprintf(stdout, ...)표준 출력 스트림이 현재 가리키는 곳이면 어디서나 서식이 지정된 텍스트 를 쓰고 쓰는 것과 같습니다 .

sprintfchar스트림이 아닌 형식화 된 텍스트를의 배열에 씁니다 .


4
"그것은 단순히 바이트의 생산자 (입력 스트림) 또는 소비자 (출력 스트림)입니다." 이것들은 거꾸로입니까? 생산자가 무언가를 생성 (출력)하지 않습니까? 내가 정말로 모르기 때문에 묻습니다.
Dave Voyles

6
@DaveVoyles : 프로그램 관점에서 볼 수 있습니다. 입력 스트림은 프로그램이 읽을 바이트를 생성합니다. 출력 스트림은 프로그램에서 생성 된 바이트를 소비합니다.
John Bode

153

printf표준 출력 스트림으로 출력 ( stdout)

fprintf파일 핸들로 이동합니다 ( FILE*)

sprintf할당 한 버퍼로 이동합니다. ( char*)


39

printf ( "format", args)는 종종 컴퓨터 모니터 인 표준 출력으로 데이터를 인쇄하는 데 사용됩니다.

sprintf (char *, "format", args)는 printf와 같습니다. 표준 출력 즉 모니터에 형식화 된 문자열을 표시하는 대신 형식화 된 데이터를 char 포인터 (첫 번째 매개 변수)가 가리키는 문자열에 저장합니다. 문자열 위치는 printf와 sprint 구문의 유일한 차이점입니다.

fprintf (FILE * fp, "format", args)는 다시 printf와 같습니다. 대신 모니터에 데이터를 표시하거나 일부 문자열로 저장하면 형식화 된 데이터는 파일에 저장되며 파일 포인터는 fprintf의 첫 번째 매개 변수로 사용됩니다. 파일 포인터는 printf 구문에 추가 된 유일한 것입니다.

경우 표준 출력의 파일이 fprintf와의 첫 번째 매개 변수로 사용되며, 그 작업은 다음 printf와 동등한 것으로 간주됩니다.


24

printf(...)와 같습니다 fprintf(stdout,...).

fprintf 스트림으로 출력하는 데 사용됩니다.

sprintf(buffer,...) 문자열을 버퍼로 형식화하는 데 사용됩니다.

참고가도 vsprintf, vfprintfvprintf


v맛 내가 생각이 아닌 표준
존 Dibling

8
v맛은 C 표준에 매우 확실하다.
Fred Foo

@larsmans : 아, 알았어요. 정정 주셔서 감사합니다. 이 질문은 한 지점에서 태그되었습니다 [c ++]
John Dibling

2

vsnprintf () 함수를 사용하여 매우 유용한 작업을 수행 할 수도 있습니다.

$ cat test.cc
#include <exception>
#include <stdarg.h>
#include <stdio.h>

struct exception_fmt : std::exception
{
    exception_fmt(char const* fmt, ...) __attribute__ ((format(printf,2,3)));
    char const* what() const throw() { return msg_; }
    char msg_[0x800];
};

exception_fmt::exception_fmt(char const* fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    vsnprintf(msg_, sizeof msg_, fmt, ap);
    va_end(ap);
}

int main(int ac, char** av)
{
    throw exception_fmt("%s: bad number of arguments %d", *av, ac);
}

$ g++ -Wall -o test test.cc

$ ./test
terminate called after throwing an instance of 'exception_fmt'
  what():  ./test: bad number of arguments 1
Aborted (core dumped)

실제로 +1은 유용하지만 vsnprintf비표준 기능 이라는 점에 유의하십시오 . 내가 본 대부분의 구현은 이와 같은 것을 구현하지만 구현에 따라 다릅니다.
John Dibling

1
@larsmans는 이것이 실제로 C 표준의 일부라고 위에서 언급 했으므로 다시 가져옵니다
John Dibling

2
이것이 C와 어떤 관련이 있습니까?
onemasse

2

printf

  1. printf는 화면에서 출력을 수행하는 데 사용됩니다.
  2. 구문 = printf("control string ", argument );
  3. 파일 입출력과 관련이 없습니다.

fprintf

  1. FILE 핸들이 가리키는 파일에서 쓰기 조작을 수행하는 데 사용 된 fprintf
  2. 문법은 fprintf (filename, "control string ", argument );
  3. 파일 입출력과 관련

다른 곳에서 인용 된 경우 링크로 소스를 인용하는 것이 가장 좋지만 인용 한 텍스트는 여기에 그대로 유지하십시오.
SuperBiasedMan

0

fprintf이것은 스트림과 관련이 있지만 스트림과는 관련 printf이없는 명령문 fprintf, 즉 fprintf파일 관련 스트림 과 관련됩니다.


0

sprintf : 포맷 된 데이터를 stdout 대신 메모리의 문자열에 씁니다.

sprintf의 구문은 다음과 같습니다.

#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);

여기,

문자열은 데이터를 쓸 메모리의 버퍼에 대한 포인터를 나타냅니다.

형식은 형식을 정의하는 문자열을 가리키는 포인터입니다.

각 항목은 쓸 데이터를 지정하는 변수 또는 표현식입니다.

작업이 성공하면 sprintf에 의해 반환 된 값이 0보다 크거나 같습니다. 즉, 종료 null 문자를 계산하지 않고 기록 된 문자 수가 반환되고 오류가 발생한 경우 0보다 작은 값을 반환합니다.

printf : 표준 출력으로 인쇄

printf의 구문은 다음과 같습니다.

printf format [argument]…

sprintf ()와 printf ()의 유일한 차이점은 sprintf ()는 데이터를 문자 배열에 쓰고 printf ()는 표준 출력 장치 인 stdout에 데이터를 씁니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.