使用 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<char>
是正确的做法。要将其传递给ostream::write()
,您可以说buffer.data()
或&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 时,我如何知道我达到了文件的最大大小?