파일 입출력을 할때는 스트림 파일이라는 표준화된 형태를 만들어서 입출력을 수행하게 된다.
스트림만들어서 사용하는 이유는 1.여러 입출력 장치들이 있기때문에 표준적인 방법을 만든다는 것과.
2.프로그램에서 데이터를 처리하는 속도,입출력장치에서의 속도의 차이가 있는데 이것을 조정하기 위해서 라고 한다.
우선 파일을 읽기 위해서는 스트림 파일을 만들어야 한다.
스트림 파일을 만들기 위해서는 fopen함수를 사용하면 된다.
FILE* fp; //파일구조체 포인터를 하나 만듦
fopen_s(&fp, "Map.obj", "r"); //파일구조체 포인터 fp에 Map.obj(임시파일 이름)의 내용을 집어넣는다. 맨뒤에 "r"은 읽기모드를 뜻한다. (쓰기모드도 있다.)
이렇게 하면 파일구조체 fp에 텍스트 파일의 정보가 저장된다. 그리고 fopen함수 호출 후 파일을 읽지 못했을 경우에 fp에는 NULL이 들어가게 된다.
이를 통해서 파일 읽기를 성공했는지 실패했는지 판별 할 수 있다.
사용이 끝난 파일은 fclose함수를 이용해 스트림파일을 제거한다. (안정성을 위해서..)
fclose(fp);
파일 개방이 끝나면 이제 해당파일을 이용해 입출력을 하면 된다.
문자를 가져오는 함수들 :
int fgetc(FILE* ); 는 파일에서 하나의 문자를 가져온다.
예를들어 Game.txt 라는 텍스트 파일이 있고 텍스트 파일 안에는 Shooting 이라고 적혀있다. 여기서 문자를 읽으려면 다음과 같이 하면 된다.
FILE* fp;
char buff;
fopen_s(&fp, "Game.txt", "r"); //읽기모드
if(fp==NULL) //정상적으로 파일을 읽었는지 검사
{
cout<<"파일 개방 실패"<<endl;
return ;
}
buff = fgetc(fp);
cout<<buff<<endl;
fclose(fp);
이렇게 하면 S가 정상적으로 출력된다.
한번 fgets함수를 호출하고 그 이후에 호출되는 fgets함수는 버퍼에 데이터가 없을때까지 읽게된다. 따라서
buff = fgetc(fp);
cout<<buff<<endl; 를 한번 더 호출하면 S다음글자인 h가 호출 될 것이다.
그리고 버퍼의 끝에 도달하면 fgetc함수는 -1을 리턴한다 (EOF) 이를통해 다음과 같이 전문을 출력할 수 있다.
while(1)
{
buff = fgetc(fp);
cout << buff << endl;
if (buff == EOF)break;
}
fgetc 함수가 문자를 문자단위로 입력받는 함수라면
fgets함수는 문자를 줄 단위로 입력받는 함수이다.
FILE* fp;
char buff[10];
open_s(&fp, "Game.txt", "r"); //읽기모드
if (fp == NULL) //정상적으로 파일을 읽었는지 검사
{
cout << "파일 개방 실패" << endl; return;
}
fgets(buff, sizeof(buff), fp);
cout << buff << endl;
이런식으로 사용하면 한줄의 내용인 Shooting이 출력된다.
마찬가지로 한번 더 호출하면 두번째 줄의 내용이 출력될 것이다.
이함수들과 더불어 문자열 자르는 함수나(strtok)
sscanf_s같은 함수를 이용하면 buff에 들어있는 원하는 방법으로 활용 할 수 있게된다.
간단한 예를 들자면
character.txt라는 파일이 있다. 내용은
HP 30
MP 50
여기서 HP값 30과 MP값 50를 int 값으로 얻어 오려면 다음과 같이 하면 될 것이다.
FILE* fp;
char buff[10];
int Hp;
int Mp;
fopen_s(&fp, "character.txt", "r"); //읽기모드
if (fp == NULL) //정상적으로 파일을 읽었는지 검사
{
cout << "파일 개방 실패" << endl;
return;
}
while (!feof(fp)) //한줄씩 읽어내려감
{
fgets(buff, sizeof(buff), fp);
char* Data;
if(buff[0]=='H'&&buff[1]=='P')
{
Data = strtok(buff, " ");
while (Data = strtok(NULL, " "))
{
Hp = atoi(Data);
}
}
if (buff[0] == 'M'&&buff[1] == 'P')
{
Data = strtok(buff, " ");
while (Data = strtok(NULL, " "))
{
Mp = atoi(Data);
}
}
}
cout << Hp << endl;
cout << Mp << endl;
'프로그래밍 > C++' 카테고리의 다른 글
벡터에서 reserve와 resize를 하는 이유 (0) | 2016.09.03 |
---|---|
함수포인터 활용 (0) | 2016.09.01 |
벡터 clear (0) | 2016.07.13 |
프로그램 진행시간 측정 하는법. (0) | 2016.04.02 |
벡터에서 erase사용시 주의할것. (0) | 2016.03.30 |