본문 바로가기
C언어

C언어 입력 & 출력

by FraisGout 2020. 7. 5.

콘솔 입출력

콘솔 입출력을 이해하기 위해서는 우선 C언어의 기본적인 입출력 방식에 대해 알고 있어야 합니다.

 

버퍼(buffer)

지금까지 우리가 사용한 printf(), scanf(), puts() 함수 등은 C언어의 표준 입출력 함수입니다.

 

이러한 표준 입출력 함수를 사용할 때에는 버퍼(buffer)라는 임시 메모리 공간을 사용하게 됩니다.

 

버퍼를 사용하면서 얻을 수 있는 장점은 다음과 같습니다.

 

 

 

1. 문자를 하나씩 전달하는 것이 아닌 묶어서 한 번에 전달하므로, 전송 시간이 적게 걸려 성능이 향상됩니다.

 

2. 사용자가 문자를 잘못 입력했을 경우 수정을 할 수가 있습니다.

 

 

 

하지만 입력 작업에 버퍼를 사용하는 것이 반드시 좋은 것만은 아닙니다.

 

빠른 반응이 요구되는 게임과 같은 프로그램에서는 키를 누르는 즉시 바로 전달되어야만 합니다.

 

 

 

이렇게 버퍼를 사용하는 입력과 버퍼를 사용하지 않는 입력은 서로 다른 용도로 사용됩니다.

 

따라서 자신의 목적에 맞게 버퍼의 사용 여부를 판단해야 합니다.

 

버퍼링 방식

입출력에 사용되는 버퍼링에는 다음과 같이 두 가지 방식이 있습니다.

 

 

 

1. 완전 버퍼링(fully buffered)

 

2. 라인 버퍼링(line-buffered)

 

 

 

완전 버퍼링은 버퍼가 가득 차면 버퍼 안의 내용을 목적지로 보내는 방식입니다.

 

이 방식은 보통 파일 입출력에서 사용됩니다.

 

 

 

라인 버퍼링은 입력된 문자 중 개행 문자가 나타날 때마다 버퍼 안의 내용을 목적지로 보내는 방식입니다.

 

이 방식은 보통 키보드 입력에서 사용됩니다.

 

 

 

이러한 입력 작업뿐만 아니라 printf() 함수 등을 통해 모니터에 데이터를 출력할 때도 버퍼를 사용합니다.

 

출력하고자 하는 데이터는 일단 출력 버퍼에 저장되었다가 출력 스트림을 통해 모니터로 전송됩니다.

 

fflush() 함수

fflush() 함수는 인수로 전달된 스트림에 연결된 버퍼를 비워줍니다.

 

 

 

fflush() 함수의 원형은 다음과 같습니다.

 

원형

#include <stdio.h>

 

int fflush(FILE *stream);

 

 

 

인수로 전달되는 스트림이 입력 스트림과는 관련이 없으며, 출력 스트림과 관련이 있습니다.

 

출력 스트림이 인수로 전달되면 출력 버퍼 안에 있는 데이터를 즉시 목적지로 보내줍니다.

 

 

 

만약에 널 포인터가 인수로 전달되면, 해당 프로그램에서 앞서 정의한 모든 스트림에 대한 버퍼를 전부 비워줍니다.

 

fflush() 함수는 버퍼를 성공적으로 비우면 0을 반환하고, 버퍼를 비우는 데 실패하면 EOF를 반환합니다.

 

 

 

예제

#include <stdio.h>

 

 

 

int main(void)

 

{

 

char str[20];

 

char ch;

 

 

 

puts("당신의 이름을 적어주세요 : ");

 

scanf("%s", str);

 

puts("당신의 성별을 약자로 적어주세요 : ");

 

puts("(남성=M, 여성=F)");

 

scanf("%c", &ch);

 

 

 

if (ch=='m' | ch=='M')

 

{

 

printf("당신은 남성인 %s입니다.\n", str);

 

}

 

else if(ch=='f' | ch=='F')

 

{

 

printf("당신은 여성인 %s입니다.\n", str);

 

}

 

else

 

{

 

printf("%s, 성별을 잘못 입력하셨습니다.\n", str);

 

}

 

return 0;

 

}

 

