Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прочитать весь файл 
V
    Опции темы
ZC1989
Дата 24.4.2007, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



как можно быстро прочитать весь файл целиком? я знаю как читать через 

fopen("c:\\1.txt", "rb");
fread(Bytes, 1024, 1, flash);
...

но как мне узнать в таком случае размер файла в байтах?

читаться должня файлы BitMap (.bmp)

можно показать кодом как это делается??


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
_stranger_
Дата 24.4.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 3.10.2006
Где: город-герой Киев

Репутация: 2
Всего: 2



как вариант...
Код

     long size;
     fseek(flash,0,SEEK_END);
     size = ftell(flash);
     fseek(flash,0,SEEK_SET);
     fread(Bytes,size,1,flash);

PM MAIL   Вверх
dizzy1984
Дата 24.4.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Не проверял, но думаю что если этот код _stranger_ переписать с использованием ifstream, то будет выигрыш в скорости чтения
PM MAIL   Вверх
JackYF
Дата 24.4.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(dizzy1984 @  24.4.2007,  13:33 Найти цитируемый пост)
Не проверял, но думаю что если этот код _stranger_ переписать с использованием ifstream, то будет выигрыш в скорости чтения 


А по-моему, как раз наоборот...
За счет чего будет этот выигрыш в скорости, можно поинтересоваться?



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Xenon
Дата 24.4.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



А использование fstream и метода rdbuf() не подойдет?

Добавлено через 1 минуту и 12 секунд
Код

std::fstream fileIn("BLA.bmp", std::ios::in );
std::ostringstream buf;
buf << fileIn.rdbuf();
std::string str(buf.str());



--------------------
user posted image  
PM MAIL   Вверх
ZC1989
Дата 25.4.2007, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



Xenon, если честно проблемы скорости меня не волнуют, программа того не стоит что бы скорость её проверять. главное что бы работала - единственное требование... гы..   


Xenon, _stranger_, пасибо за помощь!!! smile 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ZC1989
Дата 25.4.2007, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



Щас попробовал, с размером получилось всё, а вот фишка в другом высочила...

мой огрызок кода выглядит так:
Код

char *Byte;
long size;
FILE *flash = fopen("c:\\bitmap.bmp", "rb");

fseek(flash, 0, SEEK_END);
size = ftell(flash);
fseek(flash, 0, SEEK_SET);

Byte = new char[size];

fread(Byte, size, 1, flash);

MessageBox(0, (char*)Byte, "CHAR", 0);

fclose(flash);


я смотрел на выделяемый буффер, там около 44145 единиц... ну вобщем-то правильно, а почему я вижу вместо кучи символов из этого файла только первую строчку 
Цитата

BMz¬


а там ещё куча всего должна быть!!!

и ещё я попробовал сохранить этот буффер в файл (может просто винда отказывается выводить те символы) а в файл та же пакасть сохраняется...

сохранял так:
Код

std::ofstream SAVE("c:\\testing_save.bmp");
SAVE << (char*)Byte;
SAVE.close();



--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
zkv
Дата 25.4.2007, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(ZC1989 @  25.4.2007,  07:52 Найти цитируемый пост)
а там ещё куча всего должна быть!!!

вполне возможно, она там есть, просто вы используете указатель на char, и компилятор естественно считает что вы передаете ему строку, и все действия с вашим указателем производит как со строкой(те до первого попавшегося нуль-символа).

Что делать. Ну про мессадже бокс ничего не скажу, не понимаю, что вы хотели изобразить smile Картинка в него не выведется. А в файл сохранять надо точно также как и читали, к примеру fwrite()
PM MAIL   Вверх
Kipter
Дата 25.4.2007, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 2.5.2006

Репутация: нет
Всего: нет



Код

int LoadBMPFile(const char *fileName, BITMAPINFOHEADER **pInfoHead, BYTE **BitMap)
{
    ifstream        loadFile;
    BITMAPFILEHEADER    fileHead;

    int infoHeadSize;
    int fileSize;
    int imageSize;

    int fileHeadSize = sizeof(BITMAPFILEHEADER);

    loadFile.open(fileName, ios::nocreate | ios::in | ios::binary);
    if(!loadFile)
    {
        MessageBox(NULL, "Невозможно открыть фаил","ERROR",MB_ICONHAND);
        return 0;
    }

    loadFile.read((char*)&fileHead, fileHeadSize);
    if(fileHead.bfType != 0x4d42)
    {
        MessageBox(NULL, "Фаил не является фаилом BMP","ERROR",MB_ICONHAND);
        return 0;
    }

    infoHeadSize    = fileHead.bfOffBits - fileHeadSize;
    fileSize        = fileHead.bfSize;
    imageSize    = fileSize - (fileHeadSize + infoHeadSize);

    *pInfoHead = (BITMAPINFOHEADER*)(new BYTE[infoHeadSize]);
    loadFile.read((char*)*pInfoHead, infoHeadSize);

    *BitMap = new BYTE[imageSize];
    loadFile.read((char*)*BitMap, imageSize);

    return imageSize;
}


