更改包含char和float的文件名

时间:2016-11-30 16:09:04

标签: c++

我正在处理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?我怎么能写一个包含字符串和浮点数的文件名? 抱歉这个愚蠢的问题,但我无法找到解决方案。

1 个答案:

答案 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);