위의 예제를 실행하면 사용자가 이름을 입력할 수 있지만, 성별은 입력하지 못하고 프로그램이 종료됩니다.

 

그 이유는 이름을 입력받을 때 마지막으로 입력한 엔터(Enter) 키가 입력 버퍼에 남아있기 때문입니다.

 

이렇게 입출력 함수는 입력 버퍼에 데이터가 남아 있으면, 키보드로부터 데이터를 입력받지 않고 버퍼에 남아있는 데이터를 먼저 사용합니다.

 

따라서 이 프로그램이 제대로 동작하기 위해서는 다음과 같이 fflush() 함수를 이용해 버퍼에 남아있는 데이터를 비워야 합니다.

 

 

 

예제

...

 

puts("당신의 이름을 적어주세요 : ");

 

scanf("%s", str);

 

 

 

fflush(stdin); // 표준 입력 스트림의 입력 버퍼를 비움

 

 

 

puts("당신의 성별을 약자로 적어주세요 : ");

 

puts("(남성=M, 여성=F)");

 

scanf("%c", &ch);

 

...

 

 

fflush()은 입력스트림과 관련이 있다고 알고 있지만, 결과적으로는 출력스트림에만 관련이 있습니다. 출력스트림으론 stdout, stderr이 있습니다. Visual Studio 2013에서는 비표준함수인 fflush()를 허용해주고 있지만, Visual Studio2015부터 비표준함수인 fflush()가 사라졌기 때문에 위의 예제에서 fflush(stdin)을 사용하더라도 똑같은 현상이 반복될 것입니다. 그렇기 때문에 입력 버퍼를 지우기 위해서는 fflush()함수가 아닌 getchar() 함수를 이용하여야 합니다.

 

예제

#include <stdio.h>

 

 

 

int main(void)

 

{

 

char str[20];

 

char ch;

 

 

 

puts("당신의 이름을 적어주세요 : ");

 

scanf("%s", str);

 

getchar()

 

 

 

puts("당신의 성별을 약자로 적어주세요 : ");

 

puts("(남성=M, 여성=F)");

 

scanf("%c", &ch);

 

 

 

if (ch=='m' | ch=='M')

 

{

 

printf("당신은 남성인 %s입니다.\n", str);

 

}

 

else if(ch=='f' | ch=='F')

 

{

 

printf("당신은 여성인 %s입니다.\n", str);

 

}

 

else

 

{

 

printf("%s, 성별을 잘못 입력하셨습니다.\n", str);

 

}

 

return 0;

 

}

 

위의 예제에서 getchar()함수를 이용하면 이름을 입력받을 때 마지막으로 입력한(Enter)키를 입력버퍼에서 비워주기 때문에 프로그램이 정상적으로 작동합니다. fflush()함수는 출력스트림만 관련있기 때문에 fflush()함수를 이용해 입력버퍼를 비우기보다는 getchar()함수를 이용하여 입력버퍼를 지워주셔야 합니다.

 

파일(file)이란?

파일(file)이란 의미 있는 정보를 담고 있으며, 이름을 가지고 있는 저장 장치상의 논리적인 단위를 의미합니다.

 

C언어에서는 이러한 파일을 바이트별로 따로 읽을 수 있는 연속적인 바이트의 집합으로 취급합니다.

 

파일의 종류

컴퓨터는 파일을 다음과 같이 두 가지 종류로 나누어서 다룹니다.

 

 

 

1. 바이너리 파일(binary file)

 

2. 텍스트 파일(text file)

 

 

 

바이너리 파일은 데이터의 저장과 처리를 목적으로 01의 이진 형식으로 인코딩된 파일을 가리킵니다.

 

