Форум программистов, компьютерный форум CyberForum.ru

Быстрое чтение файла - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Написать программу, которая вычисляет среднее арифметическое ненулевых элементов введенного с клавиатуры массива целых чисел. http://www.cyberforum.ru/cpp-beginners/thread381660.html
Написать программу, которая вычисляет среднее арифметическое ненулевых элементов введенного с клавиатуры массива целых чисел. Ниже приведен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Введите элементы массива (10 целых чисел) в одной строке и нажмите <Enter>. -> 23 О 45 -5 12 О -2 30 О 64 Сумма элементов массива: 184...
C++ Аппаратное программирование клавиатуры. Доброго времени суток всем. Есть определённая задача - сделать сброс клавиатуры не перезагружая компьютер. Нарыл в дебрях интернета статейки - отключить, включить, сбросить и провести эхо-тест клавиатуры можно из под Windows XP посредством обращения напрямую к портам. Нарыл кусочки кодов - как это можно сделать. Но написать полноценный экзешник не могу. Так как не знаком с языком С++... http://www.cyberforum.ru/cpp-beginners/thread381658.html
C++ факториал
найти число нулей в конце факториала числа N по основанию каждого множителя K (1<=N<=1000000000, 2<=K<=1000) #include <iostream> typedef unsigned long long ulong; #include <vector> #include <sstream> #include <iomanip> using namespace std; const int base = 1000000000; class BigNumb {
Инкремент невалидного итератора C++
Привет. Этот вопрос задали знакомому на собеседовании... Что произойдет при инкременте невалидного итератора?
C++ Dll com-совместимая http://www.cyberforum.ru/cpp-beginners/thread381588.html
Подскажите пожалуйста, как в реализации обычная dll отличается от com-совместимой dll?
C++ Timer начало змейки Есть таймер и есть label1 таймер включен в таймере прописано Label1->Left= Left +1; и в результате Label1 перемещаетья примерно на 5 сантиметров влево и все, больше не двигается в чем дело, ведь он должен каждую секунду перемещать на чуть чуть то есть на одну единицу, а он прыгает и замирает. подробнее

Показать сообщение отдельно
-=ЮрА=-
Заблокирован
Автор FAQ
11.11.2011, 16:37     Быстрое чтение файла
Всё же я посьавил себе за цель проверить свои слова о быстроте,
для полноты анализа рассматривал сразу 3 алгоритма чтения вещественных в массив
1 - й вариант fscanf
2 - й буффер а затем подхват всего strtok-ом и atof-ом
3 - й любимый многими начинающими вариант ifstream>>
Пришлось написать заполнитель файла - мой файл содержит 656898 double и весит 3,75 Мб)
(вбивать вручную 3 Мб чисел я бы засел на дня 2)
так что цепляю и код рандомного наполнителя файла тоже
(наполняет файл долго - около 15 сек, ну дык и значений почти 660 тысяч)
fill.cpp
C++
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
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main()
{
    double val;
    cout<<"Enter num of elements : ";
    long num;cin>>num;
    ofstream ofs("file.txt");
    ofs<<num<<endl;
    srand(time(0));
    for(long i = 0; i < num; i++)
    {
        cout<<(val = rand()%(2*num)/(1.0 + rand()%2));
        ofs<<val;
        if(i != num - 1)
        {
            cout<<" ";
            ofs<<" ";
        }
        else
            cout<<"\n";
    }
    ofs.close();
    system("pause");
    return 0;
}


Сам алгоритм чтения здесь
read.cpp
C++
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
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
double * parse_fscanf(long &n, double * arr);
double * parse_strtok(long &n, double * arr);
double * parse_ifstrm(long &n, double * arr);
 
