作为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个文件
答案 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();
}
}
#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
还有其他方法可以做到这一点,但这应该给你一个大致的想法。希望它有所帮助。