先頭へ戻る

ファイルストリーム 解答ページ | Programming Place Plus C++編【標準ライブラリ】 第28章

Programming Place Plus トップページC++編

先頭へ戻る

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。
当サイトでは、C++14 をベースにした新C++編を作成中ですが、今のところ、C++11 以降の C++ を詳しく解説できているコンテンツはありません。

問題①

問題① ファイルの内容を、別のファイルへコピーするプログラムを作成してください。


この手のプログラムでは、改行文字のように、環境によっては変換が行われてしまう文字について、その変換を抑制する必要があります。そのためには、バイナリモードを使用します。

#include <iostream>
#include <fstream>
#include <cstdlib>

int main()
{
    std::ifstream ifs("test.txt", std::ios_base::in | std::ios_base::binary);
    if (!ifs) {
        std::exit(EXIT_FAILURE);
    }

    std::ofstream ofs("test2.txt", std::ios_base::out | std::ios_base::binary);
    if (!ofs) {
        std::exit(EXIT_FAILURE);
    }

    char c;
    while (ifs.get(c)) {
        ofs.put(c);
    }
}

問題②

問題② fstream において、読み取り位置や書き込み位置を操作して、それぞれの現在位置がどのように変化するか確認してください。


#include <iostream>
#include <fstream>
#include <cstdlib>

int main()
{
    std::fstream fs("test.txt", std::ios_base::in | std::ios_base::out | std::ios_base::trunc);
    if (!fs) {
        std::exit(EXIT_FAILURE);
    }

    fs << "test" << std::endl;
    std::cout << "tellg: " << fs.tellg() << "\n"
              << "tellp: " << fs.tellp() << std::endl;

    fs.seekg(-2, std::ios_base::cur);
    std::cout << "tellg: " << fs.tellg() << "\n"
              << "tellp: " << fs.tellp() << std::endl;

    fs.seekp(-2, std::ios_base::cur);
    std::cout << "tellg: " << fs.tellg() << "\n"
              << "tellp: " << fs.tellp() << std::endl;
}

実行結果:

tellg: 6
tellp: 6
tellg: 4
tellp: 4
tellg: 2
tellp: 2

tellg と tellp が返す値がつねに連動していることが分かります。


参考リンク


更新履歴

’2017/2/6 新規作成。



第28章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー