我正在处理C ++代码,但由于我以前从未使用过这种语言,所以我遇到了一些问题。
我的项目(.pro)文件的结构包含不同的.ccp文件,包括:
IOFile.cpp
:我要更改的文件名是;
CModel.cpp
:我的项目模型,特别是用户每次选择的参数(浮点数),我想用于我的文件名。
所以,现在输出名称是:filename.txt,但是我想重命名它以获得像filename_parameter.txt这样的东西(例如:file_0.998.txt)。
IOFile.cpp
的无效内容如下:
void IOFile::saveIntensityMap(const char* fileName, vector<float>* intensityMap)
{
std::ofstream file(fileName, std::fstream::out|std::fstream::trunc);
}
而参数(ray_factor)在CModel.cpp
文件中初始化:
ray_factor= 0.99f
那么,我怎样才能将CModel
中的ray_factor传递给IOfile
?我怎么能写一个包含字符串和浮点数的文件名?
抱歉这个愚蠢的问题,但我无法找到解决方案。
答案 0 :(得分:2)
这不是一个愚蠢的问题,并且在这个特定的主题上有一个吨的错误建议。
首先,要将ray_factor
转换为saveIntensityMap
,只需将其作为另一个参数传递:
void IOFile::saveIntensityMap(const char* fileName,
float ray_factor,
vector<float>* intensityMap)
{
...
}
其次,忘记你曾经听说过格式化的iostreams输出,它比它的价值更麻烦。 (这是'网上有很多不好建议的部分。我个人从不使用iostreams;我认为老式的<stdio.h>
API是一个更符合人体工程学的界面。写一个浮点数到一个对输出格式有适当控制的字符串是iostream特别糟糕的事情之一。)
要构造所需的文件名,请使用snprintf
格式化std::string
对象的数量和连接以组合名称,如下所示:(请注意,我假设fileName
参数到saveIntensityMap
不已经有.txt
扩展名了 - 改变它可能比将字符串分开并重新组合起来更容易; C ++实际上并不是很好擅长字符串)
char ray_factor_buf[10];
snprintf(ray_factor_buf, sizeof ray_factor_buf, "%.2f", ray_factor);
string full_filename = fileName;
full_filename += "_";
full_filename += ray_factor_buf;
full_filename += ".txt";
std::ofstream file(full_filename, std::fstream::out|std::fstream::trunc);
如果您的C ++库尚未更新到C ++ 11,那么最后一行将需要
std::ofstream file(full_filename.c_str(), std::fstream::out|std::fstream::trunc);