본문 바로가기
C,C++/정보정리

[C/C++] 파일 입출력 함수 정리

by 마두식 2022. 9. 27.
반응형
fopen_s(File** _Stream, const char* _FileName, const char* _Mode)
  • 기존의 fopen 함수의 안전성 문제로 개선되어 나온 것이 fopen_s 함수입니다.
  • File** _Stream

-  열린 파일에 대한 포인터를 수신할 파일 포인터에 대한 포인터입니다.

 

  • const char* _FileName

-  파일의 경로 및 이름 입니다. 경로를 작성하지 않고 파일 명만 작성한다면, 프로젝트 폴더를 기본으로 합니다.

-  만약 exe 파일로 실행했을 경우엔, 해당 exe 파일이 존재하는 폴더를 기본으로 하게 됩니다.

 

  • const char* _Mode

-  '파일에 대한 처리 방식과 어떤 파일인지' 와 같은 2가지로 구분이 됩니다.

-  파일에 대한 처리 방식 : r(읽기), w(쓰기), a(접근)

-  어떤 파일인지 : t(텍스트 파일), b(바이너리 파일)

 

ex) fopen_s(&file, "test.txt", "wt")

읽기 모드의 텍스트 파일을, 프로젝트 폴더에 test.txt 라는 이름으로 생성하는 것입니다.

 

-  _Mode 인자에는 어떤 파일인지에 대한 부분 없이 "r", "w" 등만 작성해서 사용할 수도 있습니다.

-  각 모드별 파일이 열리는 방식에 차이가 있을 수 있습니다.

-  참고 링크 : 씹어먹는 C 언어 - <23 - 2. 파일 하고 이야기 하기 (파일 입출력)> (modoocode.com)

 

 

int fclose(File* _Stream)
  • 열었던 파일을 닫을 때 사용합니다.
  • fopen_s 함수를 사용해서 파일을 열었다면 반드시 fclose 함수를 사용해서 닫아주는 것이 좋습니다.
  • 파일을 성공적으로 닫았다면 0, 그렇지 않다면 EOF(-1) 를 반환합니다.

ex) fclose(file);

 

 

size_t fwrite(const void* _Buffer, size_t _ElementSize, size_t _ElementCount, FILE* _Stream);
  • const void* _Buffer

-  스트림에 쓰여질 배열을 가리키는 포인터

-  여기서 스트림이란 4번째 인자인 FILE* _Stream 을 뜻한다.

-  쉽게 말해서 FILE* _Stream 에서 지정하는 파일에 쓰여질 배열을 가리키는 포인터이다.

 

  • size_t _ElementSize

-  첫번째 인자인 _Buffer 배열 각 원소의 크기

 

  • size_t _ElementCount

-  첫번째 인자인 _Buffer 배열의 원소의 수.

-  각 원소의 크기는 두번째 인자인 _ElementSize 바이트 이다.

 

  • FILE* _Stream

-  내용을 쓸 스트림을 가리키는 FILE 포인터

 

  • 반환값

-  스트림에 성공적으로 써진 전체 원소의 개수는 정수형인 size_t 형으로 반환됩니다. 만일, 쓰여진 바이트 수와 _ElementCount 의 값이 다르다면 오류가 발생하게 됩니다.

 

1
2
3
4
5
6
7
8
int main() {
  FILE* file;
  char buffer[] = {'a''b''c'};
fopen_s(&file, "test.txt""wt");
  fwrite(buffer, 1sizeof(buffer), file);
  fclose(file);
  return 0;
}
cs

 

위에서 배운 함수들을 이용해서 파일에 'abc' 라는 문자열을 입력하는 코드입니다.

 

 

size_t fread(void* buffer, size_t _ElementSize, size_t _ElementCount, FILE* _Stream);
  • void* buffer

-  _ElementSize * _ElementCount 의 크기를 가지는 배열 포인터

 

  • size_t _ElementSize

-  읽어들일 원소의 크기

-  단위는 바이트-  _ElementSize 값이 4라면, 읽어들일 원소 하나의 크기는 4바이트임을 뜻한다.

 

  • size_t _ElementCount

-  읽어들일 원소의 개수

-  각 원소의 크기는 _ElementSize 바이트이다.

 

  • FILE* _Stream

-  데이터를 입력받을 스트림의 FILE 객체를 가리키는 포인터

-  쉽게 말해서 읽어들일 데이터를 가진 파일

 

  • 반환값

-  성공적으로 지정한 원소의 개수 만큼 읽어들였다면 읽어들인 원소의 개수가 정수 타입 size_t 형으로 리턴된다.

-  만일 읽어들인 개수가 _ElementCount 인자에서 지정한 것과 다르거나, End OF File 에 도달하였다면 오류가 발생한다. -  이 때, ferror함수나 feof함수를 이용하여 어떠한 오류인지를 파악할 수 있습니다.

 

 

int fputs(const char*_Buffer, FILE*_Stream)
  • const char *_Buffer

-  스트림에 쓰여질 NULL 문자로 끝나는 문자열.

-  쉽게 말해, 파일에 작성될 문자열을 뜻한다.

 

  • FILE *_Stream

문자열을 쓸 스트림의 FILE 객체를 가리키는 포인터

-  쉽게 말해, 문자열이 작성될 파일을 가리킨다.

 

  • 반환값

-  성공한다면 음이 아닌 수가 리턴되고, 그렇지 않다면 EOF를 리턴한다.

 

 

char* fgets(char*_Buffer, int _MaxCount, FILE*_Stream)
  • char*_Buffer

-  읽어들일 문자열을 저장할 포인터

 

  • int _MaxCount

-  마지막 NULL 문자를 포함하여 읽어들일 최대 문자 수.

-  NULL 문자를 포함한다는 것에 유의하라.

 

  • FILE*_Stream

-  문자열을 읽어들일 스트림의 FILE 객체를 가리키는 포인터.

-  특히, 표준 입력에서 입력을 받으려면 여기에 stdin 을 써주면 된다.

 

  • 반환값

-  성공적으로 읽어들였다면 문자열(_Buffer)을 반환한다.

-  만일 파일 끝에 도달하였는데 아무런 문자도 읽어들이지 않았다면 _Buffer 문자열의 내용은 변하지 않고 그 대신 null 포인터가 리턴된다.

-  오류가 발생해도 null 포인터가 리턴된다.

-  ferror함수나 feof를 사용해서 각각 어떤 오류가 발생하였는지, 파일 끝에 도달하였는지 알 수 있다.

 

  • 스트림에서 문자열을 받아서 NULL 문자를 포함한 _MaxCount 개의 문자를 입력받으면 끝이 난다.
  • 혹은, 개행 문자나 파일의 끝에 도달하면 자동으로 끝이 난다. 이 때, 개행문자도 마찬가지로 읽어들인 다는 점을 유의
  • NULL 문자는 자동으로 마지막으로 입력받은 문자 뒤에 삽입된다.

 

1
2
3
4
5
6
7
8
9
10
11
int main() {
    FILE* file;
    char sentence[256];
 
    printf("mylog.txt 에 추가할 문자열을 입력하세요: ");
    fgets(sentence, 255, stdin);
    fopen_s(&file, "mylog.txt""w");
    fputs(sentence, file);
    fclose(file);
    return 0;
}
cs

 

fgets, fputs를 사용한 예제입니다.

사용자로부터 표준 입력으로 문자열을 입력받은 후, 그 문자열을 file에 넣어주는 코드입니다.

 

 


 

 

틀린 부분이나 이상한 부분이 있으면 댓글로 편하게 지적해주세요!

감사합니다!

 

참고 링크

https://modoocode.com/

반응형

'C,C++ > 정보정리' 카테고리의 다른 글

[C/C++] Vector 함수(push_back, emplace_back)  (1) 2022.10.05
[C/C++] 가상함수  (0) 2022.09.30
[C/C++] _getch() 함수  (0) 2022.09.23
[C/C++] enum, enum class 차이점  (0) 2022.09.20
[C/C++] cin 관련 함수, system 함수  (2) 2022.09.17

댓글