[C++] fstream и ещё

Garryss

Пытаюсь использовать iostream/fstream.
Программа компилируется, но вылетает по SIGSEGV:
если пользоваться этим
 g++ (GCC) 4.0.3 20060212 (prerelease) (Debian 4.0.2-9) 

то ошибка происходит при попытке выполнить fs.close в деструкторе (fs - типа ifstream)
 g++ (GCC) 3.4.4 [FreeBSD] 20050518 

а в этом случае - при попытке вызвать fs.tellg хотя чтение из потока и вызов
fs.seekg(-1, ios::cur) отрабатывают нормально
В чем может быть ошибка?

Garryss

Замечания:
1) вот список операторов, связанных с fs (в порядке их вызова):
        fs.open(filename); 
fs.unsetf(ios::skipws);
чтение из потока
fs.seekg(-1, ios::cur);
fs.tellg;
чтение из потока
fs.close;

2) просто связка open/чтение/close работает нормально

Maurog

на эту тему тоже имею вопрос)
как заставить стримы работать с большими файлами? больше 3 гигов.
в С это получается делать (fopen\fopen64).

Garryss

Убрал вызовы fs.tellg. Вроде бы работает
Но хотелось бы узнать, как пользоваться этим tellg

Maurog

имею вопрос!

Garryss

Ещё вопрос: как проще всего привести все символы в объекте класса
string к верхнему регистру?

Russula

void myupper ( char & ch )
{
ch = toupper ( ch ) ;
}
...
for_each ( str . begin ( ) , str . end ( ) , myupper ) ;
...

Maurog

так нах!
куда вне очереди?!
разойдитесь!
вопрос уже представлен выше!
жду ответа!

Realist

1) AFAIK, передача указателя на функцию, а не функционального объекта не рулит.
2) Про верхний регистр -- это FAQ, и довольно не праздный, поскольку возникает вопрос: в верхний регистр согласно какой кодировке? Насколько я помню, страуструп в конце книги пишет об этом. Если надо, могу поискать еще ссылок на бумажную литературу.

Garryss

в верхний регистр согласно какой кодировке?
кодировка не важна - язык аглицкий (на всякий случай - cp1251)
страуструп в конце книги пишет об этом.

спасибо, посмотрю
P.S. просто очень долго не мог поверить, что нет чего-нибудь готового
в том же string

Garryss

Сделал с использованием ch=toupper(ch);

okunek

используй boost

Maurog

маладой человек..попрошу Вас!
вопрос все еще открыт!
вопрос воспроизведу: как заставить стримы работать с большими файлами (> 3 Гигобайт) ?

evgen5555

Как-как, напиши свои, 3Гб - ограничение платформы, вот и поднапрягись

Maurog

чо за платформы?
fopen работает с большими файлами.

evgen5555

fstream - это не только fopen, чуве.

Maurog

еще раз повторяю для танкистов: что дополнительно надо включить\отключить, чтобы при чтении\записи файлов посредством стримов можно было работать с большими файлами? если есть вообще такие рычаги в стримах. для Си проблем нет, но не хочется пользоваться fopen64 для таких целей.

vall

а -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 не помогают?

Maurog

в си помогает, в стримах-нет

Maurog

проблема серьезная !
флуд не принимается !
си++ сосет у си! я в шоке!

Dasar

возьми правильную реализацию stl-я, например, StlPort и не дергайся.

Maurog

значит реально сосет си++ ;(
ясно
всем спасибо.

mira-bella


а -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 не помогают?

в си помогает, в стримах-нет
а ты попробуй использовать эти опции при компиляции стандартной библиотеки C++ (в составе GCC)
ну и конечно позднее при компиляции своих прог
Либо поможет (скорее всего или реализация стандартной библиотеки - полное дерьмо.
PS: насчет гугла, прав

mira-bella

значит реально сосет си++ ;(
причем здесь вообще C++
Если какая-то одна реализация стандартной библиотеки (или компилятора) сосет - это не означает, что язык программирования сосет.
Но имхо, все таки C++ сосет у C просто офигенно. (только разумеется fstream здесь не причем).
fopen64 - это нестандартное фуфло, которое использовать неприлично (лучше системные вызовы тогда уж).
Но fopen тоже должен работать с большими файлами, а если не работает, то такая реализация стандартной библиотеки не меньший отстой, чем плохой fstream у C++.

Maurog

" fopen64 - это нестандартное фуфло, которое использовать неприлично (лучше системные вызовы тогда уж).
Но fopen "
fopen64 та же самая дрянь, что и fopen.
насчет гугла-сами полезайте и найдите что-нибудь, если сможете.
мне достаточно было изучение сырцов STL от трех компиляторов CC, gcc и VS2005, чтобы понять тупиковость этой проблемы. В последней вроде есть какие-то рычаги (тип streampos вроде можно менять) , но никак несовместимые с юнихами. В юнихах streampos имеет конкретный тип long.
Мне проще fopen использовать, чем таскать за собой танк StlPort.
всем спасибо, все свободны.
Оставить комментарий
Имя или ник:
Комментарий: