使用 ofstream 时“表达式必须具有常量值”

Posted

技术标签:

【中文标题】使用 ofstream 时“表达式必须具有常量值”【英文标题】:"expression must have a constant value" while using ofstream 【发布时间】:2013-02-24 09:13:26 【问题描述】:

我正在使用 Visual C++ 将我的游戏从 GNU/Linux 移植到 Windows。

问题来了:

std::stringstream sstm;

/// *working on stringstream*

const int size = sstm.str().size();
char buffer[size];

std::ofstream outfile("options", std::ofstream::binary);

for(int i = 0; i < size; i++)
    buffer[i] = sstm.str().at(i);

outfile.write(buffer, size);

outfile.close();

在缓冲区的声明中说:“表达式必须有一个常量值”。

我已经改成这样了:

std::vector<char>buffer(size);

然后 VC 在 outfile.write() 处说:“无法将参数 1 从 'std::vector<_ty>' 转换为 'const char *'”。

【问题讨论】:

【参考方案1】:
const int size = sstm.str().size();
char buffer[size];

buffer 在这里是一个可变长度数组 (VLA)。这是每个 C++ 标准的非法代码 - 需要在编译时知道数组的大小。 VLA'a 在 C99 中是允许的,而 G++ 允许它作为 C++ 中的扩展。

const int 可以是编译时间常数,如果它是用文字或 ˙constexpr 初始化的。在你的情况下,它不是。

您就快到了 - vector&lt;char&gt; 是正确的做法。要将其传递给ostream::write(),您可以说buffer.data()&amp;buffer[0]-

【讨论】:

【参考方案2】:

您知道sstm.str() 会为每个调用创建一个新字符串吗?如果缓冲区很大,那将是很多字符串。

你可以只创建一个字符串的副本:

std::stringstream sstm;

/// *working on stringstream*

std::string buffer = sstm.str();

std::ofstream outfile("options", std::ofstream::binary);

outfile.write(buffer.c_str(), buffer.size());

outfile.close();

【讨论】:

以上是关于使用 ofstream 时“表达式必须具有常量值”的主要内容,如果未能解决你的问题,请参考以下文章

使用 ofstream 写入 txt 文件时强制编码

使用 ofstream 时,我如何知道我达到了文件的最大大小?

使用 ofstream 打开文件时设置文件权限

使用 ofstream 将文本写入文件末尾

使用 ofstream 将数据写入其文件后更新 ifstream 对象

科学 ofstream 中的指数只有 2 位