Здравствуйте, 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>>
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, Анатолий Широков, Вы писали:
АШ>>Мне кажется странным выделять память с запасом при вполне "известном" размере файла. Во всяком случае, есть все средства для его вычисления.
ME>Конкретно у fstream — да.
ME>Случается, что istream используется как интерфейс к custom streambuf'у и получит размер нет возможности...
Размер файла можно и так определить:
boost::filesystem::file_size( boost::filesystem::path( filename ) );
Здравствуйте, Анатолий Широков, Вы писали:
АШ> 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));
Здравствуйте, 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?
Ага когда отпостил поздно было
Зачем тему изменили на "Как наилучшим образом считать файл в буфер?" вот я и нарвался.
Здравствуйте, <Аноним>, Вы писали:
А>не может же 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