c++ - 更改文件名,包括 char 和 float

标签 c++

我正在编写 C++ 代码,但我遇到了一些问题,因为我以前从未使用过这种语言。

我的项目 (.pro) 文件的结构包含不同的 .ccp 文件,包括:

IOFile.cpp : 我要更改的文件名在哪里;

CModel.cpp :其中有我的项目模型,特别是用户每次选择的参数(float),我想将其用作我的文件名。

因此,目前输出名称类似于:filename.txt,但我想重命名它以获得类似 filename_parameter.txt 的内容(例如:file_0.998.txt)。

我的 IOFile.cpp 的 void 是这样写的:

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?以及如何编写包含字符串和 float 的文件名? 很抱歉这个愚蠢的问题,但我找不到解决方案。

最佳答案

这不是一个愚蠢的问题,关于这个特定主题有很多不好的建议。

首先,获取ray_factor进入saveIntensityMap ,只需将其作为另一个参数传递:

void IOFile::saveIntensityMap(const char* fileName,
                              float ray_factor,
                              vector<float>* intensityMap)
{
   ...
}

其次,忘记您曾经听说过格式化的 iostreams 输出,它带来的麻烦远远多于它的值(value)。 (这是网上有很多不好建议的部分。我个人根本从不使用 iostreams;我认为老式的 <stdio.h> API 是一个更符合人体工程学的接口(interface)。将 float 写入字符串正确控制输出格式是 iostream 最不擅长的事情之一。)

要构造您想要的文件名,请使用 snprintf格式化 std::string 的数字和串联对象来组合名称,如下所示:(请注意,我假设 fileNamesaveIntensityMap 的参数 已经具有 .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);

关于c++ - 更改文件名,包括 char 和 float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40892971/

相关文章:

c++ - QListWidget 带有可在项目单击时检查的项目

c++ - 如何为我的 curses 应用程序关闭或忽略按键重复?

c++ - 在基于范围的 for 循环中使用转发引用有什么好处?

c++ - 使用 OpenCV 的 C++ 图像的 SNR

c++ - 快速有效地从文件映射中搜索大型 C++ 字符串

c++ - gcc: 错误: 无法识别的命令行选项 ‘-combine’

c++ - while (std::cin >> value) 如何工作?

c++ - 将字符串映射到具有不同返回类型的函数

c++ - C++ 的 Python 枚举

c++ - 从围绕 xyz 的旋转找到 xyz 方向