무슨 일로 C 하셨습니까?

[C] 파일 입출력 본문

C - 이걸 굳이?/유틸리티

[C] 파일 입출력

OJJJ 2021. 5. 12. 21:39

프로그램 실행 중에 변수에 저장되는 데이터는 지역 변수던 전역 변수던

 

동적할당이 되었던 정적할당이 되었던 결국 프로그램이 종료되면 데이터도 사라지게 된다.

 

내가 저장해 놓은 데이터를 다음에 실행할 때에도 유지하고 싶다면

 

바로 파일 입출력을 이용하면 되겠다.

 

솔직히 DB도 파일 입출력을 베이스로 만들어진게 아닐까 생각한다.


간단하게 파일을 쓰는 함수를 만들어 보겠다.

#include<stdio.h>
#include<stdlib.h>

void FileWrite() {
	char* filename = "test1.txt";

	FILE* stream = NULL;

	fopen_s(&stream, filename, "w+");

	char* data = "data";

	int len = fprintf(stream,"%s\n",data);

	printf("write data : %s/%d\n", data, len);

	fclose(stream);
}

test1.txt라는 파일을 열어서 문자열의 데이터를 쓴 후 닫는 코드다.

 

파일을 열었으면 필시 닫아주도록 하자.

 

void FileRead() {
	char* filename = "test1.txt";

	FILE* stream = NULL;

	char data[100];

	fopen_s(&stream, filename, "r");

	int num;

	while (!feof(stream)) {
		num = fscanf(stream, "%s", data);
        	if(num == -1) break;
		printf("%s\n", data);
	}

	fclose(stream);
}

같은 파일을 열어서 읽고 출력하는 함수다.

 

똑같이 연 파일은 꼭 닫아주도록 하자.

 

파일을 읽기용으로 열지 쓰기용으로 열지는 fopen함수에 파라미터를 어떻게 주느냐에 따라 다른데

Parameter 설명 Parameter 설명
r 읽기 전용 r+ 읽기 쓰기, 파일 반드시 존재해야함
w 쓰기 전용. 덮어 쓰기 w+ 읽기 쓰기, 덮어 쓰기
a 쓰기 전용. 이어 쓰기 a+ 읽기 쓰기, 이어쓰기
t 텍스트 파일모드로 열기(생략가능) b 이진 파일 모드로 열기

 

  • "w, a"와 같이 쓰기모드의 경우 파일이 없으면 해당파일을 생성해서 작업한다.

앞서 만든 간단한 파일 쓰기 함수를 조금 변형시켜보자

void FileWrite(char* filename, char* data) {

	FILE* stream = NULL;

	fopen_s(&stream, filename, "a+");

	int len = fprintf(stream, "%s\n", data);

	printf("write data : %s/%d\n", data, len);

	fclose(stream);
}

파일 이름과 저장할 데이터를 파라미터로 주면

 

활용도 높게 사용할 수 있겠다.

 


void FileRead(char* filename) {

	FILE* stream = NULL;

	char data[100];

	fopen_s(&stream, filename, "r");

	int num;

	while (!feof(stream)) {
		num = fscanf(stream, "%s", data);
		if (num == -1) break;
		printf("%s\n", data, num);
	}

	fclose(stream);
}

파일을 읽는 함수도 읽을 파일 이름을 파라미터로 넘겨줌으로써 

 

활용도 높게 사용할 수 있겠다.

 

사실 파일을 읽어서 특정 변수에 저장하는 코드가 있어야 정말로 활용도가 높아졌다고 할 수 있겠다.

 


간단한 함수를 하나 만들어보자

#include "StringFunc.h"

char* GetValue(char* source, char* key) {
	char** ptr = StringParser(source, ":");
	if (StringCompare(ptr[0], key) == COMPARE_SAME) {
		return ptr[1];
	}
	return NULL;
}

이전에 만든 함수를 활용해서 특정 문자열(source)가 Key:value 형태라면

Key를 통해서 Value를 추출할 수 있도록 만든 함수이다.

  • 여기서는 key:value 순으로 데이터를 저장했다고 가정
  • 만약에 key-value, key/value 등 다른 방식으로 저장할 것이라면
  • StringParserSep Parameter에 알맞는 문자열을 넣어주도록 하자

 

 

물론 해당 문자열이 Key를 갖고있지 않다면 NULL을 반환한다.

 

void FileRead(char* filename, char* key) {

	FILE* stream = NULL;

	char data[100];

	fopen_s(&stream, filename, "r");

	int num;
	char* value;

	while (fgets(data, 100, stream)) {

		value = GetValue(data,key);

		if (value == NULL) continue;

		printf("value is :[%s]%s\n", key, value);
		break;
	}

	fclose(stream);
}

다음과 같이 사용하면 파일에서 key값에 해당하는 value를 얻어내도록 하여

 

다른 코드에서도 적절하게 활용할 수 있는 함수가 되겠다.

 

이렇게 만든 함수들을 사용해서 나만의 config 파일을 만들어보도록 하겠다.

Comments