Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ifstream - проблемы с чтением

22K
07 февраля 2007 года
Ziay
6 / / 31.01.2007
Читаю файл, размером кратный 256 байтам в цикле, наращивая размер буфера (1, 2, 4, 8, 16, 32, 64, 128, 256). Читает (или по крайней мере выводит на экран) только в первой итерации. Откывать и закрывать файл в цикле не предлагать. Думаю там должно быть что-то вроде flush?

Код:
#include <fstream>
#include <iostream>

#define INITIAL_BUFFER_SIZE 1
#define BUFFER_MULTIPLIER   2
#define MULT_STEPS  9

using namespace std;

int main(int argc, char *argv[])
{
    ifstream fsr(argv[1], ios::in);
    if ( fsr.fail() )
    {
        cout << "Can't open input file" << endl;
        return -1;
    }

    int bufferSize = INITIAL_BUFFER_SIZE;

    for (int i = 1; i <= MULT_STEPS; i++)
    {
       
        char *c = new char[bufferSize+1];
   
        if (c == NULL)
        {
            cout << "Can't allocate memory" << endl;
            return -1; 
        }
       
        cout << endl << "*** Buffer size = " << bufferSize << " ***"<< endl;

        fsr.seekg(0,ios::beg);
        while ( !fsr.eof() )
        {
            fsr.read(c, bufferSize);
            cout << c;
        }

        delete c;

        bufferSize *= BUFFER_MULTIPLIER;
    }
    fsr.close();
    return 0;  
}
9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
На второй итерации [FONT="Courier New"]fsr.eof()[/FONT] - по-прежнему будет true. Выводы - самостоятельно, но я бы использовал [FONT="Courier New"]fsr.clear()[/FONT] ;)
22K
07 февраля 2007 года
Ziay
6 / / 31.01.2007
respect to Lerkin
fsr.clear() помогло :)
для тех, кто будет наступать на эти же грабли:
функция clear(), принадлежащая классу ios (если не ошибаюсь) предназначена для обнуления(установления) состояния потока. например:
eofbit – признак конца файла;
failbit – ошибка форматирования, но символы не утеряны;
badbit – потеря данных;
goodbit – ошибок нет.
3
07 февраля 2007 года
Green
4.8K / / 20.01.2000
В общем случае clear - это не совсем достаточно. Необходимо делать именно flush. Такого метода у стандартных потоков ввода данных нет, но я как-то показывал, как его реализовать.
Это ещё раз доказывает полезность поиска по форуму:
http://forum.codenet.ru/showthread.php?p=157964#post157964
22K
07 февраля 2007 года
Ziay
6 / / 31.01.2007
Цитата:
Это ещё раз доказывает полезность поиска по форуму:


в жизни не догадался бы искать что то подобное в топике с названием "как заставить cin считывать только числа"


изящно, а главное работает. спасибо большое.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог