2010-10-03 55 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