프로그램이 이 파일의 데이터를 읽거나 쓸 때는 데이터의 어떠한 변환도 일어나지 않습니다.

 

 

 

텍스트 파일은 사람이 알아볼 수 있는 문자열로 이루어진 파일을 가리킵니다.

 

프로그램이 이 파일의 데이터를 읽거나 쓸 때는 포맷 형식에 따라 데이터의 변환이 일어납니다.

 

파일의 입출력

파일의 입출력을 이해하기 위해서는 우선 스트림에 대해 알고 있어야 합니다.

 

C언어에서 콘솔 장치에 대한 스트림은 프로그램 실행 시 자동으로 생성되며, 프로그램 종료 시 자동으로 소멸합니다.

 

하지만 파일과의 연결을 위한 스트림은 사용자가 직접 생성하고 소멸시켜야 합니다.

 

 

 

C언어에서 파일에 대한 입출력 동작은 다음과 같은 순서에 따라 진행됩니다.

 

 

 

1. 파일과의 스트림 생성

 

2. FILE 구조체 변수의 포인터를 이용한 작업 진행

 

3. 파일과의 스트림 종결

 

fopen() 함수

fopen() 함수는 파일을 열어주는 함수입니다.

 

파일을 연다는 것은 파일과의 입출력을 위한 스트림을 생성한다는 의미입니다.

 

 

 

fopen() 함수의 원형은 다음과 같습니다.

 

원형

#include <stdio.h>

 

FILE *fopen(const char * restrict filename, const char * restrict mode);

 

 

 

fopen() 함수의 첫 번째 인수는 열고자 하는 파일의 이름과 그 경로를 가지고 있는 문자열입니다.

 

두 번째 인수는 파일을 여는 데 사용할 모드를 지정하는 문자열입니다.

 

모드 문자열은 파일의 사용 용도를 결정하는 문자열과 파일의 데이터를 어떤 방식으로 입출력할지 결정하는 문자열로 구성됩니다.

 

모드 문자열

fopen() 함수는 파일을 여는 데 사용할 모드 문자열을 두 번째 인수로 전달받습니다.

 

이 모드 문자열은 파일의 사용 용도를 결정하고, 파일의 데이터를 어떤 방식으로 입출력할지를 결정합니다.

 

 

 

우선 파일의 사용 용도를 결정하는데 사용할 수 있는 모드 문자열은 다음과 같습니다.

 

 

 

1. r (read mode) : 읽기 전용 모드

 

2. w (write mode) : 쓰기 전용 모드

 

3. a (append mode) : 추가 모드

 

 

 

그리고 파일의 데이터를 어떤 방식으로 입출력할지를 결정하는 사용할 수 있는 모드 문자열은 다음과 같습니다.

 

 

 

1. t (text mode) : 해당 파일의 데이터를 텍스트 파일로 인식하고 입출력함.

 

2. b (binary mode) : 해당 파일의 데이터를 바이너리 파일로 인식하고 입출력함.

 

 

 

또한, 추가적으로 다음과 같은 모드 문자열을 사용할 수 있습니다.

 

 

 

1. x (exclusive mode) : 열고자 하는 파일이 이미 존재하면 파일 개방에 실패함.

 

2. + (update mode) : 파일을 읽을 수도 있고 쓸 수도 있는 모드

 

 

 

따라서 fopen() 함수에서 사용할 수 있는 모드 문자열의 조합은 다음과 같습니다.

 

모드 문자열

설명

r

파일을 오로지 읽는 것만 가능한 텍스트 모드로 개방함.

w

파일을 쓰는 것만이 가능한 텍스트 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 모든 데이터를 지우고 개방함.

wx

파일을 쓰는 것만이 가능한 텍스트 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 파일 개방에 실패함.

a

파일을 쓰는 것만이 가능한 텍스트 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 맨 끝에서부터 데이터를 추가함.

