【C++】ifstreamでファイルの読み込みする

fstreamを使ってファイルからデータを読み込みします。

ifstreamでファイル読み込み

[test.txt]ファイルを開いて1行ごと読み込む処理です。ファイルが存在しない場合はエラーとなります。

#include <iostream>
#include <fstream>
#include <string>

int main()
{
  std::ifstream ifs("test.txt");
  if (!ifs.is_open()) {
    std::cout << "ファイルなし" << std::endl;
    return -1;
  }

  while(ifs.good()) {
    std::string line;
    std::getline(ifs, line);
  }
  
  return 0;
}

ifstreamでファイル読み込み(ちょっと実践編)

ちょっと実践編で、CSVファイルを読み込み、CSVの各項目毎に分解して構造体にセットします。

以下の様な、No、X座標、Y座標、Z座標の4項目のCSVファイルを読み込みます。

No,x,y,z
1,200,300,50
2,200,200,20
3,300,32,45
4,600,500,200
5,190,240,70
6,40,80,300

手順としては、ファイルを開く→1行読込み→分解→構造体に格納→配列に格納→1行読込みに戻るです。

今回は、簡略化のために、分解処理を別関数に分けていません。(ちょっと見にくいかもしれませんが、勘弁を・・・)

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>

struct Pose {
  int no{0};
  int x{0};
  int y{0};
  int z{0};
  Pose() {}
};

int main()
{
  std::ifstream ifs("test.csv");
  if (!ifs.is_open()) {
    std::cout << "ファイルなし" << std::endl;
    return -1;
  }

  std::string line;
  std::vector<Pose> poses;

  // タイトル行を読み捨て
  std::getline(ifs, line);

  while(ifs.good()) {
    std::getline(ifs, line);

    // csvの分解処理(split)
    std::vector<std::string> list;
    std::stringstream ss(line);
    std::string buff;
    while(std::getline(ss, buff, ',')) { list.push_back(buff); }

    if (list.size() != 4) continue;   // 項目数が違ったらとりあえず無視して次の行へ

    // 構造体にセット
    Pose p;
    p.no = std::atoi(list[0].c_str());
    p.x = std::atoi(list[1].c_str());
    p.y = std::atoi(list[2].c_str());
    p.z = std::atoi(list[3].c_str());
    poses.push_back(p);   // 配列に追加
  }

  // 出力
  for (auto p : poses) {
    std::cout << "no:" << std::to_string(p.no) 
              << " x:" << std::to_string(p.x) 
              << " y:" << std::to_string(p.y) 
              << " z:" << std::to_string(p.z) << std::endl;
  }

  return 0;
}
【出力】
no:1 x:200 y:300 z:50
no:2 x:200 y:200 z:20
no:3 x:300 y:32 z:45
no:4 x:600 y:500 z:200
no:5 x:190 y:240 z:70
no:6 x:40 y:80 z:300

17行目から21行目がファイルを開いている処理です。ファイルが存在しない場合は、エラーとします。

27行目は、CSVファイルの先頭行のタイトル部分を読み捨てるためにgetlineを使って読み込んでいます。

33行目から36行目が読み込んだデータを「,」(カンマ)で分解する処理です。
split処理は、以下のページでも実装方法を記載しているので気になる人は参考にどうぞ。

38行目は、項目数のチェックをしています。想定の項目数と違う場合は異常と判断して該当行は無視するようにしています。

41行目から46行目が、構造体へのデータセット及び配列への格納を行っています。

スポンサーリンク

  • この記事を書いた人

まさじぃ

ダメプログラマ歴17年です。 プログラミング関連の事や、 自分で使って良かったもの等の紹介をメインにやっています。

-プログラミング
-