70.3 파일에 문자열 쓰기

지금까지 서식을 지정해서 파일에 문자열을 쓰거나 읽었습니다. 그럼 서식 없이 문자열을 그대로 쓰거나 읽을 수는 없을까요?

fputs 함수를 사용하면 문자열을 그대로 파일에 쓸 수 있습니다(stdio.h 헤더 파일에 선언되어 있습니다).

  • fputs(버퍼, 파일포인터);
    • int fputs(char const *_Buffer, FILE *_Stream);
    • 성공하면 음수가 아닌 값을 반환, 실패하면 EOF(-1)을 반환

간단하게 "Hello, world!" 문자열을 파일에 저장해보겠습니다. 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

file_put_string.c

#define _CRT_SECURE_NO_WARNINGS    // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>     // fopen, fputs, fclose 함수가 선언된 헤더 파일

int main()
{
    FILE *fp = fopen("hello.txt", "w");    // hello.txt 파일을 쓰기 모드(w)로 열기.
                                           // 파일 포인터를 반환

    fputs("Hello, world!", fp);   // 파일에 문자열 저장

    fclose(fp);    // 파일 포인터 닫기

    return 0;
}

프로그램을 실행한 뒤 hello.txt 파일을 열어보면 다음과 같이 "Hello, world!" 문자열이 저장된 것을 볼 수 있습니다.

hello.txt

Hello, world!

먼저 파일에 문자열을 써야 하므로 fopen 함수를 사용하여 파일을 쓰기 모드(w)로 엽니다.

FILE *fp = fopen("hello.txt", "w");    // hello.txt 파일을 쓰기 모드(w)로 열기.
                                       // 파일 포인터를 반환

이제 파일 포인터를 얻었으니 fputs 함수로 문자열을 파일에 씁니다. fputs는 파일에 쓸 문자열(배열이나 동적 메모리를 할당한 포인터도 가능)과 파일 포인터 fp를 넣어줍니다.

fputs("Hello, world!", fp);    // 파일에 문자열 저장

이렇게 하면 딱 "Hello, world!" 문자열만 hello.txt 파일에 저장됩니다.

파일 쓰기가 끝났으면 반드시 fclose 함수로 파일 포인터를 닫아줍니다.

fclose(fp);    // 파일 포인터 닫기

지금까지 파일에 문자열을 쓴 과정을 그림으로 표현하면 다음과 같습니다.

그림 70-3 파일에 문자열 쓰기

fputs 함수도 파일 포인터 대신 stdout을 지정하면 문자열이 표준 출력(화면)에 출력됩니다.

fputs("Hello, world!", stdout);    // Hello, world!: 표준 출력(stdout)에 문자열 출력

이번에는 fwrite 함수를 사용하여 문자열을 파일에 써보겠습니다(stdio.h 헤더 파일에 선언되어 있습니다).

  • fwrite(버퍼, 쓰기크기, 쓰기횟수, 파일포인터);
    • size_t fwrite(void const *_Buffer, size_t _ElementSize, size_t _ElementCount, FILE *_Stream);
    • 성공한 쓰기 횟수를 반환, 실패하면 지정된 쓰기 횟수보다 작은 값을 반환

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

file_write_string.c

#define _CRT_SECURE_NO_WARNINGS    // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>     // fopen, fwrite, fclose 함수가 선언된 헤더 파일
#include <string.h>    // strlen 함수가 선언된 헤더 파일

int main()
{
    char *s1 = "Hello, world!";

    FILE *fp = fopen("hello.txt", "w");    // hello.txt 파일을 쓰기 모드(w)로 열기.
                                           // 파일 포인터를 반환

    fwrite(s1, strlen(s1), 1, fp);    // strlen으로 문자열의 길이를 구함.
                                      // 문자열의 길이만큼 1번 파일에 저장

    fclose(fp);    // 파일 포인터 닫기

    return 0;
}

프로그램을 실행한 뒤 hello.txt 파일을 열어보면 다음과 같이 "Hello, world!" 문자열이 저장된 것을 볼 수 있습니다(앞에서 fputs 함수로 hello.txt 파일에 문자열을 썼으므로 확실하게 확인하려면 기존의 hello.txt는 삭제합니다).

hello.txt

Hello, world!

먼저 파일에 문자열을 써야 하므로 fopen 함수를 사용하여 파일을 쓰기 모드(w)로 엽니다.

FILE *fp = fopen("hello.txt", "w");    // hello.txt 파일을 쓰기 모드(w)로 열기.
                                       // 파일 포인터를 반환

fwrite 함수는 fputs 함수와는 달리 쓰기 크기와 쓰기 횟수를 지정해야 합니다. 따라서 먼저 파일에 쓸 문자열의 포인터 s1을 지정합니다(배열이나 동적 메모리를 할당한 포인터도 가능). 그리고 쓰기 크기에는 strlen(s1)과 같이 문자열의 길이를 구해서 넣고, 쓰기 횟수에는 1을 넣습니다. 마지막에는 파일 포인터 fp를 넣어줍니다.

fwrite(s1, strlen(s1), 1, fp);    // strlen으로 문자열의 길이를 구함.
                                  // 문자열의 길이만큼 1번 파일에 저장

이렇게 하면 "Hello, world!" 문자열만 hello.txt 파일에 저장됩니다(fwrite 함수에서 파일을 쓰는 크기는 쓰기 크기 * 쓰기 횟수입니다).

파일 쓰기가 끝났으면 반드시 fclose 함수로 파일 포인터를 닫아줍니다.

fclose(fp);    // 파일 포인터 닫기

지금까지 파일에 문자열을 쓴 과정을 그림으로 표현하면 다음과 같습니다.

그림 70-4 파일에 문자열 쓰기

fwrite 함수도 파일 포인터 대신 stdout을 지정하면 문자열이 화면에 출력됩니다.

char *s1 = "Hello, world!";
fwrite(s1, strlen(s1), 1, stdout);    // Hello, world!
                                      // 문자열 길이만큼 표준출력(stdout)에 문자열 출력