LINUX.ORG.RU

Проблема с GCC3.2


0

0

Установил себе rh80 который содержит компилятор gcc3.2 и получил следующую проблему: при использовании потока fstream не находится конец файла. Вот этот простой фрагмент кода, который работал при компилировании gcc3.0.3 и раньше, вызывает ошибку сегментации при попытке выполнить getline за концом файла, так как не отслеживается конец файла - infile->eof() всегда возвращает false. std::fstream *infile = new std::fstream; infile->open( "/home/projects/proba-prj/Makefile", std::ios::in ); if( !(*infile) ) { std::cerr<<"Ошибка открытия файла"<<std::endl; exit(-1); } std::string textline; while ( !infile->eof()) { getline( *infile, textline); std::cout<<infile->eof()<<std::endl; std::cout<<infile->good()<<std::endl; std::cout<<infile->bad()<<std::endl; std::cout<<infile->fail()<<std::endl; } } Что с этим делать? Может они что-то изменили, а я об этом не знаю?


А что есть f( !(*infile) ) ? Почему не f( !infile ) ?

С уважением -- Смоляное Чучелко

anonymous
()

Потому что std::fstream *infile = new std::fstream!

ASm
() автор топика

у меня все работает,

g++ (GCC) 3.2.1 20020921 (prerelease) Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

пример я малость модифицировал, чтоб он открывал файл своего исходника, печатал строчку, которую считал, а потом эти 4 флага, в итоге для всех строк кроме пустой последней имеем все 0 кроме good, для пустой последней, верней за последней, при натыкании на конец файла имеем 1 в eof() и fail() что и должно быть.

anonymous
()

Так вот получается что это другая версия что имеется у меня. Хочу особо отметить что эта проблема возникла при использовании компилятора, который я установил из стандартного rpm пакета дистрибутива redhat 8.0. У меня уже была проблема с компилятором версии 3.0, который поставлялся с rh7.3 правда иного плана, программы даже не хотели компилироваться. Тогда я решил проблему тем что скачал исходники версии 3.0.3 проинсталировал их и до сих пор успешно им пользуюсь. Сейчас я хочу проделать то же самое с версией 3.2.

Но если всё таки может у кого-то установлен gсс3.2 из rpm пакета, попробуйте запустить пример у себя и сообщить результаты, буду очень благодарен.

ASm
() автор топика

Я поставил gcc из дистра RH8 и твой пример нормально работает

--------------------------- test.cpp
#include <fstream>
#include <string>
#include <iostream>

int
main( int argc, char* argv[] )
{
std::fstream *infile = new std::fstream;
infile->open( "test.cpp", std::ios::in );

if( !(*infile) )
{
std::cerr<<"cannot open"<<std::endl;
exit(-1);
}

std::string textline;
while ( !infile->eof())
{
getline( *infile, textline);
std::cout<<infile->eof()<<'\t';
std::cout<<infile->good()<<'\t';
std::cout<<infile->bad()<<'\t';
std::cout<<infile->fail()<<std::endl;
}
}

----------------------- out
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 1 0 0
1 0 0 1

anonymous
()

может дело не в бабине, а в том что libstdc++ не того калиба, например не от рпмного gcc?

anonymous
()

есть еще такое наблюдение в пользу 3.1/3.2, они заметно более производительный С++ код создают, в частности починили косяк с ссылками, посему очевидно лучше выкинуть 3.0 (особенно неработающий :) и поставить 3.2.1 или gcc-3_2-branch (я им собирал).

если же нужно проверить именно глючность той сборки, то rpm я поставить не могу ибо у меня дебиан и cygwin, могу только посоветовать собрать самому туже версию, что и в rpm и проверить.

HTH

anonymous
()

Проблема с GCC3.2 часть 2

Спасибо всем кто откликнулся. Оказывается всё дело было в том программа линковалась со старой версией библиотеки, собранной компилятором gcc-3.0.3. Вот отсюда все проблемы.

ASm
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.