Возможно этот примерчик тебе поможет?

Добавлено через 7 минут и 17 секунд
Только не забудь после использования освободить память выделенную под заголовок фаила и его BitMap массив...
тут конечноже нету никакого освобождения памяти это предусмотрено другой функцией...
PM MAIL   Вверх
ZC1989
Дата 25.4.2007, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: нет
Всего: 1



Kipter, как загружать битмаппы в прогу я знаю, мне в данной ситуации надо получить все его байты... 
zkv, попробую так.... а в мессадж боксе я хотел просто увидеть ту же пакасть (содержимое файла) что и через EditPlus... а именно бредовые символы и много-много квадратиков... smile

Добавлено через 12 минут и 16 секунд
zkv, получилось то что хотел! fwrite() то что надо!!! 

закрываю тему... smile 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
dizzy1984
Дата 25.4.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Цитата(JackYF @  24.4.2007,  16:49 Найти цитируемый пост)
А по-моему, как раз наоборот...
За счет чего будет этот выигрыш в скорости, можно поинтересоваться?

За счет более оптимального алгоритма чтения.

Вот результаты замеров применения метода read для буфера в 64*10^6 байт

ifstream::read        fread
------------------------------------
1   1406                 1515
2   1484                 1422
3   1391                 1515
4   1454                 1406
5   1406                 1438
6   1422                 1453
7   1485                 1453
8   1453                 1422
9   1469                 1453
10 1484                 1469
-----------------------------------
ср. арифметическое
-----------------------------------
1445,4        1454,6

выражено ~ 10^-3 секундах

Правда выгода не велика, а учитывая погрешности, можно сказать что они работают примерно одинаково.
Пользоваться можно тем, чем удобнее.

Интересно было бы сверить скорости работы методов чтения класса CFile и ifstream

Это сообщение отредактировал(а) dizzy1984 - 25.4.2007, 13:12
PM MAIL   Вверх
JackYF
Дата 25.4.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(dizzy1984 @  25.4.2007,  13:06 Найти цитируемый пост)
ifstream::read        fread
------------------------------------
1   1406                 1515
2   1484                 1422
3   1391                 1515
4   1454                 1406
5   1406                 1438
6   1422                 1453
7   1485                 1453
8   1453                 1422
9   1469                 1453
10 1484                 1469
-----------------------------------
ср. арифметическое
-----------------------------------
1445,4        1454,6


Выгода? Где эта выгода? Средние числа отличаются меньше, чем на 1%, все разбросы в диапазоне случайных.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
dizzy1984
Дата 26.4.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Я и сам пришел к тому же выводу, читай пост выше
PM MAIL   Вверх
JackYF
Дата 26.4.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(dizzy1984 @  25.4.2007,  13:06 Найти цитируемый пост)
можно сказать что они работают примерно одинаково.
Пользоваться можно тем, чем удобнее.


Да, с этим согласен, что и требовалось доказать.
Но в то же время в этой же строке ты написал и 

Цитата(dizzy1984 @  25.4.2007,  13:06 Найти цитируемый пост)
Правда выгода не велика

А я говорю, что ее вообще нет. Хотя, с темой давно все выяснили, заканчиваем.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
dizzy1984
Дата 26.4.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Хм...
Столь сильное желание несоглашаться побудило меня на другие эксперименты.
Главный опасный момент в предыдущих результатах заключался в том, что как средство измерения я использовал ::GetTickCount(), точность которого была где-то 1*10^-3. Кроме того у меня был слишком большой буфер. Теперь я вооружился абсолютным средством, а именно счетиком TSC и связанной с ним RDTSC, кроме того я увеличил время чтения. Похоже я действительно "пролетел" с точностью измерений.
Теперь результаты с лихвой подтверждают мое первоначальное суждение.
92170230 для fstream::read против 613031179 для fread. Время чтения с помощью fstream::read ~5 раз меньше fread. Такие вещи полезно знать для программ работающих с большими файлами.

Вот сам код.

Код

volatile unsigned __int64 RDTSC()

{              __asm __emit 0fh __asm __emit 0a2h 

                __asm __emit 0fh __asm __emit 031h 
}

#define SIZE 64000
void CVg1Dlg::OnOK() 
{
    ifstream in("C:\\mp3\\Apocaliptica\\01 - Prologue (Apperhension).mp3");
    FILE * in2 = fopen("C:\\mp3\\Apocaliptica\\01 - Prologue (Apperhension).mp3","rb");
    char buf[SIZE];
    DWORD totalstr=0, totalfr=0, str1, str2, fr1, fr2 ;
    for (int i=0;i<100000;i++)
    {

        str1=RDTSC();
        in.read(buf,SIZE);
        str2=RDTSC();
        totalstr += str2-str1;
        in.seekg(0, ios::beg);

        fr1=RDTSC();
        fread(buf,1,SIZE,in2);
        fr2=RDTSC();
        totalfr += fr2-fr1;
        rewind(in2);
    }
    fclose(in2);
}


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0631 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.