Hi yoahn 개발블로그

파일 입출력 본문

프로그래밍 언어/C++

파일 입출력

hi._.0seon 2020. 3. 27. 15:41
반응형

C++ 파일 관련 클래스

<fstream>

ifstream : input file stream

ofstream : output file stream

fstream : file stream

 

cin, cout도 표준 입출력을 담당하는 객체

istream, ostream -> iostream

 

1. 출력스트림

#include <iostream>
#include <fstream>
using namespace std;

int main(){
    ofstream output;
    output.open("scores.txt");

    output << "John" << " " << "T" << " " << "Smith" << " " << 90 <<endl;
    output << "Eric" << " " << "K" << " " << "Jones" << " " << 85 <<endl;
    
    output.close();
    cout<<"Done"<<endl;
    
    return 0;
}

output.open("파일 경로")를 통해 파일 생성하고 객체와 연결

output << ... 으로 파일에 출력

output.close() 로 파일을 닫는다

-> 객체하고 파일의 연결을 끊음

파일을 닫지 않는 경우 데이터 손실이 발생할 수 있다. 적절히 저장되지 못할 수도 있다.

 

- 파일 생성과 열기를 동시에 할 수 있다.

ofstream output("scores.txt");

 

# 스트림 조정자

setw() //setwidth

 

- 파일로 데이터 쓰기

파일이 존재하지 않으면 새로운 파일이 생기고, 파일이 이미 존재한다면 이전 내용은 경고없이 지워지고 덮어쓰게 된다.

 

 

2. 입력스트림

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(){
    ifstream input;
    input.open("scores.txt");
    //ifstream input("scores.txt");
    
    string firstName;
    char mi;
    string lastName;
    int score;
    
    input >> firstName >> mi >> lastName >> score; //데이터 읽기
    cout << firstName << " " << mi << " "<< lastName <<" "<<score << endl;
    
    input >> firstName >> mi >> lastName >> score; //데이터 읽기
    cout << firstName << " " << mi << " "<< lastName <<" "<<score << endl;
    
    input.close();
    cout<<"Done"<<endl;
    
    return 0;
}

 

데이터를 올바르게 읽기 위해서는 데이터가 어떻게 저장되어 있는지를 알아야 함

파일에 저장된 타입과 읽어들이는 변수 타입이 다르면 코드가 제대로 동작하지 않는다

 

 

3. 파일존재 여부 테스트

- 파일을 읽으려고 할 때 파일이 없으면 예측할 수 없는 오류가 발생할 수 있다.

 

- 파일이 존재하는지 확인

open()함수 호출 즉시 fail() 함수를 호출한다.

input.open("scores.txt");
if(input.fail()){
    cout <<"File does not exist" <<endl;
    return 0;
}

 

4. fstream 과 파일 열기 모드

: 프로그램이 한 스트림 객체로 입출력 모두를 할 수 있다.

 

- 파일 열기 모드

ios::in 입력을 위한 파일 열기
ios::out 출력을 위한 파일 열기
ios::app 모든 출력을 파일의 끝에 추가
ios::ate

ios::out + 파일이 존재하면 파일의 끝으로 이동.

데이터는 파일의 아무 곳이나 쓰기 가능 (파일 포인터)

ios::trunc

파일이 이미 존재하면, 파일의 내용을 버림

(ios::out 에 대한 기본 동작)

ios::binary 이진 입출력을 위한 파일 열기

 

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(){
    fstream inout;
    
    inout.open("city.txt",ios::out);//파일 생성,객체와 연결
    inout << "Dallas Houston Atlanta ";//쓰기
    inout.close();
    
    inout.open("city.txt", ios::out|ios::app);//append모드로 파일 열기/연결
    inout << "Savannah Austin Chicago";//파일에 내용 추가
    inout.close();
    
    string city;
    inout.open("city.txt", ios::in);//읽기 모드로 파일 열기&연결
    
    while(!inout.eof()){ //eof 만날 때까지 읽어들이기
        inout >> city;
        cout<<city<<" ";
    }
    inout.close();
    return 0;
}

 

- eof()

:End of File

파일의 끝에는 eof마크가 있다.

파일 포인터가 가리키는 부분이 eof 마크가 아니라면 while 안으로 들어가서

inout >> city;

파일 내용을 하나씩 읽어 모니터에 출력하고 파일포인터는 하나 이동

(공백을 만나기 전까지 하나의 data라고 생각하고 읽음)

 

 

- getline()

>> (stream추출 연산자)를 사용하여 데이터 읽기 -> 공백이 있는 문자열을 읽어올 수 없다.

getline() 함수는 공백있는 문자열을 읽어들인다. <string>

 

구분문자나 eof표시를 만나면 문자읽기를 멈춘다.

getline(ifstream& input, string s, [char delimit character])

첫번째 매개변수는 어떤 파일에서 읽어올지를 나타내고 두번째 변수는 읽어들인 값을 담을 공간, 세번째 매개변수는 구분문자로 한번에 읽어들일 데이터를 구분하는 것

 구분문자는 읽어들일 문자열을 구분하기 위한 문자로 저장하지는 않는다. (기본값 '\n')

 

반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

[C/C++] dangling pointer  (0) 2021.03.18
NULL, 0, '\0', "" 차이점  (0) 2021.03.18
[C] 가변인자  (0) 2020.12.30
Comments