Re[2]: ..., дорогая редакция (-)
От: Roman Odaisky Украина  
Дата: 19.07.08 21:22
Оценка:
До последнего не верил в пирамиду Лебедева.
Re[2]: Как наилучшим образом считать файл в буфер?
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 20.07.08 05:07
Оценка:
Здравствуйте, xmen, Вы писали:

X>
X>#define UNICODE
X>#include <stdio.h>
X>#include <windows.h>

X>main()
X>{
X>    DWORD t1 = GetTickCount();
    
X>    HANDLE hFile = CreateFile(TEXT("file.bin"), 
X>                              GENERIC_READ,
X>                              0,
X>                              NULL,
X>                              OPEN_EXISTING,
X>                              0,
X>                              0);
    
X>    if (hFile == INVALID_HANDLE_VALUE)
X>    {
X>        printf("Error: CreateFile = INVALID_HANDLE_VALUE\n");
X>        return;
X>    }
    
X>    LPVOID buf = 0;
X>    DWORD size = 0;
X>    DWORD dw;
    
X>    size = GetFileSize(hFile, NULL);
    
X>    buf = HeapAlloc(GetProcessHeap(), 0, size);
    
X>    if (!buf)
X>    {
X>        printf("Error: HeapAlloc = %d\n", GetLastError());
X>        return;
X>    }
    
X>    if (!ReadFile(hFile, buf, size, &dw, NULL))
X>    {
X>        printf("Error: ReadFile = %d\n", GetLastError());
X>        return;
X>    }
    
X>    DWORD t2 = GetTickCount();

X>    printf("vector size = %d, loading time = %d ms.\n", size, t2 - t1);
    
X>    HeapFree(GetProcessHeap(),0, buf);
X>    CloseHandle(hFile);
X>}
X>


и? (глядя на на subj) где тут vector?
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[7]: STL: банальный вопрос
От: skeptik_  
Дата: 20.07.08 08:18
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>Мне кажется странным выделять память с запасом при вполне "известном" размере файла. Во всяком случае, есть все средства для его вычисления.


ME>Конкретно у fstream — да.


ME>Случается, что istream используется как интерфейс к custom streambuf'у и получит размер нет возможности...


Размер файла можно и так определить:

boost::filesystem::file_size( boost::filesystem::path( filename ) );
Re[2]: STL: банальный вопрос
От: igna Россия  
Дата: 20.07.08 08:59
Оценка: -1 :)
Здравствуйте, Анатолий Широков, Вы писали:

АШ>    std::ifstream::pos_type size = 0;

АШ>    .
АШ>    .
АШ>    .

АШ>       f.read(&buffer[0], size);


Согласно 27.4.3.2 преобразвание pos_type в streamsize должно осуществляться явно:

       f.read(&buffer[0], static_cast<streamsize>(size));
Re[3]: Как наилучшим образом считать файл в буфер?
От: xmen  
Дата: 20.07.08 15:37
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

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


X>>
X>>#define UNICODE
X>>#include <stdio.h>
X>>#include <windows.h>

X>>main()
X>>{
X>>    DWORD t1 = GetTickCount();
    
X>>    HANDLE hFile = CreateFile(TEXT("file.bin"), 
X>>                              GENERIC_READ,
X>>                              0,
X>>                              NULL,
X>>                              OPEN_EXISTING,
X>>                              0,
X>>                              0);
    
X>>    if (hFile == INVALID_HANDLE_VALUE)
X>>    {
X>>        printf("Error: CreateFile = INVALID_HANDLE_VALUE\n");
X>>        return;
X>>    }
    
X>>    LPVOID buf = 0;
X>>    DWORD size = 0;
X>>    DWORD dw;
    
X>>    size = GetFileSize(hFile, NULL);
    
X>>    buf = HeapAlloc(GetProcessHeap(), 0, size);
    
X>>    if (!buf)
X>>    {
X>>        printf("Error: HeapAlloc = %d\n", GetLastError());
X>>        return;
X>>    }
    
X>>    if (!ReadFile(hFile, buf, size, &dw, NULL))
X>>    {
X>>        printf("Error: ReadFile = %d\n", GetLastError());
X>>        return;
X>>    }
    
X>>    DWORD t2 = GetTickCount();

X>>    printf("vector size = %d, loading time = %d ms.\n", size, t2 - t1);
    
X>>    HeapFree(GetProcessHeap(),0, buf);
X>>    CloseHandle(hFile);
X>>}
X>>


OE>и? (глядя на на subj) где тут vector?


Ага когда отпостил поздно было
Зачем тему изменили на "Как наилучшим образом считать файл в буфер?" вот я и нарвался.
Re[2]: вопрос
От: Vamp Россия  
Дата: 21.07.08 21:33
Оценка: +1
А>не может же std::istreambuf_iterator<char>() указывать на конец файла.
Нет, он не указывает на конец файла. Он есть такое значение итереатора, которое ознаечает конец файла. Начальный итератор инкрементируется до тех пор, когда не доходит до конца файла, и в этот момент его значение становится равным ограничивающему.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: вопрос
От: gear nuke  
Дата: 22.07.08 05:37
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>не может же std::istreambuf_iterator<char>() указывать на конец файла.


24.5.1/1 istream_iterator reads (using operator>>) successive elements from the input stream for which
it was constructed. After it is constructed, and every time ++ is used, the iterator reads and stores a value of
T. If the end of stream is reached ( operator void*() on the stream returns false), the iterator
becomes equal to the end-of-stream iterator value. The constructor with no arguments
istream_iterator() always constructs an end of stream input iterator object, which is the only legitimate
iterator to be used for the end condition
. The result of operator* on an end of stream is not
defined. For any other iterator value a const T& is returned. The result of operator-> on an end of
stream is not defined. For any other iterator value a const T* is returned. It is impossible to store things
into istream iterators. The main peculiarity of the istream iterators is the fact that ++ operators are not
equality preserving, that is, i == j does not guarantee at all that ++i == ++j. Every time ++ is used a
new value is read.

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.