1

Win32 アプリケーションでファイルを開くことができるようにしたいと考えています。私が使用している方法は、「C:\MyFolder」などのエディット ボックスからルート パスを取得することです (これは に割り当てられていstrPathToSourceます)。次に、「\source\Utilities\File.h」などの別の文字列を追加し、連結されたパスを新しい変数に保存しますstrPathToFile

したがってstrPathToFile、「C:\MyFolder\source\Utilities\File.h」が含まれている必要があり、infile.open(strPathToFile).

関連するコードを以下に示します。

ifstream infile;

int bufSize = 1024;
LPTSTR strPathToSource = new TCHAR[bufSize];
GetDlgItemText(hWnd, IDC_MAIN_EDIT_FILEPATH, strPathToSource, bufSize); // Get text from edit box and assign to strPathToSource

const char* strPathToFile = char(strPathToSource) + PATH_TO_FILE;
infile.open(strPathToFile);
if(!infile)
{
    log(hWnd, "File.h not found.");
    return false;
}

は次PATH_TO_FILEのように定義されます。

const char* PATH_TO_FILE = "\\source\\Utilities\\File.h";

私の問題は、常に「File.h not found」からログアウトしていることです。問題は連結にあると思います。

const char* strPathToFile = char(strPathToSource) + PATH_TO_FILE;

ステップスルーすると、strPathToSourceとの値が本来PATH_TO_FILEあるべき姿であることがわかりますが、連結された結果strPathToFileは NULL 値であると私は信じています。

4

2 に答える 2

2

2 つの文字ポインターを追加しても、文字列は連結されません。2 つのポインター値が (「数値」として) 追加されるだけです。したがって、無効なポインターになります。

また、現在のビルド設定によっては、TCHAR もワイド文字になる可能性があるため、LPTSTR から char* への型キャストはお勧めできません。(実際には、LPTSTR をポインタではなく char にキャストしていますが、これはさらに間違っています)

両方の文字列を std::string (または wstring) に変換するのが最も簡単だと思います。「+」演算子を使用して連結を行うことができます。

それを行う1つの可能性:

const std::wstring strPathToFile = cvt2wstring(strPathToSource) + cvt2wstring(PATH_TO_FILE);

次のように定義された cvt2wstring:

#include <codecvt>
#include <string>

std::wstring cvt2wstring(const char * str)
{
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> > converter;
    return converter.from_bytes(str);
}

std::wstring cvt2wstring(const wchar_t * str)
{
    return str;
}

実際の型に応じて、適切なオーバーロードを選択する必要があります。

std::string への反対の変換 (通常の std::ifstream を使用できるようにするため) では、方向を切り替えることができます。

std::string cvt2string(const char * str)
{
    return str;
}

std::string cvt2string(const wchar_t * str)
{
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> > converter;
    return converter.to_bytes(str);
}

私にとって、ifstream::open() は wstring で動作するようです (ただし、C++ 標準ではそれが提供されていないため、MSVC 拡張機能である可能性があります。TCHAR & comp を使用する場合は、おそらく Windows と MSVC をターゲットにします)。

于 2016-02-03T14:15:08.693 に答える