0

Accelerated C++ での最後の演習に対する私の解決策に疑問を呈しています。

自己再生プログラムを書きます。このようなプログラムは、入力を行わず、実行時に独自のソース テキストのコピーを標準出力ストリームに書き込みます。

私の解決策:

using std::string;
using std::cout;
using std::endl;
using std::ifstream;
using std::getline;

void selfReproduce16_1()
{
    ifstream thisFile("C:\\Users\\Kevin\\Documents\\NetBeansProjects\\Accelerated_C++_Exercises\\Chapter_16.cpp", ifstream::in);

    string curLine;

    bool foundHeader = false;

    while(getline(thisFile, curLine))
    {
        if(!curLine.compare("void selfReproduce16_1()") || foundHeader)
        {
            foundHeader = true;
            cout << curLine << endl;
        }

    }

}

これは、ソリューションのソース テキストのみを出力します (この関数)。これは彼らが考えていた解決策ですか?

ソース ファイルの場所をハードコーディングする必要のない動的なソリューションが必要です。ただし、実行時にソース ファイルの場所を自動的に取得する方法を知りません。

それに関連するもう 1 つのポイントは、「インクルード」ファイルのインクルードと、(関数呼び出しに遭遇したときに) 関数が格納されているソース ファイルの場所を自動的に取得することです。 」プログラム。

これは C++ で可能ですか? もしそうなら、どのように?

4

5 に答える 5

8

自分自身を印刷するプログラムはQuineと呼ばれます。

あなたの解決策は有効とは見なされないと思います.クインは通常、ファイルの読み取りを許可されていません(また、他の種類の入力を取得することもできません)。Quine C++ プログラムを作成することは可能です。ここでは、いくつかの言語で多くの quine の実装を見つけることができます。

于 2011-02-19T20:22:12.400 に答える
4

もっと動的なソリューション(ソースファイルの場所をハードコーディングする必要がないソリューション)が欲しいのですが

ご存知のとおり、main関数(つまり、argcとargv)の引数。最初のargvは、プログラム実行可能ファイルのファイル名です。したがって、必要なのは.exeを削除し、.cppに置き換えることだけです。または、ファイル名からフォルダを抽出し、すべてのソースファイルを見つけて出力することもできます。私はあなたにそれを理解させます。実行可能ファイルの名前を出力する方法は次のとおりです。

#include <iostream>

int main(int argc, char** argv) {
  std::cout << argv[0] << std::endl;
  return 0;
};

それが何を与えるかを見るためにあなたのシステムでそれをチェックしてください。フルパスが表示されない場合は、すべてのファイルを開く操作が同じ開始相対ディレクトリから行われることを心配しないでください。したがって、実行可能ファイルの相対ディレクトリを取得すると、ソースに相対ディレクトリも提供されます(それらがソースにあると仮定します)。同じフォルダ)。

于 2011-02-19T20:32:59.840 に答える
0

これが私がC++で書いた簡単なクワインです。入力は使用しません。この本は、入力を明示的に除外しているため、これらの線に沿って何かを探していたと思います(それ以外は、ソースファイルを読み取るためのソリューションは優れたものであり、最初はそれも考えました)。

https://gist.github.com/3363087

于 2012-08-15T19:59:37.160 に答える
0

私はちょうどそのレッスンを終えました。テキストファイルを開かないものを書くのは難しくありません。あなたがしなければならないのは、文字列のベクトルを使用して、コードのすべての行をプッシュすることです.ベクトルのプッシュを除いて、for ループを次々と使用します。実際、私のコードを見ることができます。おそらくそれはより良い説明になるでしょう. あなたが得ることができない唯一のものは、私がそれを使用した for ループです for(auto b:a) b は a の反復子であり、auto はそれを宣言する簡単な方法です.Here はソースコードです.

    #include "stdafx.h"
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main()
{
vector<string> a;
push:
a.push_back("#include \"stdafx.h\"");
a.push_back("#include <vector>");
a.push_back("#include <string>");
a.push_back("#include <iostream>");
a.push_back("using namespace std;");
a.push_back("using namespace std;");
a.push_back("int main()");
a.push_back("{");
a.push_back("vector<string> a;");
a.push_back("push:");
a.push_back("for(auto b:a)");
a.push_back("{");
a.push_back("cout << b << endl;");
a.push_back("if(b == \"push:\")");
a.push_back("{");
a.push_back("for(auto c:a)");
a.push_back("{");
a.push_back("cout << \"a.push_back(\\\"\" << c << \\\"\";\" << endl;");
a.push_back("}");
a.push_back("}");
a.push_back("}");
a.push_back("return 0;");
a.push_back("}");
for(auto b:a)
{
    cout << b << endl;
    if(b == "push:")
    {
        for(auto c:a)
        {
            cout << "a.push_back(\"" << c << "\");" << endl;
        }
    }
}
return 0;
}
于 2013-09-23T19:06:12.833 に答える