C++ 파일 입출력
by atomic0x90 (Yujun Han)
File I/O header
C++ 파일 입출력을 하기 위해서는 fstream
을 include 해야 한다.
예시
#include <fstream>
C++ ifstream / ofstream 사용 방법
ifstream 은 파일 읽기를 수행하는 파일 클래스이다.
ofstream 은 파일에 쓰기를 수행하는 파일 클래스이다.
ifstream, ofstream의 사용 형태는 다음과 같다.
ifstream (파일 포인터 변수명)("읽기를 수행할 파일의 이름.확장자");
ofstream (파일 포인터 변수명)("쓰기를 수행할 파일의 이름.확장자");
//파일 읽기를 끝낸 후 파일 포인터 닫기
(파일 포인터 변수명).close();
//파일에 쓰기를 끝낸 후 파일 포인터 닫기
(파일 포인터 변수명).close();
예를 들어 읽기를 수행할 파일명이 test.inp
이고 쓰기를 수행할 파일명이 test.out
이면 다음과 같이 사용한다.
예시
#include <iostream>
#include <fstream> //File I/O header file
using namespace std;
ifstream fin("test.inp"); //파일 포인터 변수명 : fin, 읽기를 수행할 파일의 이름 : test, 확장자 : inp
ofstream fout("test.out"); //파일 포인터 변수명 : fout, 쓰기를 수행할 파일의 이름 : test, 확장자 : out
int main()
{
/*
algorithm
*/
fin.close(); //파일 읽기를 끝낸 후 파일 포인터 닫기
fout.close(); //파일 쓰기를 끝낸 후 파일 포인터 닫기
return 0;
}
파일 입출력 예제를 보기 전에 알아야하는 정보가 있다.
파일 문자열(string) 읽기, getline(string) 사용하는 방법
우선 string 을 사용하기 위해서 cstring
을 include 한다.
예시
#include <cstring>
파일에서 문자열을 받기 위해서는 string형 변수를 생성하고 getline(읽기 파일 포인터 변수명, string 변수)를 이용한다.
주의할 점
- getline은 개행 문자(‘\n’)까지 읽는다.
- ifstream fin(“test.inp”); 에서 fin은 개행 문자 전까지 읽는다.
- 즉, fin 을 이용하여 파일을 읽고 있었다면 개행 문자가 무시된다.
- fin 과 getline을 같이 사용할 경우 getline을 2번 쓰도록 한다.
- 왜냐하면 첫 번째 getline은 개행문자를 읽기 때문이다. (fin으로 읽었으므로 개행 문자가 하나 남았음)
문자열(string)을 split 하여 char 배열에 저장하는 방법, c_str() 사용하는 방법
우선 string 과 c_str()을 사용하기 위해서 cstring
을 include 한다.
예시
#include <cstring>
대부분 char 형태의 배열을 생성한다. 그다음 배열에 문자열을 대입한다.
하지만 대입이 되지 않는다. 왜냐하면 자료형이 다르기 때문이다.
그래서 string 형태를 char 형태로 바꾸기 위해서 c_str()를 사용한다.
사용 방법은 다음과 같다.
(char 포인터 변수명) = (char *)(string 변수명).c_str();
이렇게 하면 char 형태의 배열에 문자열이 대입된다.
여기서 문자열의 길이를 알고 싶으면 strlen(char 포인터 변수명)
을 사용한다.
이제 예제를 보자 다음과 같이 예를 들어 test.inp에
첫째 줄에 읽을 정수의 개수를 나타내고 둘째 줄에 읽을 정수를 나열하고 셋째 줄에 문자열이 쓰여있다.
정수는 int로 입력받아서 int형 배열에, 문자열은 string으로 입력받아서 char형 배열에 저장하고 싶다.
그러면 어떻게 해야 할까? 다음 code를 보자
test.inp
5
1 2 3 4 5
string Hello
code
#include <iostream>
#include <fstream> //File I/O header file
#include <cstring> //string, c_str()을 사용하기 위한 header file
using namespace std;
ifstream fin("test.inp"); //파일 포인터 변수명 : fin, 읽기를 수행할 파일의 이름 : test, 확장자 : inp
ofstream fout("test.out"); //파일 포인터 변수명 : fout, 쓰기를 수행할 파일의 이름 : test, 확장자 : out
string st; //string 변수
int testCase;
int num[10];
char *ch; //char 포인터 변수
int main()
{
fin>>testCase; //파일 읽기 (읽을 정수의 개수)
for(int i = 0;i < testCase;i++)
fin>>num[i]; //파일 읽기 (정수의 개수만큼 정수를 읽어오기)
for(int i = 0;i < testCase;i++)
fout<<num[i]<<" "; //파일 쓰기 (저장한 정수를 파일에 작성하기)
//파일 쓰기 (cout 처럼 "" 를 쓰면 문자가 표현된다.)
fout<<endl<<"Test String"<<" A B C 12 144"<<endl;
//fin 과 getline을 같이 사용할 경우 getline을 2번 쓰도록 한다.
//이유는 위에 파일 문자열(string) 읽기, getline(string) 사용하는 방법의 주의할 점에 작성되어 있다.
getline(fin,st);
getline(fin,st);
//(char 포인터 변수) = (char *)(string 변수).c_str()
ch = (char *)st.c_str();
//문자열의 길이 확인 : strlen(char 포인터 변수)
for(int i = 0;i < strlen(ch);i++)
fout<<ch[i]<<" "; //파일 쓰기 (저장한 문자를 파일에 작성하기)
fout<<endl; //파일 쓰기 (줄바꿈)
fin.close(); //파일 읽기를 끝낸 후 파일 포인터 닫기
fout.close(); //파일 쓰기를 끝낸 후 파일 포인터 닫기
return 0;
}
실행 결과 test.out
1 2 3 4 5
Test String A B C 12 144
s t r i n g H e l l o
감사합니다.
홈으로 가기 | 더 많은 C++ post 보기 | post 목록 보기 |
---|---|---|