1

これは、Visual Studio 2010 C++ プロジェクトにファイルが存在するかどうかを確認するためのコードです。

bool GLSLProgram::fileExists( const string & fileName )
{
    struct stat info;
    int ret = -1;

    ret = stat(fileName.c_str(), &info);
    return 0 == ret;
}

そのファイルが実際に存在し、シェーダーがプロジェクトのメインフォルダー内のフォルダーである場合に、「shaders/color.vert」に対して false を返す理由がわかりません。

何か間違っていることがわかりますか?

ありがとう

4

1 に答える 1

3

わかりましたので、IDE から実行する際の癖を説明するために、私が行った小さなテストを示します。これが、VS で相対パスがどのように機能するかを理解するのに役立つことを願っています。

したがって、私のフォルダー階層は次のようになります。

/_Sandbox
    _Sandbox.sln
    /Debug
        _Sandbox.exe
        /shaders
            color.vert
    /_Sandbox
        _Sandbox.proj
        main.cpp

コードは次のようになります。

#include <iostream>
#include <string>
#include <sys/stat.h>

int main(int argc, char* argv[])
{
    struct stat info;

    std::string path = "shaders/color.vert"; // To not I get the same behavior with "shaders\\color.vert"
    int ret = stat(path.c_str(), &info);

    ret == 0 ? std::cout << "File found." << std::endl : std::cout << "File doesn't exist." << std::endl;

    std::cin.get();
    return 0;
}

したがって、これを IDE で実行すると、「ファイルが存在しません」というメッセージが表示され、IDE の外部でこれを実行すると、「ファイルが見つかりました」というメッセージが表示されます。プログラムが VS 内からシェーダー ファイルを見つけるには、次のようにシェーダー フォルダーを配置する必要があります。

/_Sandbox
    _Sandbox.sln
    /Debug
        _Sandbox.exe
    /_Sandbox
        /shaders
            color.vert
        _Sandbox.proj
        main.cpp

ただし、IDE の内外からフォルダーを見つけるためのコードを取得できます。あなたがしなければならないことは、プロジェクトの設定に行くことです。「デバッグ」で、「作業ディレクトリ」を$(SolutionDir)$(Configuration)\

うまくいけば、これで問題が解決します。

于 2012-11-30T20:26:58.210 に答える