<개인공부>/[C언어, C++]

[C언어/C++] fgets, fputs 함수에 대해서

BlockDMask 2020. 6. 22. 11:04
반응형

안녕하세요. BlockDMask 입니다.

지난 시간에 fgetc, fputc 함수를 이용해서 파일에 문자 하나씩 읽고, 하나씩 쓰는 함수에 대해서 알아보았습니다.

이번 시간에는 그 파일들을 열어서 문자열을 읽고 쓰는 함수에 대해서 알아보려고 합니다.

 

▶ 파일에 문자를 하나씩 읽고 쓰는 함수 fgetc, fputc에 대해서 알고싶다면 [바로가기]

파일을 열고 닫을 수 있는 파일 입출력 함수 fopen, fclose 에 대해서 알고싶다면 [바로가기]

▶ c++ 파일 입출력 함수들을 모아놓은 ofstream, ifstream에 대해서 알고싶다면 [바로가기]

 

<목차>

1. fputs, fgets 함수 원형과 매개변수.

2. 문자열을 입력하고 출력하는 fputs, fgets 함수 예제.

 

 

1. fputs, fgets 함수 원형과 매개변수.

 

▶ fputs 함수

함수원형 : int fputs(const char* str, FILE* pFile);

 

: 함수이름인 fputs는 file + put + string? stream? 을 조합한 이름 입니다.

파일에 string 타입을 put 한다.

즉, 파일에 문자열을 쓰는 함수입니다.

 

: 함수설명

첫번째 인자 : 파일에 쓸 문자열을 넣으면 됩니다. c언어 스타일의 문자열 입니다.

두번째 인자 : 파일의 파일 포인터를 집어 넣습니다.

반환형 : 집어넣은 문자의 수, 문자열의 길이. 보통은 반환형을 0 이상일때는 정상적으로 함수가 작동했고 0보다 작을땐 비정상적으로 함수가 완료되었다. 를 판단 하기위해 사용합니다.

 

: 함수동작

함수는 이렇게 동작을 합니다. 

매개 변수로 들어온 str 문자열을 해당 파일에 씁니다. 문자열을 성공적으로 집어 넣었을때는 0 이상인 값을 반환합니다.

 

: 함수 사용법 간단 버전

FILE* pFile = fopen("test.txt", "w"); // 파일을 만들고 오픈합니다.

fputs("blockdamsk",pFile); // 문자열 'blockdmask’를 만든 파일에 집어 넣습니다.

fclose(pFile); // 파일을 닫습니다.

 

 

▶ fgets 함수

함수원형 : char* fgets(char* str, int num, FILE* pFile);

 

: 함수이름인 fgets는 file + get + string? stream? 을 조합한 이름입니다.

파일에서 부터 string(=문자열)을 get 가지고 옵니다.

즉, 파일로 부터 문자열을 가지고 오는 함수입니다.

 

: 함수설명

첫번째 인자 : 파일에서 부터 가지고 온 문자열을 넣는 변수 입니다. 문자열을 가리키는 캐릭터 타입의 포인터

두번째 인자 : 한번에 가지고올 문자열의 길이를 넣는 변수 입니다.

세번째 인자 : 파일의 파일 포인터를 집어 넣습니다.

반환형 : 가지고 온 문자열을 반환하거나, 파일의 끝에 도달했을때는 널 포인터 반환.

 

: 함수동작

fgets함수는 이렇게 동작해요.

파일에 아래와같이 세줄이 있다고 할때 fgets 함수는 문자열 끝에있는 "\n" 띄어쓰기를 기준으로하거나 두번째 매개변수로 집어 넣은 num-1 개의 문자열을 기준으로 으로 문자열을 판단해서 가지고 옵니다. 

즉. num-1 보다 작은데 \n이 나오면 해당 문자열까지만 읽음

num-1 까지 읽었을때 \n이 없더라도 num-1 까지만 읽음.

쩌 파일에 끝까지 가서 읽을게 없을때는 null 포인터를 반환합니다.

 

abcdefg\n

eeeeeeee\n

blockdmask


: 함수 사용법 간단 버전

FILE* pFile = fopen("test.txt", "r"); //읽기 모드로 파일을 오픈합니다.

char str[100]; //읽어올 문자열을 담을 변수 선언

fgets(str, 100, pFile); // 문자열을 최대 100자리 까지 읽어서 str에 담습니다.

 

 

2. 문자열을 입력하고 출력하는 fputs, fgets 함수 예제.

 

(1) 파일에 문자열을 출력하는 fputs 예제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(void)
{
    //write mode로 파일을 생성하고 오픈합니다.
    FILE* pFile = fopen("test.txt""w");
    
    //fputs 함수를 통해서 문자열을 집어넣습니다.
    int len = fputs("blockdmask",pFile);
    printf("fputs return : %d", len);
        
    //파일 닫기
    fclose(pFile);
    return 0;
}
cs

 

fopen 함수를 이용해서 파일을 w 모드로 만들고 열어서,

