АШ>Хочу сравнить эффективность своего варианта с предложенным. Не сочтите за труд. Пусть входной файл будет в 1Mb.
vc71, release, оптимизация по скорости.
// file2vect.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <vector>
#include <iostream>
#include <fstream>
using namespace std;
int _tmain( int argc, _TCHAR* argv[] )
{
DWORD t1 = GetTickCount();
ifstream inputFile( "E:\\PROJECTS\\VC71\\tests\\file2vect\\filename.txt", ios::in | ios::binary );
if( !inputFile )
{
cout << "file open error!!!" << endl;
return 1;
}
vector<char> filedata( ( istreambuf_iterator<char>( inputFile ) ), istreambuf_iterator<char>() );
DWORD t2 = GetTickCount();
cout<< "vector size = " << filedata.size() << ", loading time = " << t2 - t1 << " ms." << endl;
return 0;
}
вывод, несколько запусков:
vector size = 2027953, loading time = 211 ms.
vector size = 2027953, loading time = 210 ms.
vector size = 2027953, loading time = 210 ms.
vector size = 2027953, loading time = 211 ms.
второй вариант:
// file2vect2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <time.h>
using namespace std;
int main()
{
DWORD t1 = GetTickCount();
std::ifstream f("E:\\PROJECTS\\VC71\\tests\\file2vect\\filename.txt", std::ios::in | std::ios::binary);
if( !f )
{
cout << "file open error!!!" << endl;
return 1;
}
std::vector<char> buffer;
std::ifstream::pos_type size = 0;
if( f.seekg(0, std::ios::end) )
{
size = f.tellg();
}
if( size && f.seekg(0, std::ios::beg) )
{
buffer.resize(size);
f.read(&buffer[0], size);
}
DWORD t2 = GetTickCount();
cout<< "vector size = " << buffer.size() << ", loading time = " << t2 - t1 << " ms." << endl;
return 0;
}
вывод, несколько запусков:
vector size = 2027953, loading time = 20 ms.
vector size = 2027953, loading time = 10 ms.
vector size = 2027953, loading time = 20 ms.
vector size = 2027953, loading time = 10 ms.
с чем вас и поздравляю
на больших файлах различия несколько сглаживаются:
E:\PROJECTS\VC71\tests\file2vect\file2vect\Release\file2vect.exe
vector size = 322525944, loading time = 88187 ms.
E:\PROJECTS\VC71\tests\file2vect\file2vect2\Release\file2vect2.exe
vector size = 322525944, loading time = 37514 ms.