【问题标题】:c++ string concatenation second timec ++字符串连接第二次
【发布时间】:2015-12-29 08:40:23
【问题描述】:

我是一个新手,正在编写一个 c++ 代码来打开和读取多个文件,然后将部分数据转储到其他文件中。 我想在 for 循环中生成文件名。 但我无法连接字符串(文件编号)和字符串文字(文件扩展名)。同一行代码在程序的最开始起作用,但在后面部分不起作用。

int main(int argc, char *argv[])
{
   std::cout << std::string("9") + ".dat" << std::endl;

    // many more lines

    dump = 1;
    if (dump == 1){
        for (int ilevel=std::max(levelmin,lmin); ilevel < lmax + 1; ilevel++){
            std::cout << std::string("9") + ".dat" << std::endl; // crashes here!
            std::ofstream fout (std::string("9") + ".dat", std::ios::out | std::ios::binary);
            std::cout << grid[ilevel].cube[0] << std::endl;

            fout.write ((char*)&grid[ilevel].cube[0], grid[ilevel].cube.size() * sizeof(grid[ilevel].cube[0]));
            fout.close();
        }
    }
    ...
}

如果我将std::cout &lt;&lt; std::string("9") + ".dat" &lt;&lt; std::endl; 放在开头,它会起作用并打印“9.dat”。 但在后面的循环中,分段错误。

在两者之间,我调用了一个函数,该函数使用 stringstream 将前导零填充到整数。函数看起来:

std::string int2str(const int n, const int m){
    std::stringstream ss;
    ss << std::setfill('0') << std::setw(m) << n;
    std::string s2(ss.str());
    ss.clear();
    return s2;
}

我对c++中的string和stringstream不是很清楚。 但是在我的程序中的许多东西中,这个功能是我唯一能想到的相关的东西。代码的其他部分不处理字符串。它主要是数组操作代码。

我也试过std::string("9") + std::string(".dat") 但没有运气。 怎么了?

【问题讨论】:

  • 对即将超出范围并运行其析构函数的变量调用ss.clear() 毫无意义。同样对于f.close(),它无论如何都要运行它的析构函数。析构函数关闭文件。
  • 如果它真的像你说的那样崩溃,那几乎可以肯定是内存损坏造成的。您能否从您的代码中分离出一个实际的MCVE 并发布它?也就是说,我们可以复制并粘贴到 minimal 的东西,例如Coliru 并自己查看错误。

标签: c++ string c++11 string-concatenation stringstream


【解决方案1】:

您使用std::string("9") 而不仅仅是"9" 有什么具体原因吗?

9 来自哪里?如果它是作为循环的一部分生成的,或者是函数的返回值,您可以将变量本身连接起来,也可以放置返回它的函数,所以:

std::cout &lt;&lt; iFileNumber + ".dat" &lt;&lt; std::endl;

std::cout &lt;&lt; fileNumberGenerator() + ".dat" &lt;&lt; std::endl;

对于您提供的硬编码示例,我个人认为除了

std::cout &lt;&lt; 9 + ".dat" &lt;&lt; endl;

但这很可能只是我缺乏经验。

为了打印到命令行,这同样是可接受的语法也毫无价值(假设你还没有意识到):

std::cout &lt;&lt; 9 &lt;&lt; ".dat" &lt;&lt; endl;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2023-04-02
    • 2021-09-05
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多