[C언어] 파일 문자열 입출력 fprintf() , fscanf() , printf() , scanf() , sprintf() , sscanf()
COM2008. 2. 14. 20:33 |fprintf()
fprintf() 는 출력(print)함수이다. 첫번째 f 의 의미는 file 이고, 마지막 f의 의미는 formatted 이다.
conversion specification (또는 format) 을 통해 출력을 제어할 수 있다. 이러한 문자열을 제어 문자열이라고 한다. 또 이함수는 임의의 개수의 인자를 출력할수 있다.
다음은 fprintf() 의 함수 프로토타입이다.
int fprintf( FILE* , const char* , ... );
리턴값은 출력된 문자의 수이다. 에러시 EOF 를 리턴한다.
구문형식은 다음과 같다.
fprintf ( file_pointer , control_string , other_arguments ) ;
첫번째 파라미터인 파일포인터는 출력장소를 가리킨다. 출력방식은 텍스트 형식이다.
예. fprintf( fp, "She sells %d %s for $%f", 99, "sea shells", 3.77);
여기서 control_string 은 "She sells %d %s for $%f" 이고,
other_arguments 는 99, "sea shells", 3.77이다.
ohter_arguments의 수식은 평가되고, 제어 문자열의 대응되는 변환명세에 따라 변환되어 출력스트림에 놓여진다.
% 기호는 변환 명세의 시작을 나타내고, 변환문자로 끝난다. %와 변환 문자 사이에는 그밖에 부가적인 정보들이 올 수 있다.
fprintf() 의 변환문자
c char 형
d, i int 형 , 10진수
u unsigned 형, 10진수
o unsigned 형, 8진수
x, X unsigned 형, 16진수
e, E 지수형 e 또는 E
f float 형
g, G e 형식과 f 형식중 또는 E 형식과 f 형식중 짧은 쪽
s 문자열
p void* 형, 16진수
n 정수형 포인터, 현재까지 출력된 문자의 개수.
% %%형식으로 %을 출력스트림에 쓴다. 대응인자 없음
변환명세의 시작인 % 와 끝인 변환문자 사이에 다음과 같은 것들이 순서대로 올 수 있다.
flag 문자
- 좌측정렬, -가 없다면 디폴트는 우측임
+ singned 변환에서, 음이 아닌수 앞에 + 기호 붙임
공백 signed 변환에서, 음아닌 수앞에 공백을 붙임, + 플래그와 동시에 사용되면 공백플래그는 무시됨
# 변환문자에 따라 선택적인 형태로 변환시킨다.
#o(8진수) : 앞에 0 을 붙인다.
#x(16진수) : 앞에 0x 를 붙인다.
#g, 또는 #G : 소숫점 뒤에 0 들을 출력시킨다.
0 공백대신 0 으로 채운다. 0x 나 0X 는 이러한 0 앞에 출력된다.
* 필드폭과 정밀도를 대응인자로 받을 수 있다.
*.* 라고 하면, 첫번째 * 플래그 는 필드폭과 정렬을 받는다. 음수가 오면 - 플래그를 받은것과 같다.
두번째 * 플래그는 정밀도이다. 양수가 입력되어야 하고, 음수이면 정밀도를 명시하지 않은것과 같다.
예. fprintf(fp,"%*.*d",-4,10,n); 라고 하면, 이것은 fprintf(fp,"%-4.10d",n); 와 같다.
field width (필드폭)
필드폭은 양의 정수로 입력한다.
precision (정밀도)
정밀도는 점(.) 과 양의정수로 입력된다.
정수형 변환에서는, 최대자릿수이고,
실수형 변환에서는, 소숫점 이하 자리수를 표시한다
h 또는 l 또는 L
h는 short , l 은 long , L 도 long 인데 실수형에만 쓰인다.
참고로 long float 는 double 을 나타냄
----------------------------------------------------------------------------------------------------
fscanf()
fscanf()는 fprintf() 에 대응되는 입력함수로, 상당히 유사하다.
다음은 fscanf() 의 함수 프로토타입이다.
int fscanf( FILE* , const char* , ... );
리턴값은 성공적으로 입력받은 개수이다. 파일 끝을 만나면 EOF 를 리턴한다.
구문형식은 다음과 같다.
fscanf ( file_pointer , control_string , other_arguments ) ;
변환명세의 시작은 fprintf() 와 마찬가지로 %로 시작한다. 이때, 변환명세의 대응인자들은 포인터가 온다.
fscanf() 의 변환문자
c char 형
d, i int 형, 10진수
u unsigned 형, 10진수
o unsigned 형, 8진수
x, X unsigned 형, 16진수
f float 형, e,E,g,G 도 마찬가지
s 공백없는문자열, 공백이 있으면 멈추고, 공백전까지 끊어서 한 문자열로 받음
단, 처음에 나오는 공백은 무시한다. 즉, 시작은 공백이 아닌 문자가 나올때 부터 시작한다.
p void* 형, 보통 부호없는 16진수로 받음
n Nothing is expected; instead, the number of characters consumed thus far from the input
is stored through the next pointer, which must be a pointer to int.
This is not a conversion, although it can be suppressed with the * flag.
The C standard says: `Execution of a %n directive does not increment the assignment
count returned at the completion of execution' but the Corrigendum seems to contradict this.
Probably it is wise not to make any assumptions on the effect of %n conversions
on the return value.
%n 은 입력스트림으로 부터 받는것이 아니라, 지금까지 읽어드린 문자의 개수를 저장한다.
대응되는 인자는 정수형 포인터이다.
( scanf 의 인자는 어차피 포인터이니, 실제적으로는 정수형 변수와 대응된다고 생각하면 된다. )
% 입력스트림에서 하나의 %와 짝을 이룬다. 대응인자는 없다.
[...] 조건 문자열.
%[ ] 에서, [ ] 안에 들어가는 문자들을 scan set 이라고 한다. 스캔 집합 내의 문자들만 받아들인다.
반대로, ^ 로 시작하면, 스캔 집합 내의 문자들 외의 문자들만 받아들인다. 이 규칙을 벗어나면 멈추고
그 전까지 끊어서 문자열을 받는다.
가령 %[AB \n\t] 라고 하면, 'A', 'B', 공백, 줄바꿈, 탭 만 받아들이고, 이를 어겨야 중단된다.
사용 가능한 flag들. %와 변환문자 사이에 온다.
h 또는 l 또는 L h 는 short 를 l 과 L 은 long 인데, L은 실수형에만 가능하다.
scan filed 폭 %와 변환문자 사이에 양의 정수를 넣으면, 최대스캔폭을 지정할 수 있다.
폭을 넘어가는 입력은 무시한다.
* 입력무시
예. scanf("%*d%s",str);
제어문자열이 포함하는 문자.
여백 입력스트림에 있을수 있는 공백과 대응된다.
문자 ( 공백아니고, %도 아닌) 입력스트림의 문자와 대응되어야 한다.
----------------------------------------------------------------------------------------------------
stdio.h 에는 다음과 같은 파일 포인터가 정의되어있다. 모두 FILE* 형이다.
stdout 표준출력 화면으로 연결됨
stdin 표준입력 키보드로 연결됨
stderr 표준에러 화면으로 연결됨
따라서, fprintf( stdout , ... , ... ) 으로 하면 화면에 찍는다. 이것은 printf() 와 같다.
printf()
printf( ... ) = fprintf( stdout , ... )
마찬가지로, fscanf( stdin , ... , ... ) 으로 하면 키보드로 부터 입력을 받는다. 이것은 scanf() 와 같다.
scanf()
scanf( ... ) = fscanf( stdin , ... )
----------------------------------------------------------------------------------------------------
파일을 입출력 받을 장소가 문자열일때는 sprintf() 와 sscanf() 쓸 수 있다.
sprintf()
프로토타입은 다음과 같다.
int sprintf( char * , const char * , ... ) ;
첫번째 인자가 가리키는 문자열에 쓴다.
scanf()
프로토타입은 다음과 같다.
int sscanf( const char* , const char * , ... );
첫번째 인자가 가리키는 문자열로 부터 입력을 받는다.