본문 바로가기
Programming/C++

파일의 끝을 확인해용

by OKOK 2017. 7. 24.

파일의 끝을 확인하는 방법은 두 가지가 있습니다. 


리턴 값을 참조하는 방법

파일의 끝이라는 개념은 데이터를 파일에서부터 읽어 들일 떄 유용한 개념입니다. 그렇기 떄문에 파일로부터 데이터를 읽어들이는데 사용되는 함수(fgets, fgetc) 들은 파일의 끝에 도달하는 경우 정해진 값을 리턴합니다. fgetc - EOF(-1), fgets - NULL(0), fscaf - EOF(-1)


#include<stdio.h>


int main(void)

{

int state;

char* pState;

char str[20];


FILE * file = fopen("Test.txt", "rt");


while (1)

{

pState = fgets(str, sizeof(str), file);

if(pState == NULL)

break;

fputs(str, stdout);

}


state = fclose(file);


return 0;


파일을 개방한 후에 20번쨰 줄을 반복하면서 데이터를 읽어들이고 있다. fgets 함수가 NULL 포인터를 리턴 할 때까지 계속하고 있다. 파일의 끝까지 데이터를 읽어들이겠다는 의미이다. fgets 함수를 호출하고 있다는 것을 주목할 필요가 있다. 이전에 우리는 fprint 함수 호출을 통해서 데이터를 저장하였고 상대적인 함수 fscanf를 통해서 데이터를 입력받았다. fprintf 함수를 통해서 저장했던 데이터도 문자열이기 때문이다. 다만 문자열의 형식을 지정해줬을 뿐이다. 



feof 함수를 사용하는 방법


파일의 끝을 검사하는 두 번째 방법은 feof 함수를 사용하는 것이다. FILE 구조체 변수를 참조하면, 파일의 끝까지 데이터를 출력했는지에 대한 정보를 알 수 있따. 이전에 언급했던 내용이다. 즉, 파일의 끝까지 데이터를 출력했는지에 대한 정보를 알 수 있다. 이전에 언급했던 내용이다. 즉 파일을 개방하는 경우에 리턴된 포인터가 가리키는 변수에는 파일의 끝에 도달했는지에 대한 정보가 들어 있다는 뜻이다. 이것을 참조하는 방법이다.


#include <stdio.h>


int main(void)

{

int state;

char ch;


FILE* file = fopen("Test.txt", "wb");

if (file == NULL) {

printf("file open error!\n");

return 1;

}


fputc('1', file);

fputc((char)255, file);

fputc('2', file);


state = fclose(file);

if (state != 0) {

printf("file close error!\n");

return -1;

}


file = fopen("Test.txt", "rb");

if (file == NULL) {

printf("file open error!\n");

return 1;

}


while (1)

{

ch = fgetc(file);

if (feof(file) != 0)

break;

printf("data : %c\n", ch);

}


state = fclose(file);

if (state != 0) {

printf("file close error!\n");

return 1;

}


return 0;


파일의 끝을 확인하기 위해서는 feof 함수를 사용하는 것이 좋다.



Random Access 파일 입출력

파일을 읽는 중간에 처음부터 다시 읽어야 하는 상황이 발생하면 어떻게 해야 할까? 지금까지 공부했던 내용을 가지고도 해결이 가능하다. 파일 위치 지시자를 맨 앞으로 이동하면 된다. 그렇다면, 파일을 개방한 후에 중간부터 데이터를 읽어야 하는 상황이 발생하면 어떻게 해야 할까? 무작위로 접근해서 파일의 데이터를 입력 및 출력하겠다는 뜻이다. 무작위로 접근하기 위해서는 파일 위치 지시자를 제어할 수 있어야 한다. "stream이 가리키는 파일의 파일 위치 지시자를 시작 위치 wherefrom 에서부터 offset 만큼 이동한다. 


#include <stdio.h>


int main(void)

{

char buf[10];


FILE * file = fopen("Test.txt", "wt");

fputs("1234abcd56789", file);

fclose(file);


file = fopen("Test.txt", "rt");


fgets(buf, 7, file);

printf("%s \n", buf);


fseek(file, 2, SEEK_CUR);


printf("%c\n", fgetc(file));

fclose(file);


return 0;


데이터를 파일에 실제 삽입해 주고 있다. 현재의 파일 위치 지시자가 문자를 가리키게 한다. 파일 위치 지시자의 이동에 관련된 코드이다. 실행 시마다 적절히 선택하여 실행 보면, 파일 위치 지시자의 이동을 확인해 볼 수 있다. 이동한 파일 위치 지시자가 실제 가리키고 있는 것이 무엇인지 확인하기 위해서 문자를 출력하고 있다.