如何将 int 附加到 tchar?
Posted
技术标签:
【中文标题】如何将 int 附加到 tchar?【英文标题】:How can I append an int to a tchar? 【发布时间】:2015-01-15 15:56:10 【问题描述】:出于测试目的,我希望每次创建文件名时都为其添加一个数字 - 我正在测试的应用程序没有用户界面,并且可能会创建多个文件。
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
【问题讨论】:
您使用的是TCHAR
,但在字符串前面加上L
,这将始终为您提供一个宽字符串。如果您总是想要一个宽字符串,那么只需使用 wchar_t
谢谢,调用 CreateFileW 它将 LPCWSTR 参数作为文件名,我会解决这个问题...我仍在试验和学习这个字符的东西...不确定 LPCWSTR 需要什么,但 TCHAR 和 wchar_t 都需要工作:-)
TCHAR
是一个宏,它可以定义为char
或wchar_t
,具体取决于您的编译器设置。
编辑后的问题是“C”,但不再是“C++”了。
不一定是纯 C...但库是最小的,因为它的预期用途
【参考方案1】:
您可以使这变得困难、容易或非常容易。中间是这样的:
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++);
使用swprintf_s
,这似乎满足了您的包含文件限制(假设这是 Windows,您的问题似乎表明了这一点)。
我个人使用std::wstring
,但您似乎有理由反对它。无论如何,祝你好运。
【讨论】:
是的 - 我应该提到操作系统,严格来说是 Windows,谢谢你提供的非常好的例子 @Thalia 也考虑一下 James 所说的话 如果您想要在字典上具有可比性的文件名,请将格式规范更改为使用abcd%.4u.bmp
之类的东西,这将 '0'
-填充数字、0000
、@ 987654328@ 等,在排入第 5 位之前给您 10000 个数字。
我只是在看,这是一个很好的观点(因为我真的只输出调试文件,我并不在意,但我不妨让它看起来很专业)。非常感谢
@WhozCraig 只是好奇,但为什么是%.4u
,而不是%04u
? (根据我的经验,很多人不知道精度如何与整数类型一起工作,而更多人似乎理解%04u
。)
@JamesKanze 我不知道。它只是一种偏好,是几年前的转换。我同意大多数人要么不了解或不了解它(但也许他们现在可能 =)【参考方案2】:
您表达了不使用任何库的愿望。这不是我支持的选择,但既然你问了......
最简单的方法是确定固定位数,前导零。这使问题变得微不足道。在这个例子中,我使用了两位数。
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 ++;
【讨论】:
非常感谢您的示例和 cmets 你每次都初始化字符串。我错过了。 (而且你这样做的方式可能也适用于wchar_t
。)我删除了我的评论,因为它并不真正相关。【参考方案3】:
你可以使用ostringstream:
std::ostringstream s;
s << "c:/test/abcd.bmp"
s << iFileNo++;
std::string filename = s.str();
如果您想要宽版本(如您在示例中指定 L
),请使用 wstringstream
和 wstring
。
如果你真的不想使用 C++ 库,那么你可以使用sprintf:
char filename[100];
sprint(filename, "c:/test/abcd.tmp-%d", iFileNo);
iFileNo++
您需要确保缓冲区足够大以容纳文件名。
如果你真的不想使用任何库,那么 Windows 实际上有它自己的字符串格式化函数 wsprintf,你可以使用它来代替 sprintf
。
【讨论】:
应该是std::ostringstream
。除此之外:在这种情况下,我发现将fill
设置为'0'
并使用宽度很有用;这意味着文件名的字典排序将按顺序返回它们。 (但如果它们是完全不相关的文件,这可能是无关紧要的。)
非常感谢,std::string版本在其他地方也会帮到我以上是关于如何将 int 附加到 tchar?的主要内容,如果未能解决你的问题,请参考以下文章