Чтение из файла с помощью fgets () вызывает «нарушение чтения доступа с адреса ...» c ++ - PullRequest
2 голосов
/ 14 мая 2009

Я использую FILE * F открывается в _sfopen () Я читаю из файла while (! Feof (f)), а затем fgets (str, 1024, f), когда run достигает последней строки, в которой он все еще идет какое-то время, но потом при попытке fgets вылетает с нарушением прав доступа (в то время как я просто вставляю попытку и ловлю (...), но я знаю, что это не очень хорошее решение), что мне изменить для решения проблемы?

Плюс - если я хочу читать построчно, правильно ли указывать размер 1024 или он может потерпеть неудачу - у меня был файл, где из-за размера он читал каждый раз от середины строки до середина следующей строки - есть ли лучший способ прочитать строку, потому что я понятия не имею, как будут выглядеть мои файлы (если они имеют \ n в конце и т. д ...)

спасибо!

Ответы [ 2 ]

3 голосов
/ 14 мая 2009

Если вы не читаете до while(!feof(f)), то он прерывается, поскольку флаг EOF не устанавливается до после чтения. Вместо этого сделайте что-то вроде этого:

char buf[1024];
while(fgets(buf, sizeof(buf), f)) {
    /* process the line */
}

Поскольку fgets определен так, чтобы возвращать NULL в случае сбоя чтения или EOF.

Если вы делаете это на c ++, то я рекомендую подобный шаблон (но вместо этого используйте i ++reams c ++).

std::ifstream file("filename.txt");
std::string line;
while(std::getline(file, line)) {
    // process the line
}
0 голосов
/ 14 мая 2009

Вы указали C ++ в качестве тега, возможно, используете файловый поток (std :: ifstream для ввода из файла) и глобальную getline () функцию, чтобы получить ее построчно и поместить в std :: строка для дальнейшего анализа / манипулирования.

Для примера посмотрите здесь (2-й пример в параграфе "Текстовые файлы")

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