【问题标题】:Char array with non-constant size while initialiazing初始化时具有非常量大小的字符数组
【发布时间】:2017-08-08 14:51:13
【问题描述】:

我需要在初始化非常量大小时的 C++ char 数组。大小必须是非常量的,因为它是从函数生成的,并且不能用于向量,因为此 char 数组将用于读取和写入文件。示例:

int i = functionToGetvalue();
unsigned char ch[i];
file1 >> ch;
file2 << ch;

【问题讨论】:

  • 你不能那样做。你需要使用new(完成后不要忘记delete[]
  • "不能使用向量,因为这个字符数组将用于读取和写入文件。" - 你可以用向量或字符串来做到这一点。
  • functionToGetvalue 是做什么的?您也许可以将其标记为constexpr
  • 不能使用向量,因为这个字符数组将用于读写文件。 -- 谁给你这个虚假信息? std::vector&lt;unsigned char&gt; c(i); unsigned char *ch = &amp;c[0]; file1&gt;&gt; ch; file2 &lt;&lt; ch;.
  • 可变长度数组在 C++ 中是不合法的,但某些编译器支持作为扩展。

标签: c++ arrays initialization constants


【解决方案1】:

前提是错误的。虽然有理由更喜欢 c 风格的数组(或 std::array)而不是向量,但你的肯定不是那个。您当然可以使用std::vector 来读取和写入文件,因为它保证在内存中是连续的。

例子:

std::vector<char> vec;
vec.resize(255);
ssize_t sz = read(fd, vec.data(), vec.size());

在您的原始示例中,您使用的是格式化流 I/O,在这种情况下,std::string 是一个最佳工具:

std::string str;
file1 >> str; // reads up to the next white space into str

【讨论】:

  • 这无济于事,因为我需要加载位于特定位置的文件的特定部分。第二件事,该部分可以包含空格,因此不能以空格结尾。
  • @DavidHusička,任何你需要 c 样式数组的东西都可以用向量来处理数据加载。用 c 风格的数组贴出实际的代码,我会告诉你如何用向量来做。
  • @NathanOliver,我还没有看到std::unique_ptr&lt;[]&gt;vector 有任何好处的情况(除了,可能是,在向量实现本身内部)。
  • @NathanOliver 如果 OP 想射脚,他当然可以,但他还没有说明任何理由,为什么要为他提供一些黑客阵列解决方案,std::vector&lt;&gt; 非常适合. (我可以想象一些模糊的原因,为什么不std::vector,然后几乎没有一个能够在与“读取文件”的连接中幸存下来,因为这本质上很慢,所以容器的实现并不重要)
  • @SergeyA 感谢提供将我的代码重写为向量的提议!!!我的代码从昨天开始修改,但实际上是一样的。带注释的代码是我希望它工作的方式,而未注释的代码可以工作,但速度很慢。链接是:link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多