파일 처리 표준 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"
댓글 없음:
댓글 쓰기