Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Tranquilllity
0 / 15 / 1
Регистрация: 29.05.2015
Сообщений: 59
Завершенные тесты: 1
1

Функция считывания данных из файла: прошу совет по оптимизации кода

23.12.2017, 21:38. Просмотров 721. Ответов 3
Метки нет (Все метки)

Код работает, но изящным его назвать очень тяжело. Прошу советов по сокращению и оптимизации
(пример того как файл выглядит прикрепляю)
Ф-я определения расширения файла
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char* getExpansion(char *fileName)                                                      
{
    int point;
    char *expansion;
    for (int i = 0; fileName[i] != '\0'; i++)                                           
        if (fileName[i] == '.') point = i;
 
    expansion = new char[strlen(fileName) - (point + 1) + 1];                           
    for (int i = point + 1; fileName[i] != '\0'; i++)
        expansion[i - point - 1] = fileName[i];
    expansion[strlen(fileName) - (point + 1)] = '\0';
    return expansion;
}


Ф-я считывания из файла данных объекта класса
Кликните здесь для просмотра всего текста
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
void readFrom(char *fileName)
{
    if (strcmp(writeNreadHelper(fileName), "txt") == 0)
    {
        ifstream fin;
        fin.open(fileName);
        department depFromFile;
        int length, length2 = 0, sectrosFromFile = 0;
        double salFromFile = 0;
        char * buffer;
        string file, nam, surnam;
        fin.seekg(0, ios::end);                                                     
        length = fin.tellg();
        fin.seekg(0, ios::beg);
        buffer = new char[length];
        fin.read(buffer, length);                                                   
        fin.close();
        file = "nobodyKnowsIexisted.txt";
        ofstream fin2;                                                              
        fin2.open(file);
        for (int i = 0; i < length; i++)
            if (buffer[i] != '-' && buffer[i] != '|' && buffer[i] != (char)(218) && buffer[i] != (char)(217) && buffer[i] != (char)(192) && buffer[i] != '\xBF' && buffer[i] != 'в•ђ' && buffer[i] != ' ' && buffer[i] != '\n')
            {
                fin2 << buffer[i];
                length2++;
            }
        fin2.close();
        ifstream fin3;
        fin3.open(file);
        delete[] buffer;
        buffer = new char[length2];
        fin3.read(buffer, length2);
        fin3.close();
 
        switch (buffer[0])
        {
        case 'D': depFromFile = Planned_economic; break;
        case 'A': depFromFile = Accounting; break;
        case 'C': depFromFile = Chancellery; break;
        case 'M': depFromFile = Marketing; break;
        case 'T': depFromFile = Transport; break;
        }
 
        for (int i = 0; i < length; i++)
        {
            if (buffer[i] == '#')
                sectrosFromFile++;
 
            if (buffer[i] == 'r' && buffer[i + 1] == 'i' && buffer[i + 2] == 'e'  && buffer[i + 3] == 's' && buffer[i + 4] == ':')
            {
                string s;
                for (int j = i + 5; buffer[j] != 'U'; j++)
                    s += buffer[j];
                salFromFile = atof(s.c_str());
            }
            if (buffer[i] == 'h' && buffer[i + 1] == 'e' && buffer[i + 2] == 'a'  && buffer[i + 3] == 'd' && buffer[i + 4] == 'o')
                for (int j = i + 49; buffer[j] > 58; j++)
                    nam += buffer[j];
 
            for (int h = 1; h < nam.length(); h++)
                if (nam[h] < 91 && nam[h] > 64)
                    for (int v = h; v < nam.length(); v += 0.5)
                    {
                        surnam += nam[v];
                        nam.erase(v, 1);
                    }
        }
        cout << "File \"" << fileName << "\" stores data about " << depFromFile << " , which has " << sectrosFromFile << " sector(s).";
        cout << endl << "The head of department is " << nam << " " << surnam << endl << "The summary of salaries in this department equals " << salFromFile << " UAH \n";
        delete[] buffer;
        remove(file.c_str());
    }
    else
        cout << "\nSorry, program doesn't work with " << writeNreadHelper(fileName) << " expansion.\n";
}
0
Миниатюры
Функция считывания данных из файла: прошу совет по оптимизации кода  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2017, 21:38
Ответы с готовыми решениями:

Функция считывания слов с текстового файла
Доброго времени суток!) Задача такова: Считать из текстового файла слова в...

Функция считывания из файла для map
в файле задана последовательность ключ-точка(map&lt;string,MYPOINT&gt;). Помогите,...

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

Функция seekq, вместо повторного считывания файла (txt)
Всем привет, ребят. Я тут новый и это мой первый пост :) И вопрос у меня вот...

