파일 입출력

김동웅·2021년 9월 7일
0

File_structrue In C,C++

목록 보기
1/11

1. 파일 입출력

  • 저수준 파일 입출력(Low-level IO)
    파일지시자 : INT FD
    특징 : 빠르다, 바이트단위 입출력
    주요함수 : oepn,close,read,write,lseek
  • 고수준 파일 입출력
    파일지시자 : FILE *fp
    특징 : 사용하기 쉬움, 버퍼단위 입출력
    주요함수 : fopen,fclose,fread,fwrite,fseek

2. Opening files : Low-level IO

  • 이미 존재하는 파일 열기(open)
    - 시작위치는 파일의 처음으로 지정, 판독(read), 기록(write) 준비

  • 새로운 파일 생성(create)
    - 생성후에 파일이 사용될 준비가 된다는 점이 파일 열기와 동일

    • 생성된 파일은 처음에는 내용이 없기에, 기록연산만이 의미가 있음
  • fd= open(filename,flags[, pmode])

3. Closing Files : Low-Level IO

  • 파일 닫기(close)
    - 파일을 닫으면, 그 논리적 파일 이름은 다른 파일을 위해 사용 가능
    • close(fd)

4. Read/Writing : Low-level IO


5. Opening & Closing Files : High-level IO

  • C 스트림 (stdio.h)
    - file = fopen(filename,type)
    ex) File fp = fopen("a.txt","w")
    • w-> write
    • r-> read
    • a -> append

6. Reading/Writing : High level IO

7. Reading/Writing : C++ Stream

  • C++ stream ( fstream.h )
    - C++에서 오버로딩 (>> 입력, << 출력)
    - ostream&operator << (char c);
int n = 5;
cout << "value of n is" << n << endl;

ex2) C++ stream (fstream.h) 예제

#include <fstream.h>
fstream afile;
afile.open(file_name,mode)
afile << "201819149" << "Dong-woong" << "KIM";
afile >> ch;

C++ 파일입출력을 위한 기본 지식

1. 파일로부터 읽어오기 ifstream

ifstream 을 풀어쓰면 input file stream 이다.
"프로그램에 파일에 있는 어떠한 것들을 스트림 버퍼에 가지고 와서, 프로그램에 입력한다"

즉, 파일로부터 어떠한 것들을 가지고 와서 프로그램에 입력할 수 있게 도와주는 클래스이다.

ifstream = file->program

ifstream 함수 원형과 멤버 변수
헤더파일 : "fstream"

  1. 파일을 열때 사용하는 open함수
    함수 원형 :
    void open(const char* fileName, ios_base::openmode=ios_base::in);
    void open(const string& fileName, ios_base::openmode=ios_base::in);

    함수 설명 :
    첫번째 인자로 open할 파일이름
    두번째 인자로 open할 모드

    ios_base::in - 파일을 read할 목적으로 open할 것이다.
    ios_base::out - 파일에 write할 목적으로 open할 것이다.
    ios_base::binary - 파일을 바이너리 형태로 open할 것이다.

    이외에도 ios_base::ate, app, trunc 의 모드가 있습니다.

    보통의 경우에는 ifstream은 in, ofstream은 out으로 default로 들어가 있기 때문에 따로 넣지 않아도 됩니다.

    출처: https://blockdmask.tistory.com/322 [개발자 지망생]

  2. 열렸는지 확인하는 is_open 함수
    함수 원형 : bool is_open() const;
    함수 설명 : 파일이 열렸는지 확인

  3. 파일을 닫는 close 함수
    함수 원형 : void close();
    함수 설명 : 파일과의 연결을 닫아버리는 함수

  4. char하나씩 파일에서 프로그램으로 읽어오는 함수
    함수 원형 : istream& get(char& c);
    함수 설명 : 읽은 파일에서 char단위로 읽어서 매개변수로 넣은 c에 넣어주는 함수
    사용법 :

