Entry

プログラミングメモ - C++ でファイルから1行読む

2009年03月15日

いや,単純に std::getline() を使いましょうってな話なんですけどね。自分用のメモ。

C++ の入出力ストリームにはいまだに慣れてないところがあるもんで,毎度のコトながら使い方を調べていたりします。いざとなったら cstdio を使えちゃうってのが,ちゃんと覚えようとしない原因だったりする。

と,言い訳はともかく,こゆのはいったんちゃんと動くのを作っておいて,繰り返し練習するしかなかったりします。あたしの場合ですけど。「ちゃんと動くの」ってのは,よくあるリファレンスにあるような簡易使用例ではなくて,前後の文脈(前処理,例外処理等々)も含めた使用例のこと。こゆのがないと,結局その場で使えなかったりします。あたしの場合ですけど。

つことで,ちゃんと動くの。

#include <fstream>
#include <iostream>

int
main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cerr << "Error: filename is not given." << std::endl;
        return -1;
    }
    try {
        std::ifstream ifs;
        ifs.exceptions(std::ifstream::badbit);
        ifs.open(argv[1]);
        if (!ifs) {
            std::cerr << "Error: file open error." << std::endl;
            return -1;
        }
        std::string input;
        while (std::getline(ifs, input)) {
            std::cout << "> " << input << std::endl;
        }
    } catch (std::ios::failure& e) {
        std::cerr << "Error: ios::failure." << std::endl;
    } catch (...) {
        std::cerr << "Error: unknown." << std::endl;
    }
    return 0;
}

引数のファイルを1行ずつ読み取って,行頭に"> "をつけてから出力するサンプルです。多分,これで完結するんだと思う。

std::ios::exceptions には,通常 std::ios::eofbit と std::ios::failbit も立てておくんですけれど,ファイルを全部読んで EOF に達すると,必ず std::ios::failure が投げられちゃうので,ここではフラグビットを落としています。std::ios::badbit だけを立てる。これはポイントのひとつかも。

std::getline() の第1引数は std::istream を引数にしているので,好きなストリームを指定するだけで,1行ずつ読み取ることができます。例えば,標準入力から読み取る場合は,std::ios::cin を指定します。std::string に読み込まれるので,明示的にバッファを作る必要もない。便利な関数だなあ。

ま,使い慣れてる人には当たり前の話なわけで,使い慣れてる人ってのは相当数いると思うんですけどね。メモっつことで。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN