0

次のような配列が 1 つあります。

static WCHAR FilesToShow[][100] = { { L"start.cmd" },{ L"image.xml" }, { L"xyz" }};

ご覧のとおり、"xyz" があり、これを一意の名前に置き換える必要があります。このためには、image.xml ファイルを読み取る必要があります。

どうすればこれができるか教えてください。

私はこのような方法を書きました:

PRIVATE WCHAR GetSystemName(WCHAR *pName)

{
    WCHAR line;

    wfstream in("image.xml");
    WCHAR tmp; 

    bool begin_tag = false;
    while (getline(in,line))
    {
        // strip whitespaces from the beginning
        for (int i = 0; i < line.length(); i++)
        {
            if (line[i] == ' ' && tmp.size() == 0)
            {
            }
            else
            {
                tmp += line[i];
            }
        }        

        if (wcswcs(tmp,"<SystemPath>") != NULL)
        {    
           ???????? how to get "vikash" from here <SystemPath>C:\Users\rs_user\Documents\RobotStudio\Systems\vikash</SystemPath>
        }
        else
        {
            continue;
        }

    }

    return tmp;
}

wfstream、getline、および line.length() メソッドで例外が発生します。fstream.h ヘッダー ファイルをインクルードしましたが、COM ではサポートされていないと思います。

xml ファイルを解析せずにこの問題を解決する方法を教えてください。

4

3 に答える 3

0

ここにはいくつかの問題があります。

  1. あなたが得ているのはコンパイルエラーであり、例外ではありません
  2. インクルードするヘッダー ファイルは、「fstream.h」ではなく「fstream」です。
  3. という行があることを確認してくださいusing namespace std;
  4. linetype の変数として宣言しているWCHARため、これは単一のワイド文字であり、確かにwstringオブジェクトではありません。したがってline.length()、正しくありません。
  5. wcswcs()C ( ) と C++ (STL)を混在させているのはなぜですか? 関数シグネチャを再設計する必要があるかもしれません。

ただし、以下の機能を試してください。へのポインターを返すように署名を変更しWCHAR、要求された文字列を pName によって提供されるバッファー スペースに配置します。バッファーが名前と終端の NULL 文字に十分な大きさであることを確認するためのチェックを追加しました。

WCHAR* GetSystemName(WCHAR *pName, size_t buflen)
{
    wstring line;
    wifstream in("image.xml");
    WCHAR* tmp = NULL;

    while (getline(in,line))
    {
        // strip whitespaces from the beginning
        size_t beg_non_whitespace = line.find_first_not_of(L" \t");
        if (beg_non_whitespace != wstring::npos)
        {
            line = line.substr( beg_non_whitespace );
        }

        size_t beg_system_path = line.find( L"<SystemPath>" );
        if ( beg_system_path != wstring::npos )
        {    
            // strip the tags (assuming closing tag is present)
            size_t beg_data = beg_system_path + wstring( L"<SystemPath>" ).length();
            size_t range = line.find( L"</SystemPath>" ) - beg_data;
            line = line.substr( beg_data, range );

            // get file name
            size_t pos_last_backslash = line.find_last_of( L'\\' );

            if ( pos_last_backslash != wstring::npos )
            {
                line = line.substr( pos_last_backslash + 1 );

                if ( buflen <= line.length() )
                {
                    // ERROR: pName buffer is not large enough to fit the string + terminating NULL character.
                    return NULL;
                }

                wcscpy( pName, line.c_str() );
                tmp = pName;
                break;
            }
        }
    }

    return tmp;
}

編集:さらに、プログラムの他の領域で XML を使用および/または解析している場合は、Xerces-ClibXml2などの XML 解析ライブラリを使用することを強くお勧めします。

于 2013-10-29T15:23:06.333 に答える
0

皆様、ご回答ありがとうございます。ここで私は私の質問の解決策を得ました。

プライベート WCHAR* GetNewSystemName() {

    WCHAR line[756];
    WCHAR tempBuffer[100];

CComBSTR path = CurrentFolder.Path();

CComBSTR imagePath1 = L"rimageinfo.xml";


path.AppendBSTR(imagePath1);



    std::wfstream in(path);



WCHAR tmp[756]; 



in.getline(line, 756);

WCHAR* buffer;



buffer = wcswcs(line, L"<SystemPath>");
WCHAR *dest = wcsstr(buffer, L"</SystemPath>");
    int pos;
    pos = dest - buffer;
unsigned int i = 0;
if (wcswcs(buffer,L"<SystemPath>") != NULL && wcswcs(buffer,L"</SystemPath>") != NULL)
{ 
    for (; i < pos; i++)
    {
        if (buffer[i] == ' ' && sizeof(tmp) == 0)
        {
        }
        else
        {
            tmp[i] = buffer[i]; 

        }
    }

    tmp[i] = NULL;
    //break;
}

int j = i;

for (; j > 0; j--)
{
    if (tmp[j] == '\\')
    {

        break;
    }
}

j++;    
int k = 0;
for (; j < i ; j++)
{
    System_Name[k] = tmp[j];
    k++;
}

System_Name[k] = NULL;
   return System_Name;
于 2013-11-05T14:36:02.617 に答える