C++ 如何将int附加到tchar?

C++ 如何将int附加到tchar?,c++,c,string,formatting,C++,C,String,Formatting,出于测试目的,我希望每次创建一个文件名时都能为其添加一个数字-我正在测试的应用程序没有用户界面,可能会创建多个文件 void somefunction() { static INT iFileNo = 0; TCHAR tFileName[MAX_PATH] = L"c:/test/abcd.bmp"; iFileNo ++; } 我想以某种方式将iFileNo附加到tFileName(以获得类似abcd1.bmp,abcd2.bmp…)。。。我该怎么做 注意:我没有使

出于测试目的,我希望每次创建一个文件名时都能为其添加一个数字-我正在测试的应用程序没有用户界面,可能会创建多个文件

void somefunction()
{
    static INT iFileNo = 0;
    TCHAR tFileName[MAX_PATH] = L"c:/test/abcd.bmp";
    iFileNo ++;
}
我想以某种方式将
iFileNo
附加到
tFileName
(以获得类似
abcd1.bmp
abcd2.bmp
…)。。。我该怎么做

注意:我没有使用任何字符串库

最小库。。。包括

#include <STDLIB.H>
#include <STDIO.H>
#include <TCHAR.H>
#包括
#包括
#包括
预期操作系统:Windows可以使用:

您需要确保缓冲区足够大以容纳文件名

如果您真的不想使用任何库,那么Windows实际上有自己的字符串格式化功能,您可以使用它来代替sprintf

您可以使用:

您需要确保缓冲区足够大以容纳文件名


如果您真的不想使用任何库,那么Windows实际上有自己的字符串格式化功能,您可以使用它来代替sprintf

您可以使这变得很难、简单或非常简单。其中的中间部分将类似于:

void somefunction()
{
    static unsigned int uiFileNo = 0;
    static const WCHAR wSpec[] = L"c:/test/abcd%u.bmp";

    WCHAR wFileName[MAX_PATH];    
    swprintf_s(wFileName, MAX_PATH, wSpec, uiFileNo++);
}
使用,这似乎满足了您的include文件限制(假设这是Windows,您的问题似乎表明了这一点)


就我个人而言,我使用的是
std::wstring
,但您似乎有理由反对它。无论如何,祝你好运。

你可以让这件事变得困难、容易或非常容易。其中的中间部分将类似于:

void somefunction()
{
    static unsigned int uiFileNo = 0;
    static const WCHAR wSpec[] = L"c:/test/abcd%u.bmp";

    WCHAR wFileName[MAX_PATH];    
    swprintf_s(wFileName, MAX_PATH, wSpec, uiFileNo++);
}
使用,这似乎满足了您的include文件限制(假设这是Windows,您的问题似乎表明了这一点)


就我个人而言,我使用的是
std::wstring
,但您似乎有理由反对它。无论如何,祝你好运。

你表达了不使用任何库的愿望。我不赞成这个选择,但既然你问了

最简单的方法是确定一个固定的位数,前导零。这使得问题变得微不足道。在这个例子中,我使用了两个数字

void somefunction()
{
    static INT iFileNo = 0;
    TCHAR tFileName[MAX_PATH] = L"c:/test/abcd00.bmp";
    int iNumberOffset = 12;
    if (iFileNo >= 100)
        throw std::runtime_error("File number too large");
    tFileName[iNumberOffset] += iFileNo / 10;
    tFileName[iNumberOffset+1] += iFileNo % 10;
    iFileNo ++;
}

您已经表达了不使用任何库的愿望。我不赞成这个选择,但既然你问了

最简单的方法是确定一个固定的位数,前导零。这使得问题变得微不足道。在这个例子中,我使用了两个数字

void somefunction()
{
    static INT iFileNo = 0;
    TCHAR tFileName[MAX_PATH] = L"c:/test/abcd00.bmp";
    int iNumberOffset = 12;
    if (iFileNo >= 100)
        throw std::runtime_error("File number too large");
    tFileName[iNumberOffset] += iFileNo / 10;
    tFileName[iNumberOffset+1] += iFileNo % 10;
    iFileNo ++;
}


您使用的是
TCHAR
,但在字符串前面加上
L
,这将始终为您提供一个宽字符串。如果您总是想要一个宽字符串,那么只需使用
wchar\u t
谢谢,调用CreateFileW,将LPCWSTR参数作为文件名,我将修复这个问题。。。我还在试验和学习这个角色的东西。。。不确定LPCWSTR需要什么,但TCHAR和wchar都起作用:-)
TCHAR
是一个宏,它被定义为
char
wchar\t
,具体取决于编译器设置。编辑后的问题是“C”,而不是“C++”。不必是纯C。。。但是库是最小的,因为它的预期用途您使用的是
TCHAR
,但是在字符串前面加上
L
,这将始终为您提供一个宽字符串。如果您总是想要一个宽字符串,那么只需使用
wchar\u t
谢谢,调用CreateFileW,将LPCWSTR参数作为文件名,我将修复这个问题。。。我还在试验和学习这个角色的东西。。。不确定LPCWSTR需要什么,但TCHAR和wchar都起作用:-)
TCHAR
是一个宏,它被定义为
char
wchar\t
,具体取决于编译器设置。编辑后的问题是“C”,而不是“C++”。不必是纯C。。。但是库是最小的,因为它的预期用途应该是
std::ostringstream
。除此之外:在这种情况下,我发现将
fill
设置为
'0'
并使用宽度是很有用的;这意味着对文件名进行字典排序将按顺序返回它们。(但是如果它们是完全不相关的文件,这可能是不相关的。)非常感谢,std::string版本在其他地方也会对我有所帮助。应该是
std::ostringstream
。除此之外:在这种情况下,我发现将
fill
设置为
'0'
并使用宽度是很有用的;这意味着对文件名进行字典排序将按顺序返回它们。(但是如果它们是完全不相关的文件,这可能是不相关的。)非常感谢,std::string版本在其他方面也会对我有所帮助。我应该提到操作系统,它严格地说是Windows,谢谢你的好意example@Thalia如果你想在字典上有可比的文件名,请考虑杰姆斯所说的。将格式规范更改为使用类似于
abcd%.4u.bmp
,它将
'0'
-填充数字,
0000
0001
,等等,在出血到第五位之前为您提供10000个数字。我刚刚看到了这一点,这是一个伟大的观点(因为我实际上只输出调试文件,所以我并不在意,但我还是让它看起来很专业。)谢谢much@WhozCraig只是好奇,为什么
%.4u
,而不是
%04u
?(以我的经验,许多人不知道整数类型的精度是如何工作的,而更多的人似乎理解了
%04u
)@JamesKanze我不知道。这只是一种偏好,是多年前的一种转换。我同意大多数人要么不理解,要么不知道(但也许现在他们可能=)是的-我应该提到的操作系统,它是严格的Windows,谢谢你的非常好的example@Thalia考虑杰姆斯所说的话,如果你想要字典上可比较的文件名,请修改格式规范,使用诸如<代码> ABCD%.4U.BMP < /C> >,它将<代码> '0' < /代码> -填充数字,<代码> 0000 ,<代码> 0001 < /代码>等。,给你10000个数字,然后流血到第五位。我只是看着那个,它