rb

파일을 오로지 읽는 것만 가능한 바이너리 모드로 개방함.

wb

파일을 쓰는 것만이 가능한 바이너리 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 모든 데이터를 지우고 개방함.

wbx

파일을 쓰는 것만이 가능한 바이너리 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 파일 개방에 실패함.

ab

파일을 쓰는 것만이 가능한 바이너리 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 맨 끝에서부터 데이터를 추가함.

r+

파일을 읽고 쓰는 것이 둘 다 가능한 텍스트 모드로 개방함.

w+

파일을 읽고 쓰는 것이 둘 다 가능한 텍스트 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 모든 데이터를 지우고 개방함.

w+x

파일을 읽고 쓰는 것이 둘 다 가능한 텍스트 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 파일 개방에 실패함.

a+

파일을 읽고 쓰는 것이 둘 다 가능한 텍스트 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 맨 끝에서부터 데이터를 추가함.

읽기는 전체를 읽을 수 있지만, 쓰기는 파일의 맨 끝에만 추가할 수 있음.

r+b 또는 rb+

파일을 읽고 쓰는 것이 둘 다 가능한 바이너리 모드로 개방함.

w+b 또는 wb+

파일을 읽고 쓰는 것이 둘 다 가능한 바이너리 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 모든 데이터를 지우고 개방함.

w+bx 또는 wb+x

파일을 읽고 쓰는 것이 둘 다 가능한 바이너리 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 파일 개방에 실패함.

a+b 또는 ab+

파일을 읽고 쓰는 것이 둘 다 가능한 바이너리 모드로 개방함.

파일이 없으면 새 파일을 만들고, 파일이 있으면 해당 파일의 맨 끝에서부터 데이터를 추가함.

 

 

프로그램이 성공적으로 파일을 열면, fopen() 함수는 FILE 구조체 변수의 포인터를 반환합니다.

 

만약에 해당 파일을 열 수 없으면, fopen() 함수는 널 포인터를 반환합니다.

 

FILE 구조체 변수의 포인터

FILE 구조체 변수의 포인터는 해당 파일이 사용하는 버퍼 정보를 비롯한 파일에 관한 정보가 들어있는 데이터를 가리킵니다.

 

따라서 모든 파일 입출력 함수는 FILE 구조체 변수의 포인터를 인수로 전달받아 해당 파일에 접근합니다.

 

fclose() 함수

fclose() 함수는 파일을 닫아주는 함수입니다.

 

파일을 닫는다는 것은 파일과의 입출력을 위해 생성한 스트림을 소멸시키는 것을 의미합니다.

 

, 버퍼에 남아있는 데이터를 파일로 완전히 내보내고, 파일 입출력을 위해 내부적으로 생성했던 FILE 구조체를 해제합니다.

 

C언어에서 다 사용한 파일은 반드시 fclose() 함수를 사용하여 닫아줘야 합니다.

 

 

 

fclose() 함수의 원형은 다음과 같습니다.

 

원형

#include <stdio.h>

 

int fclose(FILE *stream);

 

 

 

fclose() 함수는 인수로 닫고자 하는 파일을 가리키는 FILE 구조체 변수의 포인터를 전달받습니다.

 

이 함수는 파일을 성공적으로 닫으면 0을 반환하고, 해당 파일을 닫지 못했다면 EOF를 반환합니다.

 

 

 

다음 예제는 단순히 파일을 여닫는 동작을 하는 예제입니다.

 

예제

#include <stdio.h>

 

#include <stdlib.h>

 

 

 

int main(void)

 

