카테고리 없음

[C언어] 파일관련(2) fputs(), fwrite(), fgets(), fread()

전고흐 2020. 9. 17. 01:53
728x90

파일관련(1) 포스팅에서는 서식을 지정해서 파일에 문자열을 쓰거나 읽었다.

여기서는 서식없이 문자열을 그대로 쓰거나 읽는법을 알아보자.

 

  • fputs(버퍼, 파일포인터);
    • int fputs(char const *_Buffer, FILE *_Stream);
    • 성공하면 음수가 아닌 값을 반환, 실패하면 EOF(-1)을 반환
  • fwrite(버퍼, 쓰기크기, 쓰기횟수, 파일포인터);
    • size_t fwrite(void const *_Buffer, size_t _ElementSize, size_t _ElementCount, FILE *_Stream);
    • 성공한 쓰기 횟수를 반환, 실패하면 지정된 쓰기 횟수보다 작은 값을 반환
  • fgets(버퍼, 버퍼크기, 파일포인터);
    • char *fgets(char *_Buffer, int _MaxCount, FILE *_Stream);
    • 성공하면 읽은 문자열의 포인터를 반환, 실패하면 NULL을 반환
  • fread(버퍼, 읽기크기, 읽기횟수, 파일포인터);
    • size_t fread(void *_Buffer, size_t _ElementSize, size_t _ElementCount, FILE *_Stream);
    • 성공한 읽기 횟수를 반환, 실패하면 지정된 읽기 횟수보다 작은 값을 반환

 

- fputs() 예제

#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!"가 적혀있다!

 

- fwrite() 예제

#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!"가 적혀있다!

 

- fgets() 예제

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

int main()
{
    char buffer[20];    // 파일을 읽을 때 사용할 임시 공간

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

    fgets(buffer, sizeof(buffer), fp);    // hello.txt에서 문자열을 읽음

    printf("%s\n", buffer);    // Hello, world!: 파일의 내용 출력

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

    return 0;
}

>> hello.txt의 문자열이 화면에 출력됨

 

- fread() 예제

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

int main()
{
    char buffer[20] = { 0, };    // 파일을 읽을 때 사용할 임시 공간, 미리 0으로 전부 초기화

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

    fread(buffer, sizeof(buffer), 1, fp);   // hello.txt에서 버퍼 크기(20바이트)만큼 1번 값을 읽음

    printf("%s\n", buffer);    // Hello, world!: 파일의 내용 출력

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

    return 0;
}

>> hello.txt의 문자열이 화면에 출력됨

 

ㅇfputs()

  - fputs()도 파일 포인터 대신 stdout을 지정하면 문자열이 화면에 출력된다.

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

 

ㅇfwrite()

  - fwrite()도 파일 포인터 대신 stdout을 지정하면 문자열이 화면에 출력된다.

    >> char *s1 = "Hello, world!";

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

 

ㅇfgets()

  - fgets 함수도 stdin을 지정하면 사용자가 입력한 문자열을 버퍼에 저장합니다.

char buffer[20];
fgets(buffer, sizeof(buffer), stdin);    // 표준 입력(stdin)에서 20바이트만큼 문자열 읽기
                                         // 널 문자 1바이트, 실제 문자열 19바이트

  - 물론 지정한 버퍼크기 보다 작은 상태에서 엔터 키를 누르면 \n이 되므로 fgets 함수는 \n까지 입력을 받습니다(\n도 포함)

 

ㅇfread()

  - 파일을 읽을 때 사용할 임시 공간(버퍼)를 선언해야 하는데 fread 함수를 사용할 때는 char 배열을 선언한 뒤 반드시 0으로 초기화해야 합니다(char 포인터에 동적 메모리를 할당한 뒤 0으로 초기화해도 된다)

  - fread 함수에서 파일을 읽는 크기는 읽기 크기 * 읽기 횟수

  - fread 함수는 fgets 함수와는 달리 \n이 있든 없든 무조건 지정된 크기만큼 읽는다.

  - fread 함수도 stdin을 지정하면 사용자가 입력한 문자열을 버퍼에 저장합니다.

char buffer[20] = { 0, };
fread(buffer, sizeof(buffer) - 1, 1, stdin);    // 표준 입력(stdin)에서 문자열 읽기
                     // 버퍼 끝에 NULL이 들어갈 수 있도록 sizeof(buffer) - 1을 지정

 

출처 : dojang.io/mod/page/view.php?id=610

728x90