【问题标题】:Storing NUL characters (ASCII 0)存储 NUL 字符(ASCII 0)
【发布时间】:2011-04-20 08:54:42
【问题描述】:

我用 C++ 创建了一个程序,提示用户输入文件名和请求的文件大小。程序检查请求的文件大小是否大于实际文件大小,然后在文件末尾添加空字符(代码为 0 的字符),直到达到请求的文件大小。
我已经这样做了(使用 fstream):

for (blah blah) {
    file << '\0'; // ('file' is an fstream object)
}

它就像我想要的那样工作。我知道这是一个糟糕的代码,因为它可能会通过向它发送许多调用来折磨硬盘(顺便说一下它很慢)。这只是出于测试原因。然后,由于这个问题,我决定创建一个存储 NUL 字符的变量,并将整个变量一次保存到文件中(不单独保存每个字符)。
然后问题出现了...由于 NUL 字符(也称为空终止符)终止字符串,我无法以任何方式存储这些零。
我尝试了一个字符数组、一个字符串甚至一个字符串流,但都没有奏效(关于字符串流有一些有趣的地方,当我使用它时,文件的内容看起来像这样:0x47c274)。无论如何,它并没有像我预期的那样工作。
有没有什么有效的方法来存储一个空字符数组?

【问题讨论】:

  • 只是一个建议,请务必将 ASCII 0 称为 NUL 而不是 NULL。 NULL 是实际的空指针,NUL ('\NUL') 是 ASCII 0。
  • 我猜在 stringstream 的情况下,您将指向它的指针发送到流而不是对象本身。此外,一个字符串应该可以工作,它可能包含 \0 没有问题。
  • 我现在明白了;我的问题是将其保存到文件中,而不是存储它:)
  • 请注意,缓慢是由于 iostreams 中的许多虚拟调用,而不是大量的 I/O 操作。 fstream 确实缓冲了数据,至少 :vP 。另外,请参阅我对 Hugo 回答的评论。

标签: c++ string char fstream null-character


【解决方案1】:

将它们存储在字符数组中,并使用ostream::write 将数组写入文件。

【讨论】:

  • 谢谢,它适用于 ofstream::write :) 我接受了 Hugo Peixoto 的回答,但你的回答也不错。 ;)
【解决方案2】:

这是一个例子:

#include <algorithm>
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
  ofstream fout("pokemon");
  char buffer[1000];
  std::fill(buffer, buffer + 1000, '\0');
  fout.write(buffer, sizeof(char) * 1000);
  return 0;
}

【讨论】:

  • 谢谢!我只是好奇,你为什么包括算法? std::fill 没有在那里声明,是吗?
  • std::fill 在一个通用算法文件中声明,它可能已经包含在 iostream 和/或 fstream 中。如果您只想使用填充,则要包含的标头是算法,但在这种情况下不需要。
  • @Potatoswatter,有什么区别?它看起来不一样,但我认为它的作用是一样的,不是吗?
  • @rhino:它更短,不需要&lt;algorithm&gt;
猜你喜欢
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 2013-05-05
相关资源
最近更新 更多