Откройте и прочтите 100 файлов по 1500 символов каждый. Откройте и прочтите один файл содержащий 150000 символов. Есть ли разница во времени выполнения задач? Каково наибольшее число файлов которое можно одновременно открыть в вашей системе? Рассмотрите этот вопрос касательно использования включаемых файлов.
Ок. Для начала нам нужно создать 100 файлов по 1500 символов каждый. Напишем код генерирующий 100 файлов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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 символов пишем програмку:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//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); } |
Как мы видим С++ очень быстро это делает буквально за секунду.
Дальше генерируем файл на полторы тысячи символов
код генератора:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//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(); |
теперь попробуем его открыть и прочитать.
Пишем код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//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 строк, на глаз оно не заметно, быстро очень прочитало буквально за секунду, как в первом случае так и во втором.
Вылаживаю полный листинг программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
//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 допустим но разные файлы в цикле, то их можно сколько угодно открыть, если мы откроем файл и содержимое файла сохраним в переменной кокой нить, либо в кокой нить динамической структуре данных, например линейный список, то естественно количество открытых файлов будет зависеть от оперативной памяти компьютера, ведь память не бесконечна, и чем больше памяти, тем больше мы можем файлов открыть, вообще эту часть не будем делать, это и так ясно. Ну пока все решаем дальше следующую .
Также и на включение заголовочных файлов скорее всего количество будет зависеть от оперативной памяти.