Programming Language/C, C++

[C++] 파일 입출력 - 텍스트 파일 읽기 [1]

hanseongjun 2022. 12. 21. 03:25
728x90
반응형

< 그래프 정보를 출력 모습 >

이 글에서는 fstream 라이브러리를 이용한(C++11 이상 버전 권장, 버퍼 객체 bool 타입으로 변환 가능해서) 파일 입출력 예제를 다뤄보겠다.

수업에서 배운 dfs, bfs, 다익스트라 알고리즘 등을 복습할 겸 C++로 코드를 짜보았다.


1. include

먼저 기본 입출력에 필요한 iostream, 그래프 정보를 저장하는 데 쓸 이차원 배열을 동적으로 생성하기 위한 vector, 파일 입출력을 위한 fstream 라이브러리를 include 해온다.

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

*std 네임스페이스를 미리 선언했다. 이렇게 되면 원래는 std::fstream 형인 fstream을 그냥 fstream으로 사용할 수 있다.

 

2. 변수들과 파일 스트림 객체를 만들어 준다.

파일 스트림 객체는 fstream 말고도 쓰기만을 위한 ofstream, 읽기만을 위한 ifstream으로도 객체를 생성할 수 있다.

int main(){
    int n;
    int V;
    vector<vector<int>> graph;
    vector<int> visited;
    
    fstream fs;
}

여기서는 굳이 ofstream과 ifstream을 구분하진 않겠다.

 

3. open()메소드를 이용해 파일을 읽어와 그래프에 저장한다.

int main(){
    int n;
    int V;
    vector<vector<int>> graph;
    vector<int> visited;

    // inputs
    fstream fs;
    fs.open("./test.txt", ios::in);	// 여기서 텍스트 파일 경로 지정
    if(!fs){    // if fails			읽기 실패시 Error 출력
        cerr << "Error!\n";
    }
    fs >> n;						// 형식이 정해져 있을 경우, >> 연산자를 사용 가능하다.
    for(int i = 0; !fs.eof(); i++){
        fs >> V;
        graph.push_back({});
        for(int j = 0; j < V; j++){
            graph[i].push_back(0);
            fs >> graph[i][j];
        }
    }
    fs.close();						// 파일 스트림 닫아주기


    // output - 그래프 정보 출력
    cout << "Graph info - \n";
    for(int i = 0; i < n; i++){
        cout << "Vertex " << i+1 << " - ";
        for(int j = 0; j < graph[i].size(); j++){
            cout << graph[i][j] << " ";
        }
        cout << "\n";
    }
    return 0;
}

- 입력 파일 및 출력 결과

첫 번째 줄에는 그래프 정점의 개수 V가

두 번째 줄~ V+1번째 줄에는 연결된 정점의 개수와 정점의 번호가 입력된다.

 

4. 전체 코드

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;


int main(){
    int n;
    int V;
    vector<vector<int>> graph;
    vector<int> visited;

    // inputs
    fstream fs;
    fs.open("./test.txt", ios::in);
    if(!fs){    // if fails
        cerr << "Error!\n";
    }
    fs >> n;
    for(int i = 0; !fs.eof(); i++){
        fs >> V;
        graph.push_back({});
        for(int j = 0; j < V; j++){
            graph[i].push_back(0);
            fs >> graph[i][j];
        }
    }
    fs.close();


    // output
    cout << "Graph info - \n";
    for(int i = 0; i < n; i++){
        cout << "Vertex " << i+1 << " - ";
        for(int j = 0; j < graph[i].size(); j++){
            cout << graph[i][j] << " ";
        }
        cout << "\n";
    }
    return 0;
}
728x90
반응형
LIST