int main()
{
    long n,bgn,end;
    double * arr = NULL;
    cout<<"\tVariant C(fscanf)\n";
    time(&bgn);
    cout<<"Algorithm started at : "<<asctime(localtime(&bgn));
    arr = parse_fscanf(n, arr);
    time(&end);
    cout<<"Algorithm stoped at : "<<asctime(localtime(&end));
    cout<<"Time of work : "<<difftime(end,bgn)<<" sec"<<endl;
    cout<<"arr["<<0<<"] = "<<arr[0]<<endl;
    cout<<"arr["<<n - 1<<"] = "<<arr[n - 1]<<endl;
    delete [] arr;
 
    cout<<"\tVariant C(strtok)\n";
    time(&bgn);
    cout<<"Algorithm started at : "<<asctime(localtime(&bgn));
    arr = parse_strtok(n, arr);
    time(&end);
    cout<<"Algorithm stoped at : "<<asctime(localtime(&end));
    cout<<"Time of work : "<<difftime(end,bgn)<<" sec"<<endl;
    cout<<"arr["<<0<<"] = "<<arr[0]<<endl;
    cout<<"arr["<<n - 1<<"] = "<<arr[n - 1]<<endl;
    delete [] arr;
 
    cout<<"\tVariant C++(ifstream)\n";
    time(&bgn);
    cout<<"Algorithm started at : "<<asctime(localtime(&bgn));
    arr = parse_ifstrm(n, arr);
    time(&end);
    cout<<"Algorithm stoped at : "<<asctime(localtime(&end));
    cout<<"Time of work : "<<difftime(end,bgn)<<" sec"<<endl;
    cout<<"arr["<<0<<"] = "<<arr[0]<<endl;
    cout<<"arr["<<n - 1<<"] = "<<arr[n - 1]<<endl;
    delete [] arr;
 
    system("pause");
    return 0;
}
 
double * parse_fscanf(long &n, double * arr)
{
    FILE * file = fopen("file.txt","rb");
    if(!file)
        cout<<"Error open file.txt\n";
    else
    {
        fscanf(file,"%u",&n);
        arr = new double[n];
        for(long i = 0; i < n; i++)
            fscanf(file,"%lf",&arr[i]);
        fclose(file);
    }
    return arr;
}
 
double * parse_strtok(long &n, double * arr)
{
    char * tok;
    char * str;
    char delim[] = " \n";
    long i,sLen;
    FILE * file = fopen("file.txt","rb");
    if(!file)
        cout<<"Error open file.txt\n";
    else
    {
        fseek(file,0,SEEK_END);
        sLen = ftell(file);
        fseek(file,0,SEEK_SET);
        if(!(str = (char *)malloc(sizeof(char)*(sLen + 1))))
            cout<<"Allocation memory error\n";
        else
        {
            fread(str,1,sLen,file);
            str[sLen] = '\0';
        }
        fclose(file);
        if(str)
        {
            
            tok = strtok(str,delim);
            n = atoi(tok);i = 0;
            arr = new double[n];
            tok = strtok(NULL,delim);
            while(tok)
            {
                arr[i++] = atof(tok);
                tok = strtok(NULL,delim);
            }
        }
    }
    return arr;
}
 
double * parse_ifstrm(long &n, double * arr)
{
    ifstream ifs("file.txt");
    if(!ifs)
        cout<<"Error open file.txt\n";
    else
    {
        ifs>>n;
        arr = new double[n];
        for(long i = 0; i < n && !ifs.eof(); i++)
            ifs>>arr[i];
        ifs.close();
    }
    return arr;
}


Сравнительная таблица на миниатюре. Как видим быстро отработали 1-й и 2-й варианты, но
спешу заметить посмотрите сколько операций именно во 2-м варианте - в два раза больше чем в
1-м, а время работы идентично, так что выводы делайте сами...
PS:Плюсовый вариант прямого чтения ifstream>> явообще отбросил для себя
(даже и не думал что это такой ужас в плане времени)
Миниатюры
Быстрое чтение файла   Быстрое чтение файла  
 
Текущее время: 14:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru