고흐의 연구실/C언어와 C++

[C언어] 파일관련(1) fopen(), frpintf(), fclose(), fscanf()

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

C언어를 배우면 콘솔창에서만 입력받고 출력하고를 먼저 배운다.

이후에는 파일을 가져오고 읽고... 한다!

 

파일에 문자열을 쓸 때는 먼저 fopen()으로 파일 포인터를 얻은 뒤 fprintf()를 사용한다.

 

  • 헤더파일 : stdio.h
  • FILE *포인터이름 = fopen(파일명, 파일모드);
    • FILE *fopen(char const *_FileName, char const *_Mode);
    • 성공하면 파일 포인터를 반환, 실패하면 NULL을 반환
  • fprintf(파일포인터, 서식, 값1, 값2, ...);
    • int fprintf(FILE * const _Stream, char const * const _Format, ...);
    • 성공하면 쓴 문자열의 길이를 반환, 실패하면 음수를 반환
  • fclose(파일포인터);
    • int fclose(FILE *_stream);
    • 성공하면 0을 반환, 실패하면 EOF(-1)를 반환
  • fscanf(파일포인터, 서식, 변수의주소1, 변수의주소2, …);
    • int fscanf(FILE * const _Stream, char const * const _Format, ...);
    • 성공하면 읽어온 값의 개수를 반환, 실패하면 EOF(-1)를 반환
    •  

- 예제(1)

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

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

    fprintf(fp, "%s %d\n", "Hello", 100);   // 서식을 지정하여 문자열을 파일에 저장

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

    return 0;
}

>> 컴파일을 하게되면, 이 코드(.c) 파일이 있던 폴더에 hello.txt 파일이 생성된다.

     열어보면, "Hello 100"을 확인할 수 있다.

 

- 예제(2)

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

int main()
{
    char s1[10];
    int num1;

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

    fscanf(fp, "%s %d", s1, &num1);   // 서식을 지정하여 파일에서 문자열 읽기

    printf("%s %d\n", s1, num1);      // Hello 100: 파일에서 읽은 값을 출력

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

    return 0;
}

>> hello.txt안에는 입력한 문자열이 들어있다.

 

ㅇfopen()

  - 파일 열기에 성공하면 파일포인터 반환, 실패시 NULL 반환

  - 두번째 인자에 파일모드가 들어감

  - 파일모드는 보통 "rb", "rt", "w+b", "w+t"와 같이 읽기/쓰기 모드와 텍스트/바이너리 모드를 조합해서 사용한다.

    (t와 b는 단독으로 사용할 수 없다)

  - 파일 경로를 잘 지정해주어야 한다.

 

ㅇfclose()

  - 파일 포인터도 구조체 FILE 크기만큼 동적 메모리를 할당한 것이기 때문에, fclose()로 닫아주지 않으면 메모리 누수가 발생함

 

ㅇfprintf()

  - fprintf()로도 화면에 문자열을 출력 할 수 있다.(stdout 사용)

    >> fprintf(stdout, "%s %d\n", "Hello", 100); // Hello 100: 서식을 지정하여 화면(stdout)에 문자열 출력

  - 즉, fprintf(stdout, ....); 은 printf 함수와 동작이 같다.

 

ㅇfscanf()

  - 파일 포인터를 넣는다는 점 말고는 scanf 함수와 사용법이 같음

  - stdin 매크로를 활용하여 사용자가 입력한 값을 변수에 저장할 수 있음

char s1[10];
int num1;
fscanf(stdin, "%s %d", s1, &num1);    // 서식을 지정하여 표준 입력(stdin)에서 문자열 읽기

  - 즉, fscanf(stdin, ....); 은 scanf 함수와 동작이 같다.

 

 

 

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

728x90