사람의 차이점에 대한 간단한 영어로 설명 할 수 printf
, fprintf
및 sprintf
예제와 함께?
어떤 스트림에 있습니까?
"C의 파일 처리"에 대해 읽는 동안이 세 가지가 혼동됩니다.
사람의 차이점에 대한 간단한 영어로 설명 할 수 printf
, fprintf
및 sprintf
예제와 함께?
어떤 스트림에 있습니까?
"C의 파일 처리"에 대해 읽는 동안이 세 가지가 혼동됩니다.
답변:
C에서 "스트림"은 추상화입니다. 프로그램의 관점에서 보면 단순히 바이트의 생산자 (입력 스트림) 또는 소비자 (출력 스트림)입니다. 디스크의 파일, 파이프, 터미널 또는 프린터 나 tty와 같은 다른 장치에 해당 할 수 있습니다. FILE
유형은 스트림에 대한 정보가 포함되어 있습니다. 일반적으로 FILE
객체의 내용을 직접 엉망으로 만들지 않고 다양한 I / O 루틴에 포인터를 전달하면됩니다.
표준 스트림에는 세 가지 표준 스트림이 있습니다. stdin
표준 입력 스트림에 stdout
대한 포인터, 표준 출력 스트림에 stderr
대한 포인터, 표준 오류 출력 스트림에 대한 포인터입니다. 대화식 세션에서 세 개는 일반적으로 콘솔을 참조하지만 다른 파일이나 장치를 가리 키도록 리디렉션 할 수는 있습니다.
$ myprog < inputfile.dat > output.txt 2> errors.txt
이 예에서 stdin
이제 가리키는 inputfile.dat
, stdout
포인트 output.txt
및 stderr
포인트 errors.txt
.
fprintf
서식이 지정된 텍스트를 지정한 출력 스트림에 씁니다.
printf
fprintf(stdout, ...)
표준 출력 스트림이 현재 가리키는 곳이면 어디서나 서식이 지정된 텍스트 를 쓰고 쓰는 것과 같습니다 .
sprintf
char
스트림이 아닌 형식화 된 텍스트를의 배열에 씁니다 .
printf ( "format", args)는 종종 컴퓨터 모니터 인 표준 출력으로 데이터를 인쇄하는 데 사용됩니다.
sprintf (char *, "format", args)는 printf와 같습니다. 표준 출력 즉 모니터에 형식화 된 문자열을 표시하는 대신 형식화 된 데이터를 char 포인터 (첫 번째 매개 변수)가 가리키는 문자열에 저장합니다. 문자열 위치는 printf와 sprint 구문의 유일한 차이점입니다.
fprintf (FILE * fp, "format", args)는 다시 printf와 같습니다. 대신 모니터에 데이터를 표시하거나 일부 문자열로 저장하면 형식화 된 데이터는 파일에 저장되며 파일 포인터는 fprintf의 첫 번째 매개 변수로 사용됩니다. 파일 포인터는 printf 구문에 추가 된 유일한 것입니다.
경우 표준 출력의 파일이 fprintf와의 첫 번째 매개 변수로 사용되며, 그 작업은 다음 printf와 동등한 것으로 간주됩니다.
printf(...)
와 같습니다 fprintf(stdout,...)
.
fprintf
스트림으로 출력하는 데 사용됩니다.
sprintf(buffer,...)
문자열을 버퍼로 형식화하는 데 사용됩니다.
참고가도 vsprintf
, vfprintf
및vprintf
v
맛 내가 생각이 아닌 표준
v
맛은 C 표준에 매우 확실하다.
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)
vsnprintf
비표준 기능 이라는 점에 유의하십시오 . 내가 본 대부분의 구현은 이와 같은 것을 구현하지만 구현에 따라 다릅니다.
printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
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에 데이터를 씁니다.