파일 입출력 (I/O)시 쓰이는 Lib

  • ifstream : 파일입력
  • ofstream : 파일 출력
  • fstream: 파일 입력 및 출력

파일 스트림에 <<, >>, 조정자 등을 쓸 수 있다.

C언어와의 비교

  • C
FILE *fp;
fp = fopen("hello.txt", "r");
fp = fopen("hello.txt", "w+");
fp = fopen("hello.txt", "rt");
  • C++
ifstream fin;
fin.open("hello.txt");
ofstream fout;
fout.open("hello.txt");
fstream fs;
fs.open("hello.txt");

각 Stream 마다 open() 함수가 있다. Open(“filename”, ios-base::in | ios-base::binary) <- binary로도 읽을 수 있다.

  • option 비교

    C C++
    “r” in
    “w” out
    out |trunc
    “a” out | app
    “rt” in|out
    “wt” in|out|trunc

파일 닫기

  • C
FILE *fp;
// ...
fclose(fp);
  • C++
fstream fs;
// ...
fs.close(); // fstream 소멸자에서 닫아주기는 한다.

스트림 상태 확인

  • C
FILE *fp;
fp = fopen("open.txt", "rt");

if (fp != NULL)
{
    // ...
}
  • C++
fstream fs;
fs.open("open.txt");

if (fs.is_open())
{
	//...
}

파일에서 문자 하나씩 읽기

  • C
FILE *fp;
fp = fopen("open.txt", "r");
char c;
do
{
	c = getc(fp);
    printf("%c", c);
}while(c != EOF)

fclose(fp);
  • C++
ifstream fin;
fin.open("open.txt");
char c;
while(true)
{
    fin.get(c);
    if (fin.fail())
    {
        break;
    }
    cout << c;
}
fin.close();

get, getline 함수는 cin, istringstream, ifstream 모두 동일하게 적용 -> 추상화가 잘 되어 있음

위 소스에서 get을 getline으로 바꾸면 한줄씩 읽기가 된다.

여기서 잘못된 입력을 고려해야되는데,

  1. 숫자들과 뉴라인
  2. 잘못된 입력과 숫자들

만약, 잘못 입력된 값을 string으로 저장할 경우, 먼저 clear()를 해줘야 한다.

-> 그래야 failbit가 false로 초기화 되서 읽을 수 있다. failbit가 true면 읽지 않음.

while(!fin.eof())
{
    cin >> number;
    if (cin.fail())
    {
        clear();
        cin.ignore(1);
        cin >> trash
    }
    else
        cout << number << endl;
}

파일에 쓰기

  • C
FILE *fp;
fp = open("output.txt", "w");
char line[512];
if (fgets(line, 512, stdin) != NULL)
{
    fprintf(fp, "%s\n", line);
}
fclose(fp);
  • C++
ofstream fout;
fout.open("output.txt");
string line;
getline(cin.line);
if(!cin.fail())
{
    fout << line << endl;
}
fin.close();

바이너리 파일 읽기

  • C
FILE *fp;
fp = fopen("binary.dat", "rb");
if (fp != NULL)
{
    Record record;
    fread(&record, sizeof(Record), !fp);
}
fclose(fp);
  • C++
ifstream fin("binary.dat", ios-base::in | ios-base::binary);

if (fin.is_open())
{
    Record record;
    fin.read((char *)&record, sizeof(Record));
}

fin.close();

ifstream:read() : read(char*, streamsize); ex) fin.read(&firstName, 20); -> 파일로 부터 20바이트 읽어서 firstName에 저장

바이너리 파일에 쓰기

  • C
FILE *fp;
fp = fopen("binaryOutput.dat", "w");
if (fp != NULL)
{
    char buffer[20] = "Ha-Young Choi";
    fwrite(buffer, 20, 1, fp);
}
fclose(fp);
  • C++
ofstream fout("binaryOutput.dat", iosbase:out | iosbase:binary);

if(fout.is_open())
{
    char buffer[20] = "Ha-Young Choi";
    fout.write(buffer, 20);
}
fout.close();

파일에서 탐색

  • C
FILE *fp;
fp = fopen("open.txt", "w");
if (fp != NULL)
{
    if (fSeek(fp, 20, SEEK_SET) == 0)
    {
        // ...
    }
}
fclose(fp);
  • C++
fstream fs("open.dat", iobase:in|out|binary);

if (fs.is_open())
{
    fs.seek(20, iosbase:beg);
    if (!fs.fail())
    {
        // ...
    }
}
fs.close();

탐색유형

  • 절대적 -> fout.seek(20);

    • 보통 tellp() // tellg()를 사용해서 기억해놨던 위치로 돌아갈 때 사용.
  • 상대적 -> fout.seek(20, iosbase::cur);

    • iosbase:beg - 처음 위치로 부터
    • iosbase:cur - 현재 위치로 부터
    • iosbase:end - 끝 위치로 부터

seekp와 마찬가지로 seekg도 있다. 쓰기 < - > 읽기

정리

  1. std::string 클래스
  2. 메모리, 메모리 그리고 메모리
  3. 문자열 스트림
  4. 파일 스트림