fputs 함수를 이용해 길이가 10인 문자열 "blockdmask"를 파일에 썼습니다.

또한 fputs 함수의 리턴 값을 받아서 콘솔에 출력했습니다.

확인해볼까요?

 

: 생성된 파일

 

: fputs 함수의 리턴값.

길이가 10인 문자열이 잘 들어갔다고 갯수를 딱 알려주네요.

 

 

 

(2) 중간에 ‘\0’ 있는 문자열이라면 어떻게 될까?

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(void)
{
    //write mode로 파일을 생성하고 오픈합니다.
    FILE* pFile = fopen("test.txt""w");
    
    //fputs 함수를 통해서 문자열을 집어넣지만, 중간에 '\0'가 있는 문자열.
    int len = fputs("bloc\0kdmask",pFile);
    printf("fputs return : %d", len);
 
    //파일 닫기
    fclose(pFile);
    return 0;
}
cs

 

1번 예제와 동일하게 fopen, fputs 함수를 이용해서 파일에 문자열을 집어 넣었습니다.

딱 하나 다른점은 문자열 사이에 '\0' 문자가 들어가 있는것 입니다.

이런 경우에 fputs 함수는 어떤식으로 동작을 할까요?

 

: 생성된 test.txt 파일 내부.

 

: fputs 함수의 리턴값.

 

두개의 결과값을 보면 '\0' 문자 앞까지 함수가 적용된것을 확인 할 수 있습니다.

 

 

(3) 파일에서 문자열을 가지고 오는 fgets 예제

 

이미 test.txt 파일이 존재하고 해당 파일에 "blockdmask" 라는 문자열이 존재한 상태에서 아래 코드를 실행시킵니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
int main(void)
{
    //read mode로 파일을 생성하고 오픈합니다.
    FILE* pFile = fopen("test.txt""r");
    
    //문자열을 담을 변수
    char arr[100];
    
    //fgets 함수를 이용해서 파일로 부터 문자열을 가지고 옵니다.
    char* pChar = fgets(arr, 100, pFile);
    printf("fgets return : %s\n", pChar);
    printf("fgets 1sr arg : %s", arr);
        
    //파일 닫기
    fclose(pFile);
    return 0;
}
cs

 

fopen 함수를 이용해서 read 모드로 이미 존재하고 있는 test.txt 파일을 오픈 합니다.

그러고 나서 읽어올 문자열을 저장할 변수를 만들어주고

fgets 함수를 이용해서 문자열을 읽어 옵니다.

 

실행 결과를 보면 인자로 집어 넣은 arr에도, 반환형인 pChar에도 동일한 문자열이 들어옴을 확인 할 수 있습니다.

문자열을 잘 가지고 온것도 확인 가능 합니다.

 

 

(4) fgets 함수를 이용해 파일의 끝까지 읽는 예제

 

test.txt 파일에 아래와 같이 무작위 문자열이 존재한다고 하겠습니다. 맨 끝에는 엔터가 없습니다.

가나다라마바사

blockdmask

abcdefggggggggggggggg

fgets example. 

쉬고싶다. 자고싶다. 부자되고싶다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
int main(void)
{
    //read mode로 파일을 생성하고 오픈합니다.
    FILE* pFile = fopen("test.txt""r");
    if(pFile == NULL)
    {
        //파일이 없다. 프로그램 종료
        return 0;
    }
 
    //파일의 끝이 나올때 까지 반복문으로 fgets 수행.
    while(true)
    {
        char arr[100];//문자열을 담을 변수
        char* pStr = fgets(arr, 100, pFile);
        if(pStr == NULL)
        {
            //파일의 끝
            break;
        }
 
        //파일 계속 읽어들이기. (출력에 \n가 없음.)
        printf("fgets 1sr arg : %s", arr);
    }
    
    //파일 닫기
    fclose(pFile);
    return 0;
}
cs

 

이렇게 작성된다고 할때

fopen 함수로 파일을 read 모드로 열고, fgets 함수가 null을 반환할 때까지. 그러니까 읽어 들일 문자열이 더이상 없을 때 까지

반복문을 돌리면서 문자열을 읽어 옵니다.

 

여기서 봐야할것은 두가지가 있습니다.

1) fgets 함수로 파일의 끝까지 읽을때 break 처리.

 

2) 문자열을 알아서 읽어 오면서 \n 까지 읽어오는것.
자세히 보면 printf에 따로 \n 개행 문자를 넣지 않았는데, 알아서 문자열이 다음줄에 출력되는걸 볼 수 있습니다. 이걸통해 파일에 \n 개행이 존재하면 그것까지 읽어 오는 것을 알 수 있습니다. 없으면 안가지고 오겠죠.

파일의 끝에는 개행이 없이 파일이 끝났기 때문에 읽어온 문자열에도 개행이 따로 없는걸 볼 수 있습니다.

 

 

이렇게 fputs 함수와 fgets 함수에 대해서 알아보았습니다.

감사합니다. 오늘의 포스팅은 여기서 마치겠습니다.

반응형