【问题标题】:Editing a string to include variables between brackets c++编辑字符串以包含括号之间的变量c ++
【发布时间】:2020-10-13 18:17:48
【问题描述】:

我有一个字符串filename,其中包含一个文件的名称,例如。例子.plt。我想通过在字符串末尾的两个括号之间插入一个整数变量来编辑这个字符串,如下所示: example.plt --> example(1).plt

我尝试的是删除文件扩展名 (.plt),使用整数变量添加括号并添加扩展名,但我似乎无法正确使用语法:

filename = filename.erase(filename.length() - 4); //example.plt - .plt = example
filename = filename + "(" + i + ")" + ".plt"; //example + ( + i + ) + .plt = example(i).plt

这个想法是,当我稍后创建一个名为 example.plt 的文件时,我不会覆盖现有的 example.plt,而是创建一个新文件 example(1).plt。如果有人可以为此提供正确的语法或建议一种更优雅的方式来帮助我,我将不胜感激。

【问题讨论】:

  • 在拆分文件名时,您确实应该使用<filesystem> 或您的操作系统提供给您的工具。您不需要搞清楚名称的哪一部分是扩展名等。一旦您将名称拆分为其组件,那么只需将名称与数字后缀放在一起就很简单了。跨度>
  • @PaulMcKenzie 正如您所说,这不是解决问题的理想方法,但这是我有限经验所能想到的唯一方法。如果您能详细说明我如何使用 来实现这一点,我将很高兴了解如何

标签: c++ string file


【解决方案1】:

如果您有 C++ 17 或更高版本,使用 std::filesystem,则名称的 (x) 尾部的生成可以是通用的。

#include <filesystem>
#include <string>
#include <iostream>

namespace fs = std::filesystem;

std::string generate_name(const std::string& name, int value)
{
    std::string ext = fs::path(name).extension().generic_string();
    std::string stem = fs::path(name).stem().generic_string();
    return stem + "(" + std::to_string(value) + ")" + ext;
}

int main()
{
    std::string name = "filename.plt";
    std::cout << generate_name(name, 1) << "\n";
    std::cout << generate_name(name, 2) << "\n";
    std::cout << generate_name("another_name.txt123", 1) << "\n";
}

输出:

filename(1).plt
filename(2).plt
another_name(1).txt123

请注意,无论扩展长度如何,这现在都有效。

【讨论】:

  • 非常感谢,我知道这将是一个更有用和模块化的解决方案。这也可以使用 吗?
  • 是的,它也应该适用于boost。也许获取扩展名和名称的功能可能不同,但我相信它看起来与解决方案相似。
  • #include &lt;boost/filesystem.hpp&gt;namespace fs = boost::filesystem; 应该是您需要的唯一更改(添加了与 boost 文件系统库的链接)。
  • 很高兴听到这个消息,再次感谢您的帮助。
【解决方案2】:

如果iint,则需要先将其转换为string,使用to_string 方法。

filename = filename + "(" + std::to_string( i ) + ")" + ".plt";

正如 PaulMcKenzie 在 cmets 中所说,您应该使用 filesystem 来获取文件名、扩展名等。

例子:

#include <filesystem>
#include <iostream>
#include <string>

int main() {
    std::string filename = "apples/oranges/example.plt";
    std::filesystem::path path = filename;
    std::string name = path.stem().string();
    name += '(' + std::to_string( 1 ) + ')' + path.extension().string();
    path.replace_filename( name  );

    std::cout << path; // output: apples/oranges/example(1).plt
}

【讨论】:

    【解决方案3】:

    您必须将i 转换为字符串。

    您可以使用例如std::to_string()

    #include 
    文件名 =...
    文件名+="("+std::to_string(i)+").plt"
    

    【讨论】:

      【解决方案4】:

      这是您所描述的工作示例

      #include 
      #include 
      
      主函数()
      {
          std::string 文件名 = "example.plt";
          文件名 = 文件名.erase(文件名.长度() - 4);
          文件名 = 文件名 + "(" + std::to_string(2) + ").plt"; // 你可以用 i 替换 2
          std::cout 
      

      输出:

      example(2).plt
      

      如果这不起作用,发布您在尝试编译时遇到的错误或代码输出的内容可能会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 2021-11-24
        相关资源
        最近更新 更多