• [C++] 파일을 읽고 내용을 배열에 저장하여 새로운 파일에 저장하기

    2023. 9. 8.

    by. KAEY


    ✨ 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 코딩온 스마트 팩토리 과정 수업" 에서의 수업 자료 및 실습 과제 등에서 일부 발췌되어 작성 되었습니다.


    댓글 (비로그인 댓글 허용하지 않습니다.)