2017-01-10 6 views
1

Я пытаюсь прочитать файл в формате ANSI и конвертирование это binary.I'm объявить два динамического распределения памяти, как это: char* binary_reverse = new char; и char * binary = new char;Новая декларация, содержащая значение мусора и кучи коррупции при использовании удалить

While debugging Я вижу, что это (двоичный) содержит слишком много значений мусора. Почему это так?

Я удаляю их как: delete binary_reverse; удалять двоичные файлы; Однако, во время удаления его дает мне ошибку:

'ASCIItoBinary.exe': Loaded 'D:\TryingBest\Reactice\ASCIItoBinary\Debug\ASCIItoBinary.exe', Symbols loaded. 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Symbols loaded. HEAP[ASCIItoBinary.exe]: Heap block at 00241ED0 modified at 00241EFD past requested size of 25 Windows has triggered a breakpoint in ASCIItoBinary.exe.

Вот как я делаю код:

#include <cstring> 

void AtoB(char * input) 
{ 
    unsigned int ascii; //used to store ASCII number of a character 
    unsigned int length = strlen(input); 
    //cout << " "; 
    for (int x = 0; x < length; x++) //repeat until the input is read 
    { 
     ascii = input[x]; 
     char* binary_reverse = new char;  //dynamic memory allocation 
     char * binary = new char; 
     //char binary[8]; 
     int y = 0; 
     while (ascii != 1) 
     { 
      if (ascii % 2 == 0) //if ascii is divisible by 2 
      { 
       binary_reverse[y] = '0'; //then put a zero 
      } 
      else if (ascii % 2 == 1) //if it isnt divisible by 2 
      { 
       binary_reverse[y] = '1'; //then put a 1 
      } 
      ascii /= 2; //find the quotient of ascii/2 
      y++; //add 1 to y for next loop 
     } 
     if (ascii == 1) //when ascii is 1, we have to add 1 to the beginning 
     { 
      binary_reverse[y] = '1'; 
      y++; 
     } 

     if (y < 8) //add zeros to the end of string if not 8 characters (1 byte) 
     { 
      for (; y < 8; y++) //add until binary_reverse[7] (8th element) 
      { 
       binary_reverse[y] = '0'; 
      } 
     } 

     for (int z = 0; z < 8; z++) //our array is reversed. put the numbers in the rigth order (last comes first) 
     { 
      binary[z] = binary_reverse[7 - z]; 
     } 
     //printf("the Binary is %s",binary); 
     //cout << binary; //display the 8 digit binary number 

     delete binary_reverse;  //free the memory created by dynamic mem. allocation 
     delete binary; 
    } 
} 

Я хочу точные двоичные значения в «бинарной». НЕ бинарные значения вместе с мусором? Как устранить значения мусора? Как избежать кучи коррупции?

+1

'char * binary_reverse = новый символ; 'и' char * binary = new char; '- поэтому вы выделяете 1 байт для хранения – RbMm

+0

Off topic: сохраняйте бит кода:' else if (ascii% 2 == 1) 'может просто быть' else'. При работе с одним двоичным битом это значение будет равно 1 или 0. Если это не одно, это должно быть другое. – user4581301

ответ

1

Проблема в том, что вы назначаете только 1 символ командами new char. Вы хотите выделить больше, используя new char[9]. Поскольку вы печатаете максимум 8 бит, вам нужен один дополнительный символ для нулевого терминатора. Обязательно установите binary_reverse[y]=0 в конце строки.

А затем delete[] вместо delete.

Но что сказал, вы должны использовать std::string или std::vector вместо ...

+0

Я пробовал это. как новый char [8] и delete [], его проблема с тем же вопросом – AskMe

+0

То, что вы опубликовали, никогда не будет работать, поэтому вы должны опубликовать что-то, что имеет шанс работать (т. е. с помощью 'new char [8]'). –

+0

Я обновил ответ. Вам нужен нулевой терминатор в конце строки. –

1

Оказывается, есть куча вещей неправильно здесь почти все они происходят от не прекращения вывода строки, а затем заголовок Offf в неправильном направлении, в поисках исправления.

Я собираюсь игнорировать ошибку в

, кроме как сказать, ОП нужно больше места для хранения.

char* binary_reverse = new char[8]; 

Правильный подход, чтобы вернуться к временному распределению он выглядит как OP начал с и добавить дополнительные байты, чтобы содержать нулевой терминатор струны. И затем используйте это пространство для нулевого терминатора.

Без нулевого терминатора у вас нет строки. У вас есть двоичный blob. Процедуры печати, все строковые подпрограммы c-стиля, рассчитываются на том, что этот терминатор существует. Без этого они не знают, где заканчивается строка, и отправляйтесь в дикий синий цвет, глядя на нее. Часто бывает плохое. Или, может быть, нет. Что происходит, когда вы выходите за пределы массива, не определено. Возможно, он делает то, что вы хотите. Может быть, нет. Невозможно быть уверенным. В этом случае работа с сайтом с орбиты не работает.

Так выделяют временное хранение:

char binary_reverse[8]; // not using this one like a string so we don't need a terminator 
char binary[9]; // printing this one. Need a terminator to know when to stop printing. 

Позже, после того, как binary_reverse построен, а затем переведен в binary, binary должно быть прекращено, чтобы стать строкой, а не просто еще один анонимный блоб.

binary[8] = '\0'; 

Теперь его можно распечатать.

Рекомендации:

Visual Studio имеет удивительный отладчик. Ознакомьтесь с ним. Спасите вас много времени.

Если бы ФП не прокомментировал условия печати, то хорошие результаты были бы теми, кто вчера заметил основную ошибку. Минимизирующий код хорош, но OP удаляет видимое проявление ошибки.

Этот код может быть значительно упрощен. Вы знаете, что хотите 8 бит, потому что вы работаете в ascii (ну, на самом деле ascii - 7 бит, но редко можно увидеть что-то, кроме 8 бит). Поверните while (ascii != 1) в for (int count = 0; count < 8; count++) и проверьте все 8 бит в символе. Спасите вас пару циклов позже, потому что теперь вы ВСЕГДА получаете 8 бит.

+0

Все еще получаю обе проблемы. Кто-то пробовал писать то же самое в VS и умел успешно работать? – AskMe

+0

@TryingBest Всего повторная запись ответа. – user4581301