1

私はブーストv1.52.0でVisualStudio2011 C ++を使用しています。サブディレクトリ内のファイルを検索するメソッドを追加し、プログラムを閉じるときにこのエラーが発生し始めました。

Unhandled exception at 0x7733E3BE (ntdll.dll) in Platformer.exe: 0xC0000005: Access violation reading location 0x437FEF0C.

FileSystem.h:

#ifndef FILESYSTEM_H
#define FILESYSTEM_H

#include "boost/filesystem.hpp"

namespace fs=boost::filesystem;

class FileSystem
{
public:
    static const std::string GetExePath();
    static const std::string GetFullPath(std::string fileName, std::string searchInPath = "");
};

#endif

FileSystem.cpp

#include "FileSystem.h"

const std::string FileSystem::GetExePath()
{
    fs::path path = fs::current_path();
    return path.string();
}

const std::string FileSystem::GetFullPath(std::string fileName, std::string searchInPath)
{
    if(searchInPath == "") 
    {
        searchInPath = GetExePath();
    }

    fs::directory_iterator end_iter;
    for( fs::directory_iterator dir_iter(searchInPath); dir_iter!=end_iter; ++dir_iter)
    {
        if(fs::is_directory(dir_iter->status()))
        {
            return GetFullPath(fileName, dir_iter->path().string());
        }
        else if (fs::is_regular_file(dir_iter->status()))
        {
            if(dir_iter->path().filename() == fs::path(fileName).filename())
            {
                return dir_iter->path().string();
            }
        }
    }

    return std::string("");
}

そして、私はそれをそのように使用します:

std::string imageFullPath = FileSystem::GetFullPath("image.png");

このコードの何が問題になっていますか?ありがとう。

4

1 に答える 1

0

まず、SDL(Simple DirectMedia Layer)ライブラリを使用していることについては触れませんでした。これらのライブラリは、#pragmaコメント(lib、...)を使用してリンクされていたため、アプリケーションを閉じるときにエラーが発生します。プロジェクトのプロパティ->リンカー->入力->追加の依存関係のセクションでそれらを定義し、問題が解決されました。

次に、GetFullPathメソッドが間違っていました。正しいものは次のとおりです。

const std::string FileSystem::GetFullPath(std::string fileName, std::string searchInPath)
{
    std::string result;

    if(searchInPath.empty()) {
        searchInPath = GetExePath();
    }

    fs::directory_iterator end_iter;
    for( fs::directory_iterator dir_iter(searchInPath); dir_iter!=end_iter; ++dir_iter)
    {
        if(fs::is_directory(dir_iter->status()))
        {
            result = GetFullPath(fileName, dir_iter->path().string());
            if(!result.empty())
            {
                break;
            }
        }
        else if (fs::is_regular_file(dir_iter->status()))
        {
            if(dir_iter->path().filename() == fs::path(fileName).filename())
            {
                result = dir_iter->path().string();
                if(!result.empty())
                {
                    break;
                }
            }
        }
    }

    return result;
}
于 2012-11-23T12:56:32.690 に答える