반응형

출처:

http://forum.falinux.com/zbxe/index.php?_filter=search&mid=C_LIB&search_target=title&search_keyword=fopen&document_srl=408202

http://forum.falinux.com/zbxe/index.php?_filter=search&mid=C_LIB&search_target=title&search_keyword=fclose&document_srl=408205

http://forum.falinux.com/zbxe/index.php?_filter=search&mid=C_LIB&search_target=title&search_keyword=fwrite&document_srl=408229

http://forum.falinux.com/zbxe/index.php?_filter=search&mid=C_LIB&search_target=title&search_keyword=fread&document_srl=408226

http://forum.falinux.com/zbxe/index.php?_filter=search&mid=C_LIB&search_target=title&search_keyword=lseek&document_srl=519546


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에 저장된 내용을 파일 streamsize 크기의 데이터를 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

쓰기에 성공하면 출력한 데이터 개수를 반환, 실패하면 -1을 반환


따라서 이 함수의 의미는 다음과 같다.

주소 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()에서

버퍼에 메모리를 먼저 할당해야 한다는 점이었다.

그것만 제외한다면 이해하는데 어렵지는 않을 것이다.

물론 나만 어려우니까 삽으로 지구 반띵을 해버렸겠지만.

반응형
Posted by 애콜라이트
l

free counters