2015-10-27 3 views
0

Так что у меня это странное «недопустимый указатель NULL» исключение в этом коде (сократить до сути проблемы)Invalid ошибка указателя нуля при использовании ifstream

#include <fstream> 
#include <iostream> 
#include <iomanip> 

int main(){ 
    std::ifstream input; 
    std::ofstream output; 

    unsigned __int16 currentWord = 0; 

    output.open("log.txt"); 
    input.open("D:\\Work\\REC022M0007.asf", std::ios::binary); 

    input.seekg(0, input.end); 
    int length = input.tellg(); 
    input.seekg(0, input.beg); 

    for (int i = 0; i < length;){ 
     int numData = 0; 
     input.read(reinterpret_cast<char *>(currentWord), sizeof(currentWord)); 
    } 
    input.close(); 
    output.close(); 
    return 0; 
} 

Линия, которая получает меня исключение составляет

input.read(reinterpret_cast<char *>(currentWord), sizeof(currentWord)); 

и он делает это на самом первом прохождении, так что это не то, что я пытался читать файл дальше, чем он есть.

При попытке изменить значение currentWord 1 я получаю исключение, как

trying to write to memory 0x0000001 

или л вдоль линий (количество нулей не может быть правильным)

Веб-поиск сказал мне, что это что-то делать либо с пустым файлом (что не так), не найдено (не в том случае, когда длина получает значение) или что-то в типе casting mumbo-jumbo. Какие-либо предложения?

+2

Принимает адрес ('& currentWord'). – 0x499602D2

ответ

2

«currentWord» is ZERO (0), и когда выполняется reinterpret_cast<char*>(currentWord), он делает его nullptr, поэтому при попытке записать на нулевой адрес вы получите ошибку защиты от записи в памяти.

изменить его reinterpret_cast<char*>(&currentWord) (обратите внимание на &)

+0

О, спасибо. Указатели и все манипуляции с памятью всегда были для меня немного сложными –

1

Вы используете значение current_word, как если бы это был указатель. Это не так. Вот почему вы получаете нулевой указатель, когда current_word равен нулю, и вы получаете исключение памяти по адресу 1, когда current_word равно 1. Используйте &current_word в качестве первого аргумента input.read().

Смежные вопросы