您好我想使用基于不同double值的命名约定从函数中保存许多不同的csv文件。我使用for循环执行此操作并传递字符串值以不同方式保存每个.csv文件。下面是我正在尝试做的事情的例子
1.1_file.csv
1.2_file.csv
但我得到了
1.1_file.csv
1.11.2_file.csv
这是一个有效的示例代码,我该怎么做才能解决这个问题
#include <sstream>
#include <iomanip>
#include <cmath>
#include <iostream>
#include <vector>
int main(){
std::string file = "_file.csv";
std::string s;
std::ostringstream os;
double x;
for(int i = 0; i < 10; i++){
x = 0.1 + 0.1 *i;
os << std::fixed << std::setprecision(1);
os << x;
s = os.str();
std::cout<<s+file<<std::endl;
s.clear();
}
return 0;
}
答案 0 :(得分:1)
ostringstream
不会在循环的每次迭代中重置,因此您只需在每次迭代时向其添加x
;将其放在for
的范围内,使os
在每次迭代时成为不同的干净对象,或者使用os.str("")
重置内容。
此外,变量s
是不必要的;你可以做到
std::cout << os.str() + file << std::endl;
并且您不需要s
并且消除了制作字符串副本的开销。
答案 1 :(得分:1)
为循环的每次迭代都会附加你的ostringstream。您应该清除它并重复使用它,如下所示(礼貌:How to reuse an ostringstream?关于如何重用ostringstream
)
#include <sstream>
#include <iomanip>
#include <cmath>
#include <iostream>
#include <vector>
int main() {
std::string file = "_file.csv";
std::string s;
double x;
std::ostringstream os;
for (int i = 0; i < 10; i++) {
x = 0.1 + 0.1 * i;
os << std::fixed << std::setprecision(1);
os << x;
s = os.str();
std::cout << s + file << std::endl;
os.clear();
os.str("");
}
return 0;
}