C++を使ってテキストファイルを読み込み、特定の行を取得するコード

こんてんつ

C++を使ってテキストファイル(.txt)を読み込み、特定の行を抽出するプログラムについてまとめる。1行ずつgetline関数で取得する方針でやっていく。

  • 全ての行を読み込んでcoutでコンソールに出力する
  • 特定の行を見つけたら次の行を出力する
  • 2回目に条件に一致したものを読み込む

関連記事 contents-open.hatenablog.com

例題

下記のテキストファイル(myTxtFile.txt)を用いる

myTxtFile.txt

Hello.

### TOKYO 2020 ###

tennis
Naomi Osaka

marathon
Suguru Osako

softball
Yukiko Ueno
Miu Goto

soccer
Takefusa Kubo

tennis
Kei Nishikori

全ての行を読み込んでcoutでコンソールに出力する

getline(myFile, line)は、第一引数に読み込んだストリームを。第二引数にその文字列を格納する変数を持つ。getlineはファイルの終了(EOF)が出ると0を返し、whileの条件式に書くことで全ての行が読み込まれたら自動で終了する仕組みである。

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

int main()
{
    fstream myFile;
    myFile.open("myTxtFile.txt", ios::in);//read
    if (myFile.is_open()) {
        string line;
        while (getline(myFile, line)) {
            cout << line << endl;
        }
        myFile.close();
    }

    system("pause>0");
}

f:id:norunblog:20210803232607p:plain

特定の行を見つけたら次の行を出力する

if(line == "marathon")でmarathonという文字列の行を見つけさせる。その後、getline(myFile, line)で1行進めて、coutで文字列を出力する。

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

int main()
{
    fstream myFile;
    myFile.open("myTxtFile.txt", ios::in);//read
    if (myFile.is_open()) {
        string line;
        while (getline(myFile, line)) {
            if(line == "marathon"){
                getline(myFile, line);
                cout << line << endl;
            }           
        }
        myFile.close();
    }

    system("pause>0");
}

f:id:norunblog:20210803233755p:plain

2回目に条件に一致したものを読み込む

int iというカウンターを使って、2回目のtennisに反応するようにした。

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

int main()
{
    fstream myFile;
    myFile.open("myTxtFile.txt", ios::in);//read
    if (myFile.is_open()) {
        string line;

        int i;
        i = 1;
        while (getline(myFile, line)) {
            if(line == "tennis"){
                if (i == 2) {
                    getline(myFile, line);
                    cout << line << endl;
                }
                else {
                    i++;
                }

            }           
        }
        myFile.close();
    }

    system("pause>0");
}

f:id:norunblog:20210803234745p:plain