在cpp中连接字符串的字符串和int

时间:2015-04-27 19:18:17

标签: c++ string loops concatenation

作为C ++的新手,我看过C++ concatenate string and int,但我的要求并不完全相同。

我有一个示例代码如下:

#include <iostream>
#include <fstream>
#include <stdio.h>

using namespace std;

int main ()
{
std::string name = "John"; int age = 21;
std::string result;
std::ofstream myfile;
char numstr[21]; 
sprintf(numstr, "%d", age);
result = name + numstr;
myfile.open(result);
myfile << "HELLO THERE";
myfile.close();
return 0;
}

字符串和int连接通常有效,但是当我希望它是文件名时。

所以基本上,我希望文件名是字符串和整数的组合。这不适合我,我收到错误

  

来自'std :: string {aka的参数1没有已知的转换   std :: basic_string}'到'const char *'

我希望这个逻辑用于for循环

for(i=0;i<100;i++) {
if(i%20==0) {
  result = name + i;
  myfile.open(result);
  myfile << "The value is:" << i;
  myfile.close(); }
}

所以,基本上每20次迭代,我需要将这个“值是”打印在一个名为John20,John40等新文件中。所以,对于100次迭代,我应该有5个文件

3 个答案:

答案 0 :(得分:4)

  

字符串和int连接通常有效,但是当我希望它是文件名时。

它与串联字符串无关。您的编译器不支持C ++ 11,这意味着您无法将std::string作为参数传递给std::ofstream::open。您需要一个指向空终止字符串的指针。幸运的是,std::string::c_str()为您提供了:

myfile.open(result.c_str());

请注意,您可以直接实例化流:

myfile(result.c_str()); // opens file

至于循环版本,请参阅处理连接整数和字符串的许多重复项之一。

答案 1 :(得分:3)

您引用的问题与字符串连接问题高度相关。如果可能,我建议使用C++11 solution

#include <fstream>
#include <sstream>

int main() {
    const std::string name = "John";
    std::ofstream myfile;
    for (int i = 0; i < 100; i += 20) {
        myfile.open(name + std::to_string(i));
        myfile << "The value is:" << i;
        myfile.close();
    }
}

stringstream solution兼容性:

#include <fstream>
#include <sstream>

int main() {
    const std::string name = "John";
    std::ofstream myfile;
    for (int i = 0; i < 100; i += 20) {
        std::stringstream ss;
        ss << name << i;
        myfile.open(ss.str().c_str());
        myfile << "The value is:" << i;
        myfile.close();
    }
}

此外,你应该:

  • 消除迷路,包括<iostream><stdio.h>
  • 消除using namespace std;,这一般是不好的做法 - 你甚至不需要它。
  • 简化循环
  • 将前缀标记为const

(你可以使用sprintf(numstr, "%s%d", name.c_str(), i)组成文件名,但这只是非常糟糕的C ++代码。)

答案 2 :(得分:0)

如果我们首先查看循环,我们可以选择从1而不是0开始计数,这样你的第一个文件将是name+20,我们会在i点击之前停止计数101那样你的上一个文件就是name+100

我们还需要在字符串中添加.txt以生成文本文件。
如果你将这些参数传递给函数作为引用或引用const不会更改数据(例如名称)。然后我们需要将i转换为字符串,如果您的编译器支持c ++ 11,则可以使用std::to_string()。我选择创建一个ostringstream对象,并存储从成员函数.str()返回的字符串。

这是你的循环编辑:

for(int i=1;i != 101;++i) {
        if(i%20==0) {
            ostringstream temp;            // use a string stream to convert int...
            temp << i;
            str = temp.str();              // ...to str
            result = name + str + ending;  // concatenating strings.
            myfile.open(result);
            myfile << "The value is:" << i;
            myfile.close();
        }
}

现在将这个循环置于函数内并将所有相关参数传递给它是个好主意。这是一个完整的demo

输出文件是:John20.txt,John40.txt,John60.txt,John80.txt,John100.txt
还有其他方法可以做到这一点,但这应该给你一个大致的想法。希望它有所帮助。