C++ 3d.Комментарии



Ввод символов


Как уже было сказано, главная сила языка C -- в его способности считывать символы и решать, что с ними ничего не надо делать -- причем выполнять это быстро. Это действительно важное достоинство, которое нельзя недооценивать, и цель C++ -- не утратить его.

Вынужден вас огорчить: определенные стандартом потоки C++ заявленным свойством не обладают. Они всегда работают медленнее C, а в некоторых реализациях -- медленно до смешного (правда, объективности ради стоит отметить, что мне попадались и совершенно отвратительно реализованные FILE* потоки C, в результате чего C++ код вырывался вперед; но это просто недоразумение, если не сказать крепче!). Рассмотрим следующую программу: #include <stdio.h> #include <time.h> #include <io.h> // для open() #include <fcntl.h> #include <iostream> #include <fstream>

using namespace std;

void workc(char*); void workcpp(char*); void work3(char*);

int main(int argc, char **argv) { if (argc==3) switch (*argv[2]-'0') { case 1: { workc(argv[1]); break; } case 2: { workcpp(argv[1]); break; } case 3: { work3(argv[1]); break; } } }

void workc(char* fn) { FILE* fil=fopen(fn, "rb");

if (!fil) return;

time_t t1; time(&t1);

long count=0; while (getc(fil)!=EOF) count++;

time_t t2; time(&t2);

fclose(fil); cout<<count<<" bytes per "<<t2-t1<<" sec.\n" ; }

void workcpp(char* fn) { ifstream fil(fn, ios_base::in|ios_base::binary);

if (!fil) return;

time_t t1; time(&t1);

long count=0; while (fil.get()!=EOF) count++;

time_t t2; time(&t2); cout<<count<<" bytes per "<<t2-t1<<" sec.\n" ; }

class File { int fd; // дескриптор файла unsigned char buf[BUFSIZ]; // буфер стандартного размера unsigned char* gptr; // следующий читаемый символ unsigned char* bend; // конец данных

int uflow(); public: File(char* fn) : gptr(0), bend(0) { fd=open(fn, O_RDONLY|O_BINARY); } ~File() { if (Ok()) close(fd); }




Содержание  Назад  Вперед