반응형
fread, fseek, fwrite 전달인자와 사용방법 (파일 입출력)
fread
기능 : 파일에서 데이터를 읽어오는 함수.
string fread(resource $handle, int $length);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fread 함수의 전달인자:
- 데이터를 저장할 버퍼 (void *ptr):
- 읽어온 데이터를 저장할 메모리 버퍼의 시작 주소를 가리키는 포인터입니다.
- void * 타입으로 선언되어 있어 어떤 데이터 타입의 버퍼든 사용할 수 있습니다.
- 각 요소의 크기 (size_t size):
- 각 요소의 크기를 바이트 단위로 지정합니다.
- 예를 들어, int 형식의 데이터를 읽을 때는 sizeof(int)와 같이 사용할 수 있습니다.
- 읽을 요소의 개수 (size_t count):
- 읽어올 요소의 개수를 지정합니다.
- 예를 들어, int 형식의 데이터를 5개 읽을 때는 count에 5를 전달합니다.
- 파일 포인터 (FILE *stream):
- 데이터를 읽을 파일을 가리키는 파일 포인터입니다.
- 파일은 미리 fopen 함수 등으로 열려 있어야 합니다.
fread 함수의 반환값:
- 실제로 읽은 요소의 개수 (size_t):
- fread 함수가 성공적으로 읽어들인 요소의 개수를 반환합니다.
- 반환된 값은 count와 같거나 작을 수 있습니다.
- 만약 파일의 끝에 도달하거나 읽기 도중 오류가 발생했다면 반환값은 count와 다를 수 있습니다.
#include <stdio.h>
int main() {
FILE *file;
const char *filename = "example.bin";
int data[5]; // int 형식의 데이터를 저장할 배열
// 파일을 이진 읽기 모드로 열기
fopen_s(&file, filename, "rb");
if (file == NULL) {
perror("Error opening file");
return 1;
}
// 파일에서 int 형식의 데이터 5개를 읽어오기
size_t elements_read = fread(data, sizeof(int), 5, file);
// 읽은 데이터 출력
for (size_t i = 0; i < elements_read; ++i) {
printf("%d ", data[i]);
}
// 파일 닫기
fclose(file);
return 0;
}
위의 코드에서 fread(data, sizeof(int), 5, file); 부분은 "example.bin" 파일에서 int 형식의 데이터를 5개 읽어와서 배열에 저장하고, 실제로 읽은 요소의 개수를 elements_read에 저장합니다.
fseek
기능 : 파일 포인터를 이동시키는 함수.
int fseek(resource $handle, int $offset, int $whence);
int fseek(FILE *stream, long offset, int whence);
fseek 함수의 전달인자:
- 파일 포인터 (FILE *stream):
- 파일 스트림을 가리키는 포인터입니다.
- fopen 함수 등을 통해 열린 파일의 파일 포인터를 전달합니다.
- 이동할 바이트 수 (long offset):
- 파일 포인터를 이동시킬 바이트 수를 나타냅니다.
- 양수이면 파일의 끝을 기준으로 떨어진 위치로 이동하고, 음수이면 파일의 시작을 기준으로 앞으로 이동합니다.
- 기준 위치 (int origin):
- 파일 포인터를 이동시킬 때의 기준 위치를 나타냅니다.
- 사용 가능한 상수로는 다음이 있습니다:
- SEEK_SET: 파일의 시작 위치를 기준으로 이동합니다.
- SEEK_CUR: 현재 파일 포인터 위치를 기준으로 이동합니다.
- SEEK_END: 파일의 끝 위치를 기준으로 이동합니다.
fseek 함수의 반환값:
- 성공 시 (0):
- fseek 함수는 정상적으로 파일 포인터를 이동시킬 경우 0을 반환합니다.
- 실패 시 (non-zero):
- 파일 포인터 이동에 실패하면 non-zero 값을 반환합니다.
- 실패의 원인은 주로 파일의 끝을 초과하는 위치로 이동하려고 하는 등의 이유로 발생할 수 있습니다.
#include <stdio.h>
int main() {
FILE *file;
const char *filename = "example.txt";
// 파일을 읽기 모드로 열기
fopen_s(&file, filename, "r");
if (file == NULL) {
perror("Error opening file");
return 1;
}
// 파일 포인터를 10바이트 앞으로 이동 (SEEK_SET: 파일의 시작 위치를 기준)
if (fseek(file, -10, SEEK_SET) == 0) {
printf("File pointer moved successfully.\n");
} else {
printf("Failed to move the file pointer.\n");
}
// 파일 닫기
fclose(file);
return 0;
}
이 코드에서 fseek(file, -10, SEEK_SET); 부분은 파일 포인터를 10바이트 앞으로 이동시킵니다.
반응형
fwrite
기능 : 파일에 데이터를 쓰는 함수.
int fwrite(resource $handle, string $string, int $length);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
fwrite 함수의 전달인자:
- 데이터를 포함하는 버퍼 (const void *ptr):
- 파일에 쓰고자 하는 데이터가 담긴 메모리 버퍼의 시작 주소를 가리키는 포인터입니다.
- const void * 타입으로 선언되어 있어 어떤 데이터 타입의 버퍼든 사용할 수 있습니다.
- 각 요소의 크기 (size_t size):
- 각 요소의 크기를 바이트 단위로 지정합니다.
- 예를 들어, int 형식의 데이터를 쓸 때는 sizeof(int)와 같이 사용할 수 있습니다.
- 쓸 요소의 개수 (size_t count):
- 쓰고자 하는 요소의 개수를 지정합니다.
- 예를 들어, int 형식의 데이터를 5개 쓸 때는 count에 5를 전달합니다.
- 파일 포인터 (FILE *stream):
- 데이터를 쓸 파일을 가리키는 파일 포인터입니다.
- 파일은 미리 fopen 함수 등으로 열려 있어야 합니다.
fwrite 함수의 반환값:
- 실제로 쓴 요소의 개수 (size_t):
- fwrite 함수가 성공적으로 쓴 요소의 개수를 반환합니다.
- 반환된 값은 count와 같거나 작을 수 있습니다.
#include <stdio.h>
int main() {
FILE *file;
const char *filename = "example.txt";
int data[5] = {1, 2, 3, 4, 5}; // int 형식의 데이터를 저장한 배열
// 파일을 쓰기 모드로 열기
fopen_s(&file, filename, "w");
if (file == NULL) {
perror("Error opening file");
return 1;
}
// int 형식의 데이터 5개를 파일에 쓰기
size_t elements_written = fwrite(data, sizeof(int), 5, file);
// 실제로 쓴 데이터 개수 출력
printf("Elements written: %zu\n", elements_written);
// 파일 닫기
fclose(file);
return 0;
}
위의 코드에서 fwrite(data, sizeof(int), 5, file); 부분은 data 배열에 있는 int 형식의 데이터를 파일에 씁니다. 반환된 값은 실제로 쓴 데이터의 개수입니다.
반응형
'코딩취미 > C,C++' 카테고리의 다른 글
[C#] 멀티스레드(MTA) 환경에서 프로그램 재시작하는 방법 (0) | 2023.12.20 |
---|---|
[c언어] 문자열에 특정 부분 문자열 찾는 함수(strstr)외 문자열 제어함수 9가지 (0) | 2023.12.18 |
파일 복사 시, copy 명령어를 쓰지 않고 버퍼를 사용하는 이유 (0) | 2023.12.16 |
[c언어] sizeof 와 ftell 의 차이점, 사용 목적 (0) | 2023.12.15 |
[C언어] fopen 대신 fopen_s 를 사용하는 이유, 특징 정리 (0) | 2023.12.14 |