본문 바로가기
코딩취미/C,C++

[c언어] fread, fseek, fwrite 전달인자와 사용방법 (파일 입출력)

by 브링블링 2023. 12. 17.
반응형

fread, fseek, fwrite 전달인자와 사용방법 (파일 입출력)

fread

기능 : 파일에서 데이터를 읽어오는 함수.

string fread(resource $handle, int $length);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

fread 함수의 전달인자:

  1. 데이터를 저장할 버퍼 (void *ptr):
    • 읽어온 데이터를 저장할 메모리 버퍼의 시작 주소를 가리키는 포인터입니다.
    • void * 타입으로 선언되어 있어 어떤 데이터 타입의 버퍼든 사용할 수 있습니다.
  2. 각 요소의 크기 (size_t size):
    • 각 요소의 크기를 바이트 단위로 지정합니다.
    • 예를 들어, int 형식의 데이터를 읽을 때는 sizeof(int)와 같이 사용할 수 있습니다.
  3. 읽을 요소의 개수 (size_t count):
    • 읽어올 요소의 개수를 지정합니다.
    • 예를 들어, int 형식의 데이터를 5개 읽을 때는 count에 5를 전달합니다.
  4. 파일 포인터 (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 함수의 전달인자:

  1. 파일 포인터 (FILE *stream):
    • 파일 스트림을 가리키는 포인터입니다.
    • fopen 함수 등을 통해 열린 파일의 파일 포인터를 전달합니다.
  2. 이동할 바이트 수 (long offset):
    • 파일 포인터를 이동시킬 바이트 수를 나타냅니다.
    • 양수이면 파일의 끝을 기준으로 떨어진 위치로 이동하고, 음수이면 파일의 시작을 기준으로 앞으로 이동합니다.
  3. 기준 위치 (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 함수의 전달인자:

  1. 데이터를 포함하는 버퍼 (const void *ptr):
    • 파일에 쓰고자 하는 데이터가 담긴 메모리 버퍼의 시작 주소를 가리키는 포인터입니다.
    • const void * 타입으로 선언되어 있어 어떤 데이터 타입의 버퍼든 사용할 수 있습니다.
  2. 각 요소의 크기 (size_t size):
    • 각 요소의 크기를 바이트 단위로 지정합니다.
    • 예를 들어, int 형식의 데이터를 쓸 때는 sizeof(int)와 같이 사용할 수 있습니다.
  3. 쓸 요소의 개수 (size_t count):
    • 쓰고자 하는 요소의 개수를 지정합니다.
    • 예를 들어, int 형식의 데이터를 5개 쓸 때는 count에 5를 전달합니다.
  4. 파일 포인터 (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 형식의 데이터를 파일에 씁니다. 반환된 값은 실제로 쓴 데이터의 개수입니다.

반응형