{

 

/* 파일 open */

 

FILE* ptr_file = fopen("example.txt", "w+");

 

if (ptr_file == NULL) // 파일을 열 수가 없다면, fopen() 함수는 널 포인터를 반환함.

 

{

 

puts("파일을 열 수가 없습니다!");

 

exit(1); // 현재의 C프로그램 자체를 완전 종료하고, 운영체제에 1을 반환함.

 

}

 

else

 

{

 

puts("파일을 성공적으로 열었습니다!");

 

}

 

 

 

/* 파일 close */

 

if (fclose(ptr_file)!=0) // fclose() 함수는 파일을 성공적으로 닫으면 0을 반환함.

 

{

 

puts("파일을 닫을 수가 없습니다!");

 

exit(1);

 

}

 

else

 

{

 

puts("파일을 성공적으로 닫았습니다!");

 

}

 

return 0;

 

}

 

위의 예제는 모드 문자열로 전달된 "w+"의 정의에 따라, 해당 파일을 쓰는 것만이 가능한 텍스트 모드로 열어줍니다.

 

이때 파일이 없으면 새 파일을 만들며, 파일이 존재하면 해당 파일의 모든 데이터를 지우고 파일을 열게 됩니다.

 

 

 

따라서 처음 이 프로그램을 동작시키면, 해당 이름의 파일이 존재하지 않으므로 현재 디렉터리에 example.txt라는 파일이 생성될 것입니다.

 

그 파일에 임의의 문자열을 입력하고 저장한 후, 이 프로그램을 다시 실행시키면 해당 파일의 모든 내용이 지워지는 것을 확인할 수 있습니다.

 

 

파일 입출력 함수

C언어에서 인수를 하나만 전달받는 대부분의 입출력 함수는 스트림이 stdin이나 stdout으로 고정되어 있는 함수입니다.

 

하지만 입출력 함수 중에서 이름이 f로 시작되는 함수는 입출력 스트림을 사용자가 직접 지정할 수 있는 함수입니다.

 

인수로 FILE 구조체 변수의 포인터를 전달함으로써 표준 입출력 장치뿐만 아니라 파일로도 입출력을 진행할 수 있습니다.

 

 

 

표준 입출력 함수 중에서 스트림을 직접 지정할 수 있는 함수는 다음과 같습니다.

 

 

 

1. fgetc() 함수

 

2. fputc() 함수

 

3. fgets() 함수

 

4. fputs() 함수

 

5. fscanf() 함수

 

6. fprintf() 함수

 

fgetc() 함수

fgetc() 함수는 지정된 스트림으로부터 하나의 문자를 읽어 들이는 함수입니다.

 

이 함수는 읽기에 성공하면 읽은 문자를 반환하고, 파일의 끝에 도달하면 EOF를 반환합니다.

 

 

 

fgetc() 함수의 원형은 다음과 같습니다.

 

원형

#include <stdio.h>

 

int fgetc(FILE *stream);

 

fputc() 함수

fputc() 함수는 지정된 스트림에 문자 하나를 출력(저장)하는 함수입니다.

 

이 함수는 저장에 성공하면 저장한 문자를 반환하고, 저장에 실패하면 EOF를 반환합니다.

 

 

 

fputc() 함수의 원형은 다음과 같습니다.

 

원형

#include <stdio.h>

 

int fputc(int c, FILE *stream);

 

 

 

다음 예제는 fputc() 함수와 fgetc() 함수를 이용하여, 해당 파일의 모든 문자를 한 문자씩 읽어 들여 출력하는 예제입니다.

 

예제

#include <stdio.h>

 

#include <stdlib.h>

 

 

 

int main(void)

 

{

 

char ch;

 

 

 

/* 파일 open */

 

FILE* ptr_file = fopen("text_readonly.txt", "r"); // "C언어 파일 입출력" 문자열이 저장된 파일

 

...

 

if(ptr_file != NULL)

 

{

 

while(EOF != (ch = fgetc(ptr_file))) // fgetc() 함수를 사용하여 파일로부터 문자 한 개를 읽어들임.

 

{

 

fputc(ch, stdout); // fputc() 함수를 사용하여 모니터에 문자 한 개를 출력함.

 

}

 

}

 

 

 

/* 파일 close */

 

...

 

return 0;

 

}

 

