如何将 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.bmpabcd2.bmp...)...我该怎么做?

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

最小的库...包括

#include <STDLIB.H>
#include <STDIO.H>
#include <TCHAR.H>

预期操作系统:Windows

【问题讨论】:

您使用的是TCHAR,但在字符串前面加上L,这将始终为您提供一个宽字符串。如果您总是想要一个宽字符串,那么只需使用 wchar_t 谢谢,调用 CreateFileW 它将 LPCWSTR 参数作为文件名,我会解决这个问题...我仍在试验和学习这个字符的东西...不确定 LPCWSTR 需要什么,但 TCHAR 和 wchar_t 都需要工作:-) TCHAR 是一个宏,它可以定义为charwchar_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),请使用 wstringstreamwstring

如果你真的不想使用 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 字符串流附加 int?

如何将手动数据附加到struct Codable数组?

将 int 附加到 std::string [重复]

将数组 int 附加到字符串数组

将前导零附加到给定值[重复]

如何在 C++ 中将 int 附加到字符串? [复制]