динамическое выделение памяти для буфера

Я работаю над визуальным С++. Я новичок в С++, и я нахожусь в странной ситуации, когда у меня есть переменная «Содержание» типа

char FileContents[200000] ;

теперь я взял размер файла, используя оператор sizeof, подобный этому

int SizeOfFile =Sizeof(File);

и теперь мне нужно скопировать данные этого файла в «Содержание», которое имеет индекс массива 200000. Предположим, я делаю это с помощью

memcpy(FileContents,&File[0],SizeOfFile);

и я вывожу содержимое «FileContents» в файл в любом месте (по моему желанию). Я обнаружил, что содержимое файла отображается правильно, но когда содержимое файла завершено, у меня появляются странные данные, такие как «ММММММ». пожалуйста, смотрите ниже-

</body>
    </html> //Here finshes the file and after that i have this kind of data as you see below
    ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ..and so on until file ends.

и я знаю это из-за выделения памяти char FileContents[200000] ; потому что «SizeOfFile» очень маленькое значение, и после его размера у меня есть странные «МММММ», и я не хочу их видеть. Мне нужен файл, содержащий только содержимое "FileContents" и ничего больше. И я не могу динамически выделить память FileContents. потому что он должен быть равен «SizeOfFile», который мы получаем динамически, используя Sizeof(File) .

Что делать в этой ситуации, чтобы избавиться от этих "ММММММ" значений? Любое решение?


person Sss    schedule 14.08.2013    source источник
comment
как именно вы записываете массив в файл?   -  person Kilian Brendel    schedule 14.08.2013


Ответы (3)


Вам нужно инициализировать массив нулями, так как его начальное содержимое не определено и может содержать любое значение:

// initialize with 0
char FileContents[200000] = {};

Вы также можете установить элементы равными нулю после инициализации, используя std::fill:

// set all elements to 0 after initialization
std::fill(FileContents, FileContents + 200000, 0);              // C++03 or C++11
std::fill(std::begin(FileContents), std::end(FileContents), 0); // C++11

Когда дело доходит до интерпретации массива char как строк, они обрабатываются как строки с завершающим нулем, то есть конец строки отмечается первым найденным 0.

person juanchopanza    schedule 14.08.2013
comment
почему вы использовали FileContents во втором аргументе? - person Sss; 14.08.2013
comment
@ShekharSinghSHEKHAWAT, второй аргумент на самом деле равен FileContents + 200000, то есть единице после конца массива. Это необходимо для std::fill. Но вариант инициализации лучше. - person juanchopanza; 14.08.2013
comment
если я делаю std::fill(HtmlFileContents, SizeOfFile + 200000, 0); в моем коде это дает ошибку, и на самом деле я не использую std:: нигде в моей программе, это очень странно для меня. Любое другое решение вместо std::? - person Sss; 14.08.2013
comment
@ShekharSinghSHEKHAWAT Если у вас есть произвольные требования, например, отказ от использования стандартной библиотеки, вы должны были указать это в вопросе. Но первое решение здесь прекрасно работает и не требует никаких стандартных библиотечных функций. - person juanchopanza; 14.08.2013
comment
как вы думаете, это также будет работать, если у меня есть OLECHAR HtmlFileContents[200000] ; вместо char FileContents[200000] ; ? - person Sss; 14.08.2013

вам нужно заполнить все данные '\0' символами.

Так что используйте это:

char FileContents[200000] = {};
person ST3    schedule 14.08.2013

это сработало для меня -

char FileContents[200000] ={0};

и сделать то же самое после этого, как я сделал раньше.

person Sss    schedule 14.08.2013