C++第3版 9章 練習問題解答

目次へ戻る

9.1

標準ライブラリのヘッダは 「C:\Program Files\DevStudio\Vc\Include\」にある。 非標準ヘッダの一部は 「C:\Program Files\DevStudio\Vc\Mfc\Include\」にある。 それらのヘッダも < >で include できる。

9.2

9.1参照。

9.3

「取り敢えず版」である。
コメントは無視している。< > のタイプしか見ていない。 探索ディレクトリパスも1個所だけで、#ifdef 等も無視している。 但し、無限に読み続けないように既に読んだファイルは 2度読まないようにしてある。
#include <string>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <set>
using namespace std;

void Check(set<string>& tab,const char* fnam,int l)
{
    if (tab.find(fnam) != tab.end()) return;
    ifstream f(fnam);
    if (!f) {
        cerr << "Can't open " << fnam << endl;
        return;
    }
    cout << setw(l) << "" << fnam << endl;
    tab.insert(fnam);
    string s, dpath = "c:\\Progra~1\\DevStu~1\\Vc\\Include\\";
    string::size_type   i,j;
    while (f >> ws, getline(f,s)) if (s.substr(0,8) == "#include") {
        i = s.find('<');
        j = s.find_last_of('>');
        if (i != string::npos && j != string::npos)
            Check(tab,(dpath+s.substr(i+1,j-i-1)).c_str(),l+2);
    }
}
int main(int argc,char** argv)
{
    if (argc < 2) {
        cerr << "usage : " << *argv << " file\n";
        return 1;
    }
    set<string> tab;
    Check(tab,argv[1],0);
    return 0;
}

9.4

「取り敢えず版」を直すのも嫌なので、省略する。

9.5

コンパイラを直せば、一度読んだヘッダを読まないようにできるであろう。 #ifdef を書かなくて済むが、移植性が損なわれるだろう。

9.6

あまり詳しくないのでパス。

9.7

etime.h は8.6を参照のこと。
#include "etime.h"
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    char    buf[20];
    CETime  e;
    int     i,n = 100;
    char    c;
    for (i=0;i<n;++i) {
        sprintf(buf,"data%.2d.txt",i);
        ifstream    f(buf);
        while (f.get(c)) ;
    }
    cout << e.Sec() << endl;
    e.Reset();
    ifstream    f("data.txt");
    while (f.get(c)) ;
    cout << e.Sec() << endl;
}
100 個のファイルは 1.8秒で、1個は 0.5秒で読めた。 1度に開けるファイルの数は、FOPEN_MAX を見ると 20 であるが、実際に開いてみると、 509個まで開ける。実際は 512個で、cin,cout,cerr の3個分足りないのであろう。 従って、include の深さは 500 ぐらいまで大丈夫であろう。

9.8

6.18参照のこと。

9.9

面倒なのでパス。
前章目次次章