출처:
C언어를 공부하다보니 파일 관련 함수를 정리할 필요가 생겼다.
그래서 한 번 적어보았다.
1. FILE* fopen(const char *path, const char *mode)
인수
ㄱ. const char *path
파일의 경로
ㄴ. const char *mode
파일을 어떻게 쓸 것인지를 결정하는 모드
r: 읽기만 가능
w: 쓰기만 가능, 기존에 있던 파일이면 내용을 지우고 새로 쓴다.
a: 쓰기 가능, 기존에 있던 파일이면 내용을 덧붙인다.
+: r과 w와 같이 사용해 읽기와 쓰기 모두 가능하게 만든다.
b: r, w, a와 같이 사용하며 바이너리 파일로 해당 모드를 사용한다.
반환값
FILE*
해당 경로 파일의 포인터
이 함수는 다음을 뜻한다.
path에 있는 파일을 mode 방식으로 연다.
2. int* fclose(FILE *stream)
반환값
int*
닫는데 성공하면 0, 실패하면 -1 반환
이 함수는 다음을 뜻한다.
stream 파일을 닫는다.
3. size_t fwrite(void *ptr, size_t size, size_t nitems, FILE *stream)
인수
ㄱ. void *ptr
파일에 기록할 내용이 저장된 버퍼(메모리) 주소.
ㄴ. size_t size
데이터 크기.
위의 버퍼에서 데이터를 가져와 파일에 한 번 쓸 때 단위가 되는 크기이다.
ㄷ. size_t nitems
파일에 기록할 데이터 갯수.
ㄹ. FILE *stream
버퍼 내용이 기록될 파일 스트림 포인터
반환값
size_t
쓰기에 성공하면 출력한 데이터 개수를 반환, 실패하면 -1을 반환
따라서 이 함수의 의미는 다음과 같다.
주소 ptr에 저장된 내용을 파일 stream에 size 크기의 데이터를 nitems 씩 써서
성공하면 쓴 길이인 size_t 를 반환하고 실패하면 -1을 반환한다.
4. size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream)
인수
ㄱ. void *ptr
파일의 내용이 기록되어 저장될 버퍼(메모리) 주소.
주의할 사항은 이 버퍼에 내용이 기록될 수 있게 메모리가 할당되어 있어야 한다.
ㄴ. size_t size
데이터 크기.
파일에서 데이터를 가져와 버퍼에 한 번 쓸 때, 즉 파일에서 한 번 읽을 때 단위가 되는 크기이다.
ㄷ. size_t nitems
버퍼에 기록 될, 즉 파일에 읽을 데이터 갯수.
ㄹ. FILE *stream
버퍼에 쓸 내용이 있는, 즉 읽어야 할 파일의 포인터
반환값
size_t
따라서 이 함수의 의미는 다음과 같다.
주소 ptr에 파일 stream에 저장된 size 크기의 데이터를 nitems 씩 읽어
성공하면 읽은 길이인 size_t 를 반환하고 실패하면 -1을 반환한다.
5. int fseek(FILE *stream, long offset, int whence)
인수
ㄱ. FILE *stream
대상 파일 포인터
ㄴ. long offset
기준이 될 위치에서 얼마나 이동할 지를 쓴다.
ㄷ. int whence
기준이 되는 위치
SEEK_SET: 파일 시작 위치
SEEK_CUR: 파일의 현재 포인터 위치
SEEK_END: 파일의 끝 위치
반환값
int
이동에 성공하면 0, 실패하면 -1 반환
이 함수는 다음을 뜻한다.
파일 stream에 커서를 놓아 기준 위치 whence에서 offset만큼 이동한다.
솔직히 위의 링크를 그대로 복사 붙여놓기한 수준이다.
내 이해를 위해 쓴 거긴 하지만 결국엔 코드를 쳐서 실행해보는 게 최고인 거 같다.
코드
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *msg = "Don't look back in anger.\0"; char *buffer = malloc(sizeof(char) * 30); FILE *fp; int read = 0, write = 0; if ((fp = fopen("sample.txt", "w+")) != NULL) { if ((write = fwrite(msg, sizeof(char), strlen(msg), fp)) != -1) printf("write: %d\n", write); else printf("write error"); fclose(fp); } else printf("open error\n"); if ((fp = fopen("sample.txt", "r")) != NULL) { while ((read = fread(buffer, sizeof(char), 30, fp)) > 0) printf("read: %d\n", read); printf("%s\n", buffer); memset(buffer, 0, 30); fseek(fp, 6, SEEK_SET); while ((read = fread(buffer, sizeof(char), 30, fp)) > 0) printf("read: %d\n", read); printf("%s\n", buffer); fclose(fp); } else printf("open error\n"); }
실행 결과
이 정도면 충분할 거 같다.
개인적으로 가장 삽을 퍼게 만든 것은 강조하기도 했지만 fread()에서
버퍼에 메모리를 먼저 할당해야 한다는 점이었다.
그것만 제외한다면 이해하는데 어렵지는 않을 것이다.
물론 나만 어려우니까 삽으로 지구 반띵을 해버렸겠지만.