2010-10-03 8 views
1

Я создал программу на C++, которая запрашивает у пользователя имя файла и запрашиваемый файл. Программа проверяет, превышает ли запрошенный размер файла фактический размер файла, а затем добавляет в конце файла нулевые символы (те, которые имеют код 0), до тех пор, пока не будет достигнут требуемый размер файла.
Я сделал это так (с fstream):Сохранение символов NUL (ASCII 0)

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

и он работал так же, как я хотел. Я знаю, что это плохой код, так как он может мучить жесткий диск, отправив на него много вызовов (и, кстати, он медленный). Это было только по причинам тестирования. Затем из-за этой проблемы я решил создать переменную, хранящую символы NUL, и сохранить всю переменную в файл сразу (без сохранения каждого символа отдельно).
Тогда возникла проблема ... из-за символа NUL (также известного как нуль-терминатор), завершая строку, я не мог хранить эти нули каким-либо образом.
Я пробовал массив символов, строку и даже строковый поток, но никто не работал (есть что-то интересное в stringstream, когда я его использовал, содержимое файла выглядело так: 0x47c274). Во всяком случае, это не сработало, как я ожидал.
Есть ли эффективный способ хранения массива нулевых символов?

+4

Просто совет, не относятся к ASCII 0, как NUL, а не NULL. NULL ist фактический nullpointer и NUL ('\ NUL') является ASCII 0. – LukeN

+1

Я предполагаю, что в случае stringstream вы отправили указатель на него в поток вместо самого объекта. Кроме того, строка должна работать, она может содержать \ 0 без проблем. – liori

+0

Я вижу сейчас; моя проблема заключалась в том, чтобы сохранить его в файле, а не хранить его :) – rhino

ответ

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

+0

std :: fill объявлен в файле общих алгоритмов, который, вероятно, уже включен iostream и/или fstream. Если вы просто хотите использовать fill, заголовок для включения - это алгоритм, но в этом случае он не нужен. –

+1

или 'char buffer [1000] = {};' – Potatoswatter

2

Храните их в массиве символов и используйте ostream::write, чтобы записать массив в файл.

+0

Спасибо, он работает с tostream :: write :) Я принял ответ Гуго Пейшото, но ваш тоже хорош. ;) – rhino