фнукция getline в MSVC 7.0
От: Yuri Россия http://spbdetails.ru
Дата: 22.05.04 21:03
Оценка:
Привет всем!

столкнулся с ужасной проблемой, не знаю как решить:

    void ParseFile(const char *pchFilePath)
    {
        std::fstream file(pchFilePath, std::fstream::in | std::fstream::binary);
        if(!file)
            throw ... ;

        ParseStream(file);
    }

    void ParseStream(std::istream &file)
    {
        ...
        std::string str;

//        int n = str.capacity();        
        while (std::getline(file, str)) {
            ....
        }
    }


такой вот код, должен читать обычный текстовый файл построчно. В MSVC 6.0 этот код отлично работает, все без проблем.
Но в MSVC 7.0 функция getline читает только 15 симолов из строки!!!!!!, как оказалось 15 — это capacity строки!

Это что баг 7.0 или фича? Кто знает, как можно исправить положение?
Take it easy.
Re: фнукция getline в MSVC 7.0
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 22.05.04 21:08
Оценка:
Здравствуйте, Yuri, Вы писали:

Y>Привет всем!


Y>столкнулся с ужасной проблемой, не знаю как решить:


Y>
Y>    void ParseFile(const char *pchFilePath)
Y>    {
Y>        std::fstream file(pchFilePath, std::fstream::in | std::fstream::binary);
Y>        if(!file)
Y>            throw ... ;

Y>        ParseStream(file);
Y>    }

Y>    void ParseStream(std::istream &file)
Y>    {
Y>        ...
Y>        std::string str;

Y>//        int n = str.capacity();        
Y>        while (std::getline(file, str)) {
Y>            ....
Y>        }
Y>    }
Y>


Y>такой вот код, должен читать обычный текстовый файл построчно. В MSVC 6.0 этот код отлично работает, все без проблем.

Y>Но в MSVC 7.0 функция getline читает только 15 симолов из строки!!!!!!, как оказалось 15 — это capacity строки!

Y>Это что баг 7.0 или фича? Кто знает, как можно исправить положение?


А void reserve(size_t n) не поможет?
[ posted via RSDN@Home 1.1.2 stable ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[2]: фнукция getline в MSVC 7.0
От: Yuri Россия http://spbdetails.ru
Дата: 23.05.04 07:15
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>А void reserve(size_t n) не поможет?


нет, не помогло
Take it easy.
Re: фнукция getline в MSVC 7.0
От: WolfHound  
Дата: 24.05.04 08:59
Оценка:
Здравствуйте, Yuri, Вы писали:

Y>такой вот код, должен читать обычный текстовый файл построчно. В MSVC 6.0 этот код отлично работает, все без проблем.

Y>Но в MSVC 7.0 функция getline читает только 15 симолов из строки!!!!!!, как оказалось 15 — это capacity строки!
А как ты это узнал? Уж не дебугером ли посмотрел? Если им то попробуй это строку куданибудь вывести.
Есть в дебугере маленькая бяка при отображении строк...
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: фнукция getline в MSVC 7.0
От: Yuri Россия http://spbdetails.ru
Дата: 24.05.04 09:18
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Yuri, Вы писали:


Y>>такой вот код, должен читать обычный текстовый файл построчно. В MSVC 6.0 этот код отлично работает, все без проблем.

Y>>Но в MSVC 7.0 функция getline читает только 15 симолов из строки!!!!!!, как оказалось 15 — это capacity строки!
WH>А как ты это узнал? Уж не дебугером ли посмотрел? Если им то попробуй это строку куданибудь вывести.
WH>Есть в дебугере маленькая бяка при отображении строк...

Да, спасибо, я уже догадался (абсолютно случайно, спустя 2-х часов) но я ж и подумать не мог, что строки длина которых менее 15 символов отображается нормально, а иначе — фарш!!!
Take it easy.
Re[3]: фнукция getline в MSVC 7.0
От: rus blood Россия  
Дата: 24.05.04 17:25
Оценка:
Y>Да, спасибо, я уже догадался (абсолютно случайно, спустя 2-х часов) но я ж и подумать не мог, что строки длина которых менее 15 символов отображается нормально, а иначе — фарш!!!

Ну ты бы посмотрел в watch-е, как устроен этот string. Там невооруженным глазом видно два буфера
string::_Bx::_Buf на 15 символов и string::_Bx::_Ptr, который юзается, если строка больше.
Имею скафандр — готов путешествовать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.