Модераторы: 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   Вверх
Daevaorn
Дата 26.4.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(dizzy1984 @  26.4.2007,  16:24 Найти цитируемый пост)
 ifstream in("C:\\mp3\\Apocaliptica\\01 - Prologue (Apperhension).mp3");    FILE * in2 = fopen("C:\\mp3\\Apocaliptica\\01 - Prologue (Apperhension).mp3","rb");

мне кажется или участники не в равных условиях?
PM MAIL WWW   Вверх
JackYF
Дата 26.4.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(dizzy1984 @  26.4.2007,  15:24 Найти цитируемый пост)
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);


Э, не понял... За каким гуком здесь стоят seekg и rewind? Постоянно считывать одни и те же 64К?
Дак их система закэширует по ей одной понятному принципу... Данный код ничего реального не отображает.



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


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


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

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



Ну вот я сделал и свои замеры. Код следующий был у меня (MinGW)

Код

#include <iostream>
#include <fstream>
#include <cstdio>

#include <yf/yfTime/time.hpp>

#define SIZE 64000
int main()
{
   char filename[] = "d:\\TempInstall\\Downloads\\qt-win-opensource-src-4.2.3.zip";

   std::ifstream in(filename, std::ios::binary);


   char buf[SIZE];
   yf::micro_time_t time1, time2, time3;

   time1 = yf::micro_time();
   ulong count = 100;
   for (int i=0;i<count;i++)
   {
      in.read(buf,SIZE);
      std::cout << buf[77];
   }
   in.close();
   time2 = yf::micro_time();
   std::FILE * in2 = fopen(filename,"rb");
   for (int i=0;i<count;i++)
   {
      std::fread(buf,1,SIZE,in2);
      std::cout << buf[77];
   }
    time3 = yf::micro_time();
    fclose(in2);

    std::cout << "\nIostreams time: ";
    yf::write_micro_time( time1, time2 );
    std::cout << "C-files time: ";
    yf::write_micro_time( time2, time3 );
}


Файл 42-метровый, если что.
"std::cout << buf[77]" для облома компилятору оптимизировать вызов функции, так как без этого он явно пытается это делать.
Собрано в release.

Итак, результаты:
Код

Iostreams time: 0.016732 sec
C-files time: 0.015679 sec


Разницу в 5 раз во времени не вижу.

Реализация замера времени в данном случае - QueryPerformanceFrequency/QueryPerformanceCounter.

Добавлено через 7 минут и 27 секунд
Цитата(Daevaorn @  26.4.2007,  15:36 Найти цитируемый пост)
мне кажется или участники не в равных условиях? 

Что ты здесь имел в виду? Отсутствие ios::binary? Или что-то другое?


Это сообщение отредактировал(а) JackYF - 26.4.2007, 17:01


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


Опытный
**


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

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



Цитата(JackYF @  26.4.2007,  16:29 Найти цитируемый пост)
Э, не понял... За каким гуком

Чтобы не прочитать за конец файла

Цитата(JackYF @  26.4.2007,  16:29 Найти цитируемый пост)
Дак их система закэширует по ей одной понятному принципу

Через чур интеллектуально для системы


Цитата(JackYF @  26.4.2007,  16:29 Найти цитируемый пост)
Данный код ничего реального не отображает.

Принимается. Изменил на другой

Код

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:\\Documents and Settings\\Administrator\\My Documents\\Books\\Библиотека Мошкова\\Moshkov_books(RUS)_lib.ru.part1.rar");     //720метров
    char buf[SIZE];

    unsigned __int64 totalstr=0, totalfr=0, str1, str2, fr1, fr2 ;
    for (int i=0;i<10000;i++)
    {
        str1=RDTSC();
        in.read(buf,SIZE);
        str2=RDTSC();
        totalstr += str2-str1;
    };
    in.close();

    FILE * in2 = fopen("C:\\Documents and Settings\\Administrator\\My Documents\\Books\\Библиотека мошкова\\Moshkov_books(RUS)_lib.ru.part1.rar","rb");     //720метров
    for (i=0;i<10000;i++)
    {
        fr1=RDTSC();        
        fread(buf,1,SIZE,in2);        
        fr2=RDTSC();
        totalfr += fr2-fr1;
    }
    fclose(in2);
 }


Режим Release.
Первый цикл пробегает за какую-то долю секунды.
За время второго я успеваю сосчитать до 25-ти

