-
✨ INTRO
파일을 읽어오거나 파일을 생성해서 해당 파일에 내용을 작성하는 건 간단했다.
하지만 그 내용을 읽어와서 새로운 파일에 저장하는 방법은 없을까 고민하다가,
안될 것 없겠지 싶어서 한 번 시도해봤습니다.
실무에서 더 유용한 방법이 존재할 수도 있겠지만, 내가 생각하기에
매일 갱신되는 정보를 새로 저장한 필요가 있거나 싶을 때 응용해서 사용하면 굉장히 유용할 것 같습니다.
✨구현
✅ 편의상 읽어올 파일 input 과 새로 저장할 파일 output 으로 파일 두 개로 정의 했습니다.
✅ input 의 파일 내용을 역순으로 output에 저장하겠습니다.
🐱👤 사용한 헤더 파일 정보입니다.
#include <iostream> #include <fstream> //file 관련 기능을 제공하는 헤더 #include <vector> // vector 헤더파일을 추가해야 사용 가능 #include <string>
🐱💻 파일 읽어오기 (input.txt)
ifstream file_read("hello.txt"); // 파일 선언 및 열기를 동시에 if (file_read.fail()) { cout << "읽어올 파일 없음" << endl; } //파일이 제대로 생성되었는지 확인하기 위함. //자동으로 생성하지 못하면 fail() 의 값이 true 가 됨.
파일 선언과 열기를 진행하고, 예외 처리 역시 바로 진행했습니다.
vector<string> file_str; string line; while (getline(file_read, line)) { // get_line() file의 내용을 한 줄씩 읽어옴 file_str.push_back(line); //한줄 씩 뒤에 저장함. } file_read.close(); //파일을 열고 닫기 필수.
string 형태의 백터를 선언하고, getline()을 통해 엔터를 기준으로 모든 내용을 읽었습니다.
여기서 벡터를 사용했기에, 벡터의 뒤로 내용을 추가하는 push_back()을 사용했습니다.
사실 역순으로 치환하는 과정을 거치지 않기 위해서, 처음부터 배열의 앞에 값을 저장할 순 없을까?
고민을 많이 했는데, 가장 앞에 값을 넣는 함수는 없는 것 같고,
temp를 이용해서 새로운 값을 가장 앞에 저장하고 기존의 값을 뒤로 붙이는 과정을 거쳐야 하더라구요.
reverse(file_str.begin(), file_str.end());
그렇다면 제가 기존에 사용했던 reverse()를 이용해서 벡터를 역순 정렬 하는 것보다 효율적인가?
생각해봤을 때, 구현은 가능하지만 효율 중심의 관점에선 그렇다라는 생각이 들지 않았습니다.
따라서 이 과정들을 다 거쳐서 파일을 읽고, 벡터에 저장해서 역순으로 만드는 함수를 사용했습니다.
🐱💻 벡터의 값을 파일로 쓰기 (output.txt)
ofstream file2("output.txt"); //output 파일을 쓰기 위한 준비. if (file2.fail()) cout << "파일 쓰기 실패" << endl; //파일이 제대로 생성되었는지 확인하기 위함. //자동으로 생성하지 못하면 fail() 의 값이 true 가 됨.
위에서 한 읽어오기와 같이, 쓰기 또한 준비를 하고, 예외 처리(실패)를 해놓습니다.
단, 어디서 실패했는지 구체적으로 확인할 수 있도록 지표가 되어줄 오류 부분 메시지 출력에
구체적으로 판단할 수 있는 메시지를 작성하였습니다.
for (const string& str : file_str) { file2 << str << endl; } //file_str 은 위에서 input 의 파일을 읽은 값들을 //저장한 벡터 (참고 line 22). //이를 output에 한줄씩 저장함. file2.close(); //파일 닫기.
아까 저장해놓은 (역순의 벡터) 값들을 output 파일에 새로 저장하는 과정입니다.
intput (hello.txt) 파일과 output 파일이 생성된 것을 확인해볼 수 있습니다.
보통 작업한 cpp 파일의 폴더 경로에 생성되네요.
🐱💻 파일 읽어오기 (output.txt)
ifstream file_read2("output.txt"); // 파일 선언 및 열기를 동시에 if (file_read2.fail()) { cout << "마지막 과정, 파일 없음" << endl; }
위에서 읽었던 것과 동일하게 output 파일을 읽어오고 예외가 발생했는지 예외처리를 바로 해줬습니다.
string file_str2 = ""; string line2; while (std::getline(file_read2, line2)) { // get_line() file의 내용을 한 줄씩 읽어옴 cout << line2 << endl; }
이번에는 굳이 저장하는 것이 아니라 cmd 창에서도 output 파일이 잘 읽어와졌는지 확인할 것이라,
벡터를 사용하지는 않았습니다.
✅ 출력 화면 및 input(hello), output 파일
🎉해당 글의 내용은 "포스코 x 코딩온 스마트 팩토리 과정 수업" 에서의 수업 자료 및 실습 과제 등에서 일부 발췌되어 작성 되었습니다.
'개발 > C++' 카테고리의 다른 글
[C++] 오버라이딩 사용하는 이유에 대한 정리 (0) 2023.09.13 [C++] 하나의 파일을 이용하여 다른 한 개의 파일에 추가적인 입력과 수정하기 (0) 2023.09.11 [C++] stringstream 기본 개념과 간단한 실습, 입력 값의 자료형 판단 (1) 2023.09.07 [C++] string 문법 응용 실습 : 입력받은 문자열이 정수로만 이루어져 있는지 판단하기. (0) 2023.09.06 [C++] string 함수 실습. (size(), length(), find()) (0) 2023.09.06 댓글 (비로그인 댓글 허용하지 않습니다.)