char c;
while(readFile.get(c))
{
//읽은 char가 c에 들어가 있다.
cout << c;
}
  1. 한줄씩 파일에서 프로그램으로 읽어오는 함수
    함수원형 : istream& getline(char* str, streamsize len);

    함수설명 : 한줄씩 문자열을 읽어서 str에 저장해주는 함수입니다.

    한줄의 기준은 '\n' 문자열의 끝을 알리는 개행 문자가 올때 까지, 혹은 파일의 끝을 알리는 EOF를 만날때 까지 입니다

출처: https://blockdmask.tistory.com/322 [개발자 지망생]

  1. 파일의 끝이 어딘지
    함수 원형 : bool eof() const;
    함수 설명 : 파일의 끝이 나오면 true반환, 그렇지않으면 false반환

ex)

std::ifstream readFile; // 읽을 목적의 파일선언

readFile.open("words.txt"); // 파일열기
if(readFile.is_open()) // 파일이 열려있다면
{
    while(readFile.eof()) // 파일 끝까지 읽어서
    {
    char arr[256];
    readFromFile.getline(arr,256); // 한줄씩 읽어오기
    
    }
}    

readFile.close();

2. 파일에 쓰기 ofstream

ofstream을 풀어쓰면 output file stream이다.

output = 출력
즉, 프로그램의 출력을 파일에 할수 있게 돕는 클래스이다.

ofstream = program->file

  1. 파일을 열때 사용하는 open 함수

함수원형 : void open (const char* fileName, ios_base::openmode mode = ios_base::out);

함수원형 : void open (const string& fileName, ios_base::openmode mode = ios_base::out);

함수설명 : 첫번째 인자는 파일이름입니다.

두번째 인자는 위에서 파일 읽기에서는 in이었는데 파일에 쓰기는 out으로 매개변수 default가 정해져있는것을 볼 수 있습니다.

사용법은 파일읽기 ifstream에서 사용한 방법과 똑같습니다.

단지 목적이 파일에서 읽어올거냐(in), 파일에 쓸거냐(out)에 따라 두번째 매개변수가 달라지게 됩니다.

  1. 파일이 열렸는지 확인하는 is_open 함수

함수원형 : bool is_open() const;
함수설명 : 파일이 열렸는지 확인하는 함수 입니다.

  1. 꼬리가 기네요. 문좀 닫읍시다. close 함수

함수원형 : void close();

함수설명 : 파일과의 연결을 닫아버리는 함수 입니다.

  1. 파일에 이제 좀 써볼까? write 함수

함수원형 : ostream& write(const char* str, streamsize n);

함수설명 : 첫번째 매개변수로 받은 캐릭터 포인터 타입의 문자열의 n만큼의 길이만큼 파일에 wrtie하는 함수입니다.

파일에 쓰기 간단 예제

using namespace std;

ofstream writeFile;            //쓸 목적의 파일 선언
writeFile.open("words.txt");    //파일 열기

char arr[11] = "BlockDMask";        //파일에 쓸 문자열

if(writeFile.is_open())    //파일이 열렸는지 확인

{

writeFile.write(arr, 10);    //파일에 문자열 쓰기

}

writeFile.close();    //파일 닫기

** 중요합니다. c언어 배열로 나타내는 문자열은 문자열 끝에 '\0'이 들어가 있기 때문에 배열의 "총 길이-1"을 write의 두번째 인자로 넣어야합니다.

따라서 "BlockDMask\0"는 char[] 배열의 길이는 11이지만, 실제로 문자는 10개 이므로 10을 넣어야 정상적으로 파일에 씌워집니다.

C++ string타입의 문자열로 사용한다면 이런걸 신경쓰지 않아도 되서 매우 편합니다. string의 예제는 아래 예제에서 확인하시죠!

이러한 ifstream, ofstream 클래스를 합쳐서 파일 입출력 클래스라고 말합니다.

앞서 작성해 놓았듯이, 헤더 파일은 파일스트림 입니다.

출처: https://blockdmask.tistory.com/322 [개발자 지망생]

0개의 댓글

관련 채용 정보