2010-10-03 114 views
1

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

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

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

+4

只是一个建议,你指的是ASCII码0作为NUL,而不是为NULL。 NULL ist实际的空指针和NUL('\ NUL')是ASCII 0. – LukeN 2010-10-03 00:47:23

+1

我想,在stringstream的情况下,你发送一个指向它的流而不是对象本身。此外,一个字符串应该工作,它可能包含\ 0没有问题。 – liori 2010-10-03 01:00:07

+0

我现在看到;我的问题是将它保存到文件中,而不是存储它:) – rhino 2010-10-03 01:06:20

回答

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; 
} 
+0

谢谢!我只是好奇,你为什么包括算法? 'std :: fill'没有在那里声明,是吗? – rhino 2010-10-03 00:55:56

+0

std :: fill是在一个通用算法文件中声明的,它可能已经包含在iostream和/或fstream中。如果你只是想使用填充,要包含的头是算法,但在这种情况下,它不是必需的。 – 2010-10-03 01:02:16

+1

或'char buffer [1000] = {};' – Potatoswatter 2010-10-11 09:56:11

2

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

+0

谢谢,它适用于ofstream :: write :)我已经接受Hugo Peixoto的答案,但你的答案也很好。 ;) – rhino 2010-10-03 00:54:21