Цитата(JackYF @  26.4.2007,  16:59 Найти цитируемый пост)
 ulong count = 100;

Чего мелочиться? давай уж хотя бы 10^4

Вобщем я бы мог поспорить на счет правильности вывода и точности счетчиков, но дело-то в том что у меня разница заметна "на глаз". 
Я пробую на vs6.0, но и на 8-ке у меня все летало. Хорошо помню как считал построчно и обработал каждую строку в файле 80-метров за 3 секунды. 
Может дело в различной реализации?

И вот еще что... вертелось в голове не мог сформулировать. Возможно фишка проявляется на вызове повторяющихся операций, а не на одиночных. 
Тогда твои результаты можно объяснить небольшим количеством итераций. (у меня их в 100 раз больше)

Это сообщение отредактировал(а) dizzy1984 - 26.4.2007, 20:53
PM MAIL   Вверх
JackYF
Дата 27.4.2007, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(dizzy1984 @  26.4.2007,  20:41 Найти цитируемый пост)
Первый цикл пробегает за какую-то долю секунды.


Забавно. Давай подсчитаем количество считанных тобой байт. За одно считывание у нас читается приблизительно 64К.
Считываний у тебя 10000. Итого мы считываем 10000*64К = 10*64М = 640 Мб.
Ты говоришь, что это происходит за долю секунды?

По имеющимся у меня сведениям, скорость 640 Мб/с не имеет ни один жесткий диск.

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



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


Опытный
**


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

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



ребят, вас чё понесло-то?? smile 


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


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


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

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



Цитата(ZC1989 @  27.4.2007,  10:14 Найти цитируемый пост)
ребят, вас чё понесло-то??


Лично я увидел фразу

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


И я с этим не согласен. Отсюда все мои посты. Обертка в С-файлов в удобные классы для работы, которые написаны по ООП и в рамках STL - очень хорошая вещь. Во многих случаях облегчает жизнь, особенно сначала. Но от того, что мы обернем что-нибудь в красивую оболочку, скорость не увеличится.



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


Опытный
**


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

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



JackYF, вы тут делагогию развели по пустому! я сделал что хотел... за эт пасибо... я не просил самый быстрый способ... smile 


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


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


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

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



Цитата(ZC1989 @  27.4.2007,  14:31 Найти цитируемый пост)
по пустому!

Нет, не по пустому... Это довольно-таки принципиальный вопрос - вопрос скорости работы С-файлов и С++-потоков.

В данном случае скорость не роляет, это да.

Если оффтопик, то можно выделить в отдельную тему...



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


Опытный
**


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

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



Высокая скорость работы первого цикла объяснялась отсутствием процесса чтения. Метод read читал первые 4-ре байта и встречал символ ctrl+z, а посколько файл был открыт как текстовый ( smile ) воспринимал это как конец файла и ставил статус "все плохо". все последующие 10000-1 итерации работа метода обрывалась где-то в самом начале на проверке статуса.
Я добавил std::ios::binary в конструктор потока. Время срабатывания метода ofstream::read стало больше, чем fread от 1.5ра до где-то 10-ти раз.
Я зря спорил с тобой, ты был прав с самого начала.
Извини.


P.S Мне было интересно и я попробовал также CStdioFile::Read. В большинстве случаев он шел очень близко к fread.
PM MAIL   Вверх
Daevaorn
Дата 27.4.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(dizzy1984 @  27.4.2007,  17:56 Найти цитируемый пост)
Метод read читал первые 4-ре байта и встречал символ ctrl+z, а посколько файл был открыт как текстовый (  ) воспринимал это как конец файла и ставил статус "все плохо". все последующие 10000-1 итерации работа метода обрывалась где-то в самом начале на проверке статуса.Я добавил std::ios::binary в конструктор потока. 

вот-вот. я про это и говорил.
PM MAIL WWW   Вверх
JackYF
Дата 27.4.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Daevaorn @  27.4.2007,  17:17 Найти цитируемый пост)
вот-вот. я про это и говорил. 

Ага, понятно. Я тогда заметил отсутствие ios::binary, но забыл про такую фишку чтения текстовых файлов...
Тогда многое становится ясным.


Цитата(dizzy1984 @  27.4.2007,  16:56 Найти цитируемый пост)
Я зря спорил с тобой, ты был прав с самого начала.
Извини.

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

Вот теперь тему можно точно закрывать.




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0846 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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