4

私は C++ の世界に慣れていないので、非常に些細な問題、つまり拡張子のないファイル名を取得することに行き詰まりました。

TCHAR含む変数がsample.txtあり、 のみを抽出する必要があります。渡した値と同じ値を返す関数sampleを使用しました。PathFindFileName

解決策をグーグルで調べてみましたが、まだうまくいきませんか?!

編集:私は常に3文字のファイル拡張子を取得します。次のコードを追加しましたが、最後にMontage (2)««þîþどうすればジャンク文字を回避できますか?

TCHAR* FileHandler::GetFileNameWithoutExtension(TCHAR* fileName)
{
    int fileLength = _tcslen(fileName) - 4;
    TCHAR* value1 = new TCHAR;
    _tcsncpy(value1, fileName, fileLength);
    return value1;
}
4

5 に答える 5

9

PathRemoveExtension関数を使用して、ファイル名から拡張子を削除できます。

ファイル名 (拡張子付き) のみを取得するには、最初にPathStripPathを使用し、その後にPathRemoveExtension.

于 2011-07-16T06:19:26.210 に答える
7

これがその方法です。

#ifdef UNICODE //Test to see if we're using wchar_ts or not.
    typedef std::wstring StringType;
#else
    typedef std::string StringType;
#endif

StringType GetBaseFilename(const TCHAR *filename)
{
    StringType fName(filename);
    size_t pos = fName.rfind(T("."));
    if(pos == StringType::npos)  //No extension.
        return fName;

    if(pos == 0)    //. is at the front. Not an extension.
        return fName;

    return fName.substr(0, pos);
}

これは、UNICODE 設定に応じて、std::string または std::wstring を返します。TCHAR* に戻すには、StringType::c_str(); を使用する必要があります。これは const ポインターであるため、変更することはできず、それを生成した文字列オブジェクトが破棄された後は無効になります。

于 2011-07-11T07:15:58.883 に答える
2

以下の解決策を試してください、

string fileName = "sample.txt";
size_t position = fileName.find(".");
string extractName = (string::npos == position)? fileName : fileName.substr(0, position);
于 2011-07-11T07:02:59.077 に答える
2
TCHAR* FileHandler::GetFileNameWithoutExtension(TCHAR* fileName)
{
    int fileLength = _tcslen(fileName) - 4;
    TCHAR* value1 = new TCHAR[fileLength+1];
    _tcsncpy(value1, fileName, fileLength);
    return value1;
}
于 2011-07-11T07:13:22.737 に答える
1

これを試して:

ファイル名が文字列であると仮定します。

string fileName = your file.

string newFileName;

for (int count = 0;
   fileName[count] != '.';
   count++)
{
  newFileName.push_back(fileName[count]);
}

これにより、元のファイル名の文字がカウントされ、新しいファイル名の文字列に1つずつ追加されます。

これを行うにはいくつかの方法がありますが、これはそれを行うための1つの基本的な方法です。

于 2011-07-11T07:07:17.627 に答える