ifstream читает двоичный файл, работает в режиме выпуска, но не в режиме отладки - PullRequest
0 голосов
/ 04 мая 2019

Я работаю над функцией чтения двоичного файла.Я использую Visual Studio C ++, и он отлично работает в режиме выпуска, но не в режиме отладки.Мне нужно запустить его в режиме отладки, чтобы обнаружить потенциальную утечку памяти.

Функция просто читает двоичный файл с ifstream и сохраняет значения.В режиме отладки программа ничего не читает.Я пытался найти аналогичную проблему в сети, но ничего (обычно программы работают в режиме отладки и не работают в выпуске).

    string identifier;
    identifier.resize(4);

    ifstream adtFile(m_nameFile, ios::in | ios::binary);

    adtFile.read((char*)&identifier, sizeof(::uint32_t));

Файл начинается с 4 символов, минимальный код выше прочитан ихраните его в режиме выпуска, но не в режиме отладки.Я подозреваю, что приведение к char * является проблемой, но я не понимаю, почему.

Я не знаю всех различий между двумя конфигурациями, если у кого-то есть идея.

Спасибомного для чтения.

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Я использую Visual Studio C ++, и он отлично работает в режиме выпуска, но не в режиме отладки. Мне нужно запустить его в режиме отладки, чтобы обнаружить потенциальную утечку памяти.

плохой шанс, что кажется работать в режиме выпуска, потому что он не может хорошо работать

Я подозреваю, что приведение к char * является проблемой

вы правы, делаете

string identifier;
identifier.resize(4);

ifstream adtFile(m_nameFile, ios::in | ios::binary);

adtFile.read((char*)&identifier, sizeof(::uint32_t));

вы не записываете во внутренний буфер 4 символа, как ожидалось, а в экземпляр std :: string с неопределенным поведением

Минимальное изменение

 string identifier;
 identifier.resize(sizeof(::uint32_t));

 ifstream adtFile(m_nameFile, ios::in | ios::binary);

 adtFile.read((char*)identifier.data(), sizeof(::uint32_t));

даже для удаления const вообще не понятно

Но действительно ли вы этого хотите? зачем использовать std::string вместо ::uint32_t как

::uint32_t v;

adtFile.read((char*)&v, sizeof(::uint32_t));

или просто std::vector<unsigned char> / std::vector<::uint8_t>

(все еще со всем, что касается порядка байтов)

Содержит ли ваш файл внешнее представление числа (например, символы '1' '2' '3' и '4') или его внутреннее представление (например, байты 0x0 0x0 0x4 0xD2 или 0xD2 0x4 0x0 0x0 в зависимости от порядка байтов, когда файл был создан).

Также может быть интересно проверить возможные ошибки после прочтения.

0 голосов
/ 04 мая 2019

Вы, вероятно, хотите

dtFile.read(identifier.data(), 4);

или эквивалентно, &identifier[0]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...