Функция для считывания символа из файла в переменную wchar_t
Вот такой вот в общем код. Какой функцией можно считывать посимвольно символы...

3
Tranquilllity
0 / 15 / 1
Регистрация: 29.05.2015
Сообщений: 59
Завершенные тесты: 1
23.12.2017, 21:51  [ТС] 2
Цитата Сообщение от Tranquilllity Посмотреть сообщение
C++
1
2
3
4
for (int i = 0; i < length; i++)
* * * * {
* * * * * * if (buffer[i] == '#')
* * * * * * * * sectrosFromFile++;
*length2 здесь вместо length
0
Fyret
200 / 186 / 45
Регистрация: 30.07.2013
Сообщений: 392
24.12.2017, 00:13 3
Лучший ответ Сообщение было отмечено Tranquilllity как решение

Решение

Ну вот как-то так:
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
#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
#include <unordered_set>
 
std::string getExtension(const std::string& fileName)
{
    const auto pos = fileName.rfind('.');
    if (pos == std::string::npos)
        return std::string();
    return fileName.substr(pos + 1);
}
 
std::string getContent(const std::string& fileName)
{
    // тут подробно https://stackoverflow.com/questions/2602013/read-whole-ascii-file-into-c-stdstring
    std::ifstream input(fileName);
    return std::string((std::istreambuf_iterator<char>(input)), std::istreambuf_iterator<char>());
}
 
std::string filterContent(const std::string& content)
{
    const std::unordered_set<char> skipped{ '-', '|', char(217), char(218), char(192), '\xBF', char('в•ђ'), ' ', '\n' };
 
    std::string result;
    std::copy_if(content.begin(),
                 content.end(),
                 result.end(),
                 [&skipped](char c) { return skipped.count(c) == 0; });
    return result;
}
 
void parseContent(const std::string& content, department& dep, int& sectors, double& salary, std::string& headName, std::string& headSurname)
{
    switch (content[0])
    {
    case 'D': dep = Planned_economic; break;
    case 'A': dep = Accounting; break;
    case 'C': dep = Chancellery; break;
    case 'M': dep = Marketing; break;
    case 'T': dep = Transport; break;
    }
 
    sectors = 0;
    headName.clear();
    headSurname.clear();
 
    for (size_t i = 0; i < content.size(); ++i)
    {
        if (content[i] == '#')
            ++sectors;
        else if (content.compare(i, 5, "ries:"))
        {
            salary = std::strtod(&content[i+6], nullptr);
            i += 5;
        }
        else if (content.compare(i, 5, "heado"))
        {
            int j = i + 49;
            for (; headName.empty() || ('a' <= content[j] && content[j] <= 'z'); ++j)
                headName += content[j];
            for (; headSurname.empty() || ('a' <= content[j] && content[j] <= 'z'); ++j)
                headSurname += content[j];
            i = j;
        }
    }
}
 
void readFrom(const std::string& fileName)
{
    if (getExtension(fileName) != "txt")
    {
        std::cout << "\nSorry, program doesn't work with " << getExtension(fileName) << " expansion.\n";
        return;
    }
 
    auto buffer = getContent(fileName);
    buffer = filterContent(buffer);
 
    department depFromFile;
    int sectrosFromFile = 0;
    double salFromFile = 0.0;
    std::string nam, surnam;
 
    parseContent(buffer, depFromFile, sectrosFromFile, salFromFile, nam, surnam);
 
    std::cout << "File \"" << fileName << "\" stores data about " << depFromFile << " , which has " << sectrosFromFile << " sector(s).\n";
    std::cout << "The head of department is " << nam << " " << surnam;
    std::cout << "\nThe summary of salaries in this department is " << salFromFile << " UAH" << std::endl;
}
Но парсинг содержимого файла - ад. Я бы вычитал файл в виде списка строк, отбросив строки без данных (типа "-----" и пустых строк). И потом уже построчно искал бы нужные данные:
C++
1
2
if (line.find("The head of the department:") != std::string::npos)
    // выпарсить из следующей строки имя и фамилию
1
Tranquilllity
0 / 15 / 1
Регистрация: 29.05.2015
Сообщений: 59
Завершенные тесты: 1
24.12.2017, 02:14  [ТС] 4
Fyret,
В коде, конечно, множество того, с чем раньше не приходилось сталкиваться, но разобраться будет достаточно познавательно.
Огромное спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2017, 02:14

Есть ли в С++ функция для считывания информации с файла с подробной настройкой?
Есть ли в С++ функция для считывания информации с файла с подробной...

По поводу считывания из html файла данных
Точнее вопрос не в самом считывании, а в том как этот файл достать из браузера?...

Реализовать функцию считывания данных массива с файла
Добрый вечер. Замотали меня на паре. Нужно переделать код... #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru