2016-07-30 3 views
0

Итак, у меня есть этот ifStream, и он отлично читается из файла. Я прочитал одну строку, чтобы проверить тип элемента, который я читаю. Затем После того, как я прочитал, я передаю поток другому классу, который читает еще немного, но когда он попадает в этот класс, он выдает это исключение. Место обнаружения нарушения доступа 0x00000014. Вот код, где показана эта ошибка.Доступ к данным о нарушении прав доступа 0x00000014. Использование потоков

void Author::readData(ifstream & stream1) 
{ 
    string line = ""; 
    getline(stream1, name); //The error happens here 
    if (stream1.fail() && stream1.eof()) 
    { 
     throw Error(-1); 
    } 
    else if (stream1.fail() && !(stream1.eof())) 
    { 
     throw Error(0); 
    } 
    getline(stream1, address); 
    if (stream1.fail() && stream1.eof()) 
    { 
     throw Error(-1); 
    } 
    else if (stream1.fail() && !(stream1.eof())) 
    { 
     throw Error(0); 
    } 
} 

void Book::readData(ifstream & stream1) 
{ 

    (*theAuthor).readData(stream1); //This is where the function is called. Let me check to see if It is even initialized here. 
    if (stream1.fail() && stream1.eof()) 
    { 
     throw Error(-1); 
    } 
    else if (stream1.fail() && !(stream1.eof())) 
    { 
     throw Error(0); 
    } 
    getline(stream1, title); 
    if (stream1.fail() && stream1.eof()) 
    { 
     throw Error(-1); 
    } 
    else if (stream1.fail() && !(stream1.eof())) 
    { 
     throw Error(0); 
    } 

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

Редактировать: Добавлен еще один код в надежде, он может помочь.

+1

Был ли файл открыт успешно? – Rakete1111

+0

А что такое 'имя'? Что такое 'адрес'? Вы вызываете ['std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline)? –

+0

Да. Он использовался для чтения одной строки из нее, прежде чем перейти к этой функции. – Mindstormer

ответ

1

Нет ничего плохого в отображаемом коде.

Все, что вы прочитали, не полностью объяснили вам, просто потому, что сбой на C++-программе на определенной строке не означает, что ошибка там. Я могу легко придумать минимальный пример: strcpy() s мимо конца массива, развращая стек, затем переходит к выполнению кучи работы и только сбой при попытке вернуться из функции. Нет ничего плохого в инструкции return на C++, но в этом случае код будет разбит.

И нет ничего плохого в том, что ваш getline() звонит, или как он используется.

Ошибка программирования или ошибка, как правило, приводят к повреждению памяти, но после топания по всей памяти код не может сразу попытаться использовать его каким-либо значимым образом, но продолжит свой путь. На каком-то указателе позже программа возвращается и пытается использовать свои структуры данных, встречает мусор и сбои.

Наиболее вероятным объяснением является то, что произошедшая ранее ошибка закончилась тем, что нарисовала все ваши std::ifstream и/или имя std::string. Теперь вы можете позвонить getline(), чтобы прочитать из потока в эту строку, и код взорвется. Или, может быть, что-то прикручило указатель на экземпляр этого класса Author. Сделана попытка выполнить этот метод класса. Код взрывается, потому что член класса name, очевидно, является полным нежелательным. Разумеется, ошибка здесь не будет, но везде, где указатель на этот класс Author получил прикрученную.

Единственный способ получить помощь по вашей проблеме - если вы опубликуете minimum, complete, and verifiable example, что любой может скомпилировать, выполнить и воспроизвести вашу ошибку (обратите внимание на «минимальное» требование, это не значит, что вы получаете для публикации всего кода).

Вам нужно будет исследовать остальную часть всей вашей программы, ища вашу ошибку. Добро пожаловать на C++.

+0

Спасибо. Хотя вы не полностью ответили, как это исправить. Я получил некоторую помощь от кого-то другого, и ваш ответ был очень полезен при его решении. – Mindstormer