Jiyong's STUDY

구조체의 파일 입출력 방식 본문

프로그래밍/C

구조체의 파일 입출력 방식

Kingjiyong 2018. 5. 30. 19:32

typedef struct {

int num1;

double num2;

char str[40];

} datas;


FILE *fp=fopen( ... );

datas data;


이러한 구조체와 fp라는 파일 스트림이 있다고 가정할 때,

이를 파일 스트림을 통하여 프로그램과 파일 사이에서 입출력을 하고자 한다. 


이 때, 어떤 모드로 파일 스트림을 요청해야 하는가?

텍스트 데이터와 바이너리 데이터가 섞여있으므로 헷갈릴 수 있다.

하지만, 전혀 헷갈릴 이유도 없고 고민할 이유조차 없다.

왜냐하면 어차피 프로그램과 파일 사이에서만 입출력을 할 것인데,

텍스트고 바이너리고 아무 상관이 없지 않는가?


그렇다면 텍스트 모드로 입출력을 한다고 가정하자.

이전에 배웠던 fprintf나 fscanf 함수를 사용한다고 가정하면


fprintf(fp, "%d, %lf, %s", data.num1, data.num2, data.str);

fscanf(fp, "%d, %f, %s", &data.num1, &data.num2, data.str);


이런 식으로 구조체의 멤버 단위로 입출력을 해야 한다.


사실 이렇게 입출력을 진행하다 보면 프로그래머 입장에선 귀찮음을 느낄 수 밖에 없다.

그렇다면 fgets나 fputs를 사용한다면 어떨까? 결과는 더 귀찮을 뿐이다.


사실은 가장 편한 방법이 있다. 멤버 단위가 아니라 구조체 단위로 입출력을 한다면 훨씬 편할 것이다.

또한, 구조체 단위로의 입출력은 실제로 가능하며, 실제로 간편하다.


바이너리 모드로 스트림을 요청한 뒤에


fread((void *)&data, sizeof(data), 1, fp);

fwrite((void *)&data, sizeof(data), 1, fp);


이렇게 구조체 단위로 한번에 잘라서 입출력을 진행한다면 편하다!

그 데이터가 텍스트로만 이루어졌는지, 바이너리로만 이루어졌는지 상관이 없다.

왜냐면 그에 상관없이 정상적으로 입출력이 진행되기 때문이다.