2015년 8월 27일 목요일

C 언어 - 파일 입출력

파일 다루는 방법을 알면 더욱 확장성 있는 프로그램을 만들 수 있다.

파일 처리 표준 API



  • fopen : 파일 열기
  • fread : 파일에서 읽기

size_t fread(void * ptr, size_t size, size_t count, FILE * stream);

    • ptr : 데이터를 읽어서 담을 변수 (최소 size * count 크기)
    • size : 한번에 읽어들일 크기
    • count : 읽어들일 횟수
    • stream : FILE 포인터

리턴값 : 읽어들인 크기, count 값과 다르다면 파일 끝에 도달 했거나 에러


  • fclose : FILE 포인터 닫기


dump.c


파일을 읽어서 화면에 출력

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *args[]) {
    char * filename = NULL;
    FILE * fp = NULL;
    char buffer[1024] = {0,};
    if (argc < 2) {
        exit(1);
    }
    filename = args[1];
    fp = fopen(filename, "r");
    while (fread(buffer, 1, sizeof(buffer) - 1, fp) > 0) {
        printf("%s", buffer);
        memset(buffer, 0, sizeof(buffer));
    }
    fclose(fp);
    return 0;
}

 conf.c

configuration 파일

  • 이름: 값 형태의 파일

configuration 파일 생성
configuration 파일 읽기

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static size_t s_strnspn_r(const char * str1, const char * str2, size_t size) {
    size_t len = strnlen(str1, size);
    size_t i, j;
    for (i = 0; i < len; i++) {
        char ch = str1[len - i - 1];
        for (j = 0; str2[j]; j++) {
            if (str2[j] == ch) {
                break;
            }
        }
        if (!str2[j]) {
            break;
        }
    }
    return len - i;
}
static void s_trim(const char * text, char * out, size_t size) {
    int s = strspn(text, " \t\n");
    int e= s_strnspn_r(text + s, " \t\n", strlen(text + s));
    int length = e;
    strncpy(out, text + s, (length > size ? size - 1 : length));
}
static void s_parse_conf(const char * text, char * name, int size_name, char * value, int size_value) {
    char name_buffer[1024] = {0,};
    size_t c = strcspn(text, ":");
    if (c == strlen(text)) { // not found ':'
s_trim(text, name, size_name);
        return;
    }
    strncpy(name_buffer, text, c);
    s_trim(name_buffer, name, size_name);
    s_trim(text + c + 1, value, size_value);
}
static void s_write_conf(FILE * fp, const char * name, const char * value) {
    char buffer[1024] = {0,};
    snprintf(buffer, sizeof(buffer), "%s : %s\n", name, value);
    fwrite(buffer, strlen(buffer), 1, fp);
}
static void s_test_write(const char * filename) {
    FILE * fp;
    fp = fopen(filename, "w");
    if (!fp) {
        perror("fopen()");
        exit(1);
    }
    s_write_conf(fp, "Name", "Steve Bolt");
    s_write_conf(fp, "Age", "26");
    fclose(fp);
}
static void s_test_read(const char * filename) {
    FILE * fp;
    char buffer[1024] = {0,};
    fp = fopen(filename, "r");
    if (!fp) {
        perror("fopen()");
        exit(1);
    }
   while (fgets(buffer, sizeof(buffer), fp)) {
char name[128] = {0,};
        char value[128] = {0,};
        s_parse_conf(buffer, name, sizeof(name), value, sizeof(value));
printf("Key : \"%s\", Value: \"%s\"\n", name, value);
    }
    fclose(fp);
}
int main(int argc, char *args[]) {
    if (argc < 2) {
        printf("Error: file name required\n");
        exit(1);
    }
    s_test_write(args[1]);
    s_test_read(args[1]);
    return 0;
}
실행:
$ ./conf person.txt
Key : "Name", Value: "Steve Bolt"
Key : "Age", Value: "26"


댓글 없음:

댓글 쓰기