файлы и их открытие

Рубрика: C++, Дата: 26 February, 2013, Автор:
Tags:

Откройте и прочтите 100 файлов по 1500 символов каждый. Откройте и прочтите один файл содержащий 150000 символов. Есть ли разница во времени выполнения задач? Каково наибольшее число файлов которое можно одновременно открыть в вашей системе? Рассмотрите этот вопрос касательно использования включаемых файлов.

Ок. Для начала нам нужно создать 100 файлов по 1500 символов каждый. Напишем код генерирующий 100 файлов.

int main()
{
    int count=0;
    cout <<endl<<strNum(count)<<endl;
    for(int i=0;i<100;i++)
    {
        string name="z"+strNum(count);
        name+=".dat";
        cout <<name<<endl;
        count++;
        ofstream w(name.data(),ios::out);
        if(!w)
        {
            cerr <<"don't open file"<<endl;
            exit(1);
        }
        //zapic6 v fail
        srand(time(0));//zacevaem generator
        for(int i=0;i<1500;i++)
        {
            w <<(char)(32+rand()%93);
        }
        w.close();
    }
    //generaci9 15 raznux ctrok

    return 0;
}

Все создали. Дальше откроем и прочитаем эти 100 файлов по 1500 символов пишем програмку:

//otkruvaem i chitaem failu
	int count=0;
	for(int i=0;i<100;i++)
	{
		string name="z"+strNum(count);
		name+=".dat";
		cout <<name<<endl;
		++count;
		ifstream r(name.data(),ios::in);
		if(!r)
		{
			cerr <<"don't open file"<<endl;
			exit(1);//zaverwit6 programmy c kodom vozvrata 1
		}

		string text="";
		char c;
		while(r.get(c))
		{
			text+=c;
		}

		//cout <<text<<endl;
		//exit(1);
	}

Как мы видим С++ очень быстро это делает буквально за секунду.

Дальше генерируем файл на полторы тысячи символов

код генератора:

        //gen file na 150000 c
	string name="poltoru.dat";
	ofstream w(name.data(),ios::out);
	if(!w)
	{
		cerr <<"don't open file"<<endl;
		exit(1);
	}
	//zapic6 v fail
	srand(time(0));//zacevaem generator
	for(int i=0;i<150000;i++)
	{
		w <<(char)(32+rand()%93);
	}
	w.close();

теперь попробуем его открыть и прочитать.

Пишем код:

//prochitat6 na 150000
	string name="poltoru.dat";
	ifstream r(name.data(),ios::in);
	if(!r)
	{
		cerr <<"don't open file"<<endl;
		exit(1);//zaverwit6 programmy c kodom vozvrata 1
	}

	string text="";
	char c;
	while(r.get(c))
	{
		text+=c;
	}
	r.close();
	//cout <<text<<endl;

Честно сказать я разницы не заметил между открытием и прочтением 100 файлов по 1500 строк и одного файла 150000 строк, на глаз оно не заметно, быстро очень прочитало буквально за секунду, как в первом случае так и во втором.

Вылаживаю полный листинг программы:

//programma otrkruti9 failov
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
using std::ios;
using std::cerr;
#include <fstream>
using std::ifstream;
using std::ofstream;
#include <cstdlib>
using std::exit;
using std::srand;
using std::rand;
#include <ctime>
using std::time;
#include <string>
using std::string;

//perevod chicla v ctroky int
string strNum(int n)
{
	string s="";
	if(n==0)
		s="0";
	int mass[13]={0};
	for(int i=0;n!=0;n=n/10,i++)
	{
		int r=n%10;
		//cout <<r<<endl;
		mass[i]=r;
	}

	int i=12;
	for(;mass[i]==0;i--);
	for(;i>=0;i--)
	{
		s+=(mass[i]+'0');
		//cout <<mass[i]<<endl;
	}

	//cout <<s<<endl;
	return s;
}

int main()
{
	/*int count=0;
	cout <<endl<<strNum(count)<<endl;
	for(int i=0;i<100;i++)
	{
		string name="z"+strNum(count);
		name+=".dat";
		cout <<name<<endl;
		count++;
		ofstream w(name.data(),ios::out);
		if(!w)
		{
			cerr <<"don't open file"<<endl;
			exit(1);
		}
		//zapic6 v fail
		srand(time(0));//zacevaem generator
		for(int i=0;i<1500;i++)
		{
			w <<(char)(32+rand()%93);
		}
		w.close();
	}*/

	//otkruvaem i chitaem failu
	/*int count=0;
	for(int i=0;i<100;i++)
	{
		string name="z"+strNum(count);
		name+=".dat";
		//cout <<name<<endl;
		++count;
		ifstream r(name.data(),ios::in);
		if(!r)
		{
			cerr <<"don't open file"<<endl;
			exit(1);//zaverwit6 programmy c kodom vozvrata 1
		}

		string text="";
		char c;
		while(r.get(c))
		{
			text+=c;
		}
		r.close();
		//cout <<text<<endl;
		//exit(1);
	}*/

	//ifstream r(

	/*//gen file na 150000 c
	string name="poltoru.dat";
	ofstream w(name.data(),ios::out);
	if(!w)
	{
		cerr <<"don't open file"<<endl;
		exit(1);
	}
	//zapic6 v fail
	srand(time(0));//zacevaem generator
	for(int i=0;i<150000;i++)
	{
		w <<(char)(32+rand()%93);
	}
	w.close();*/

	//prochitat6 na 150000
	string name="poltoru.dat";
	ifstream r(name.data(),ios::in);
	if(!r)
	{
		cerr <<"don't open file"<<endl;
		exit(1);//zaverwit6 programmy c kodom vozvrata 1
	}

	string text="";
	char c;
	while(r.get(c))
	{
		text+=c;
	}
	r.close();
	//cout <<text<<endl;

	return 0;
}

Ну вообще пока все то сколько одновременно можно отрыть файлов в системе пропустим, не будем делать, короче откинем эту часть задачи хз скок можно мб и много, смотря в каком смысле понимать, от допустим если мы откроем файл в одном потоке, в одной переменной командой ifstream r допустим но разные файлы в цикле, то их можно сколько угодно открыть, если мы откроем файл и содержимое файла сохраним в переменной кокой нить, либо в кокой нить динамической структуре данных, например линейный список, то естественно количество открытых файлов будет зависеть от оперативной памяти компьютера, ведь память не бесконечна, и чем больше памяти, тем больше мы можем файлов открыть, вообще эту часть не будем делать, это и так ясно. Ну пока все решаем дальше следующую .

Также и на включение заголовочных файлов скорее всего количество будет зависеть от оперативной памяти.

rss