위 예제의 번 라인에서는 fgetc() 함수가 반환하는 값을 char형 변수인 ch에 저장하고 있습니다.

 

하지만 C언어의 fgetc() 함수는 char형이 아닌 int형의 값을 반환하는 함수입니다.

 

, 위 예제에서는 int형으로 반환된 값을 char형 변수에 저장하는 것이므로, 반환값의 상위 3바이트가 잘려나가게 될 것입니다.

 

 

 

따라서 파일의 끝에 도달했을 때 반환되는 EOF 값인 -116진수 값 '0xFFFFFFFF''0xFF'로 저장될 것입니다.

 

그러므로 while 문은 현재 파일의 끝인 EOF를 읽은 것인지, 아니면 단순히 16진수 데이터인 '0xFF'를 읽은 것인지를 알 수가 없게 됩니다.

 

 

 

또한, EOF와 변수 ch를 비교할 때 EOFint형 값이므로, 변수 chchar형 값은 int형 값으로 자동 변환됩니다.

 

이때 만약 변수 chsigned char형이라면, EOF'0xFFFFFFFF'로 제대로 변환되므로 별문제가 발생하지 않습니다.

 

하지만 변수 chunsigned char형이라면, EOF'0x000000FF'로 변환되므로 위의 while 문은 무한히 반복될 것입니다.

 

 

 

위와 같은 문제점을 가지고 있으므로, fgetc() 함수의 반환값은 다음과 같이 반드시 int형 변수로 저장해야 합니다.

 

예제

int main(void)

 

{

 

int ch;

 

...

 

if(ptr_file != NULL)

 

{

 

while(EOF != (ch = fgetc(ptr_file))) // fgetc() 함수를 사용하여 파일로부터 문자 한 개를 읽어들임.

 

{

 

fputc(ch, stdout); // fputc() 함수를 사용하여 모니터에 문자 한 개를 출력함.

 

}

 

}

 

...

 

}

 

fgets() 함수

fgets() 함수는 지정된 스트림으로부터 문자열을 읽어 들이는 함수입니다.

 

 

 

fgets() 함수의 원형은 다음과 같습니다.

 

원형

#include <stdio.h>

 

char *fgets(char * restrict s, int n, FILE * restrict stream)

 

 

 

이 함수의 첫 번째 인수는 읽은 문자열이 저장될 주소이며, 세 번째 인수는 스트림을 결정할 FILE 구조체 변수의 포인터입니다.

 

두 번째 인수로 전달받은 최대 입력 문자 개수보다 하나 적은 수의 문자를 읽거나, 파일의 끝에 도달할 때까지 문자를 읽습니다.

 

이 함수는 읽기에 성공하면 읽은 문자열이 저장된 주소를 반환하고, 파일의 끝에 도달하거나 읽기에 실패하면 NULL을 반환합니다.

 

 

 

fgets() 함수는 문자를 읽어 들이는 도중에 개행 문자('\n')를 만나게 되면 곧바로 읽기를 종료합니다.

 

그리고 지금까지 읽어 들인 문자들이 C언어에서 문자열로 인식되도록 맨 마지막에 널 문자('\0')를 자동으로 추가해 줍니다.

 

fputs() 함수

fputs() 함수는 지정된 스트림에 문자열을 출력(저장)하는 함수입니다.

 

 

 

fputs() 함수의 원형은 다음과 같습니다.

 

원형

#include <stdio.h>

 

int fputs(const char * restrict s, FILE * restrict stream);

 

 

 

이 함수의 첫 번째 인수는 쓰고자 하는 문자열의 주소이며, 두 번째 인수는 스트림을 결정할 FILE 구조체 변수의 포인터입니다.

 

인수로 전달된 스트림이 stdout이면 모니터에 문자열을 출력하고, 파일이면 문자열을 해당 파일에 저장합니다.

 

이 함수는 쓰기(저장)에 성공하면 음수가 아닌 값을 반환하고, 저장에 실패하면 EOF를 반환합니다.

 

 

 

다음 예제는 fputs()함수와 fgets() 함수를 이용하여, 파일에서 문자열을 읽어 들여 다른 파일로 옮겨 저장하는 예제입니다.

 

예제

#include <stdio.h>

 

#include <stdlib.h>

 

 

 

int main(void)

 

{

 

char str[100];

 

 

 

/* 파일 open */

 

FILE* ptr_src = fopen("text_readonly.txt", "r");

 

FILE* ptr_dst = fopen("text_writeonly.txt", "w");

 

...

 

while(fgets(str, 100, ptr_src) != NULL) // fgets() 함수를 사용하여 파일로부터 문자열을 읽어들임.

 

{

 

fputs(str, ptr_dst); // fputs() 함수를 사용하여 파일에 문자열을 옮겨적음.

 

}

 

puts("text_readonly.txt 파일의 모든 내용이 text_writeonly.txt 파일로 옮겨졌습니다.");

 

 

 

/* 파일 close */

 

...

 

return 0;

 

}

 

fscanf() 함수

fscanf() 함수는 지정된 스트림으로부터 다양한 서식 변환 문자를 이용하여 문자열을 읽어 들이는 함수입니다.

 

 

 

fscanf() 함수의 원형은 다음과 같습니다.

 

원형

#include <stdio.h>

 

int fscanf(FILE * restrict stream, const char * restrict format, ...);

 

 

 

이 함수의 첫 번째 인수는 스트림을 결정할 FILE 구조체 변수의 포인터이며, 두 번째 인수는 읽어 들일 문자열의 서식입니다.

 

이 함수는 읽기에 성공하면 읽어 들인 변수의 개수를 반환하고, 읽기에 실패하면 EOF를 반환합니다.

 

fprintf() 함수

fprintf() 함수는 지정된 스트림에 다양한 서식 변환 문자를 이용하여 문자열을 출력(저장)하는 함수입니다.

 

 

 

fprintf() 함수의 원형은 다음과 같습니다.

 

원형

#include <stdio.h>

 

int fprintf(FILE * restrict stream, const char * restrict format, ...);

 

 

 

이 함수의 첫 번째 인수는 스트림을 결정할 FILE 구조체 변수의 포인터이며, 두 번째 인수는 출력할 문자열의 서식입니다.

 

이 함수는 쓰기(저장)에 성공하면 저장한 문자열의 크기를 바이트 단위로 반환하고, 실패하면 음수를 반환합니다.

 

 

 

다음 예제는 fprintf()함수와 fscanf() 함수를 이용해 서식에 맞춰 문자열을 읽어 들여 모니터에 출력하는 예제입니다.

 

예제

#include <stdio.h>

 

#include <stdlib.h>

 

 

 

int main(void)

 

{

 

int scan_num, int_num;

 

double double_num;

 

char str[100];

 

 

 

/* 파일 open */

 

FILE* ptr_file = fopen("text_fscanf.txt", "r");

 

...

 

// fscanf 함수를 사용하여 파일로부터 문자열을 서식에 맞춰서 읽어들임.

 

while(scan_num = (fscanf(ptr_file, "%d %lf %s", &int_num, &double_num, str)) != EOF)

 

{

 

// fprintf 함수를 사용하여 모니터에 서식에 맞춰서 문자열을 옮겨적음.

 

fprintf(stdout, "%d %f %s\n", int_num, double_num, str);

 

}

 

 

 

/* 파일 close */

 

...

 

return 0;

 

}

'C언어' 카테고리의 다른 글

C언어 컴파일  (0) 2020.07.05
C언어 선행처리  (0) 2020.07.05
C언어 구조체  (0) 2020.07.05
C언어 문자  (0) 2020.07.05
C언어 메모리  (0) 2020.07.05

댓글