Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
1 / 1 / 0
Регистрация: 14.06.2022
Сообщений: 61

Почему вместо значения выводит мусор

05.07.2022, 09:06. Показов 3619. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Извиняюсь заранее за глупый вопрос) В функции ParseTable iCells вместо значения выводит мусор. Хотя в функции CountCell с этим всё хорошо. Понимаю, что это как то связано с возвращением значения, но мне нужно было по заданию выходным параметром передать. Как поправить этот момент ?



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
int CTable::ParseTable(string fName, vector<string>& shareSheet)
{
    std::map<std::string, std::string> opts;
 
    ptree tree;
    int result = 0;
    
    try
    {
        //Читаем файл
        read_xml(fName, tree);
        //Вектор , который будет хранить строки из файла
        vector<string> shareTable;
 
        const ptree& formats = tree.get_child("worksheet", empty_ptree());
        const ptree& formats2 = tree.get_child("sheetData", empty_ptree());
        
        BOOST_FOREACH(const ptree::value_type & fi, formats) 
        {
            string at = fi.first + ".<xmlattr>";
            
            if (at == "dimension.<xmlattr>" ) 
            {
                const ptree& attributes = formats.get_child(at, empty_ptree());
                BOOST_FOREACH(const ptree::value_type & v, attributes) 
                {
                    //cout<< v.second.data() << endl;
                    string dim = v.second.data();
                    int iRows;
                    int iCells;
                    Dimension(dim, iRows, iCells);
 
                    cout << iRows << endl;
                    cout << iCells << endl;
                    
                    
                }
            }
            
        }
 
    }
    //Обработка исключений
    catch (boost::property_tree::ptree_bad_path & error)
    {
        cout << "Ошибка получения поддерева" << endl;
        //result = 1;
    }
    catch (boost::property_tree::xml_parser_error & error)
    {
        cout << "Не получается открыть файл" << endl;
        //result = 2;
    }
 
    return result;
 
    
}
 
//Функция, которая раскладывает диапазон и возвращает кол-во строк и ячеек.
int Dimension(string dim, int& iRows, int &iCells)
{
    //Ищем символ ":" и делим строку на "до символа" и "после"
    auto found = dim.find(":");
    string sB = dim.substr(0, found);
    string sE = dim.substr(found + 1, dim.size() - (found + 1));
    string sBCell, sBRow, sECell, sERow;
    
    //Проверка символов первой строки (символ или число)
    for (int i = 0; i<sB.size(); i++)
    {
        isalpha(sB.at(i)) ? sBCell += sB.at(i) : sBRow += sB.at(i);
    }
 
    //Проверка символов второй строки (символ или число)
    for (int i = 0; i < sE.size(); i++)
    {
        isalpha(sE.at(i)) ? sECell += sE.at(i) : sERow += sE.at(i);
    }
 
    //Кол-во строк в формате int
    iRows = stoi(sERow);
    CountCell(sBCell, sECell);
 
    return 0;
}
//Функция для расчета количества ячеек 
int CountCell(string begCell, string endCell)
{
    //Начальная ячейка в формат int
    int b = (int)begCell.at(0);
    //Конечная ячейка в формат int
    int e = (int)endCell.at(0);
    //Вычисление разницы между последним и первым символом
    int iCells = e - b;
    return iCells;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.07.2022, 09:06
Ответы с готовыми решениями:

Почему мусор вместо чисел из файла?
Надо в объект записать числовое значение из файла. string считывает, а вместо int (setPersonnelNo(nn)), где число 777, выводит -858993460 ...

Выводит мусор, не пойму почему
Есть три объекта. Person one; Person two(&quot;Smythecraft&quot;); Person three(&quot;Dimwiddy&quot;, &quot;Sam&quot;); и методы show // имя фамилия ...

Почему выводит в конце строки мусор?
Выводит нужную строку... и мусор в конце Переменная len принимает правильное значение При входе в первый цикл new_str получает двойной...

28
1 / 1 / 0
Регистрация: 14.06.2022
Сообщений: 61
06.07.2022, 22:47  [ТС]
Студворк — интернет-сервис помощи студентам
Ну я не успеваю за время практики сделать ещё и вывод в csv , как по заданию , это доделают программисты. Мне же упростили задание , сколько успел , столько успел ) Спасибо
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
06.07.2022, 23:53
zenitsaOka, мне интересен момент: справились ли вы c выводом в консоль текста в utf8 ? И каким способом ?
Вообщем у меня, выводил в консоль, какие то непонятные символы проскакивали, (win7 в консоли мало символов из таблицы Юникода отображает).

Вывел все в файл, parsexml.exe >> out.txt из последних больших xml, все красиво, ровно
Еще лишь чуток, и получился бы csv ))

Добавлено через 2 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Еще лишь чуток, и получился бы csv ))
Хотя, это я наверное упрощаю сильно, там еще объединенные ячейки и много много всякого "бобра" в том XLS.
0
1 / 1 / 0
Регистрация: 14.06.2022
Сообщений: 61
07.07.2022, 09:42  [ТС]
Ну в своей версии - с помощью wstring и конвертации в Utf-8. Тут же надо подумать , пробовать

Добавлено через 43 минуты
И всё же придется использовать свой вариант , сказали , что разбивать по функциям - мастхэв
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.07.2022, 12:06
Цитата Сообщение от zenitsaOka Посмотреть сообщение
И всё же придется использовать свой вариант , сказали , что разбивать по функциям - мастхэв
Так а что разбить мой код, он же почти готовые функции, у меня займет это минут 10.
К тому же нет нужды в широких строках, иначе , как уже видно из твоей новой темы, будут проблемы с кодировками.
Если использовать широкие строки, то наверное нужно и ptree настраивать на работу с широкими строками.
И так далее.

У тебя исходник в UTF8, boost парсит и отдает сроки std::string, но содержимое в них, походу utf8.
Просто выведи их через ofstream.

Добавлено через 13 секунд
Цитата Сообщение от SmallEvil Посмотреть сообщение
у меня займет это минут 10.
итого меньше
0
1 / 1 / 0
Регистрация: 14.06.2022
Сообщений: 61
07.07.2022, 12:13  [ТС]
вывожу через wostream в csv , в файле кракозябры опять. И вот теперь на этом застрял)))

wofstream fileStr("D:\\testOut.csv", std::ios::out | std::ios::binary);
fileStr.imbue(std::locale(fileStr.getloc (), new std::codecvt_utf8<wchar_t>));

хотя вроде даже что-то пытался , не помогает.

Добавлено через 2 минуты
Я оставил в проекте закомменченным ваш код, если захотят , пусть делают )
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.07.2022, 12:14
Цитата Сообщение от SmallEvil Посмотреть сообщение
Просто выведи их через ofstream.
попробуй

Добавлено через 1 минуту
Цитата Сообщение от zenitsaOka Посмотреть сообщение
Я оставил в проекте закомменченным ваш код, если захотят , пусть делают )
Это не для них код, а для вас )
Никто его доделывать не будет, зуб даю, попорченный.
0
1 / 1 / 0
Регистрация: 14.06.2022
Сообщений: 61
07.07.2022, 12:23  [ТС]
Нельзя через ofstream , ведь там wstring'и вектор содержит
Мне тоже код не особо нужен, с меня его требуют, мне лишь зачет по практике. И больше к плюсам не притронусь)
Ну а если доделывать не будут, мне то что, их дело)Мне сказали лучше своё юзай, потому что я по командам руководителя всю структуру кода составлял, может ему так удобнее
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.07.2022, 16:10
Цитата Сообщение от zenitsaOka Посмотреть сообщение
ведь там wstring'и вектор содержит
Где, там ?

Добавлено через 3 часа 43 минуты
Сделал на скорую руку, когда была минутка.

Остальное ваша домашка :
- Конвертация индексов ячейки. Столбцов не больше лколичества букв атинского алфавита !!! cell_to_i
- Контролировать(преобразовывать) или нет, разделители чисел. Или использовать разделители для csv точку с запятой ;, при числах с разделителем - запятая.
- Экранирование строк, и удвоение двойных кавычек
если поле содержит запятые, переносы строк, двойные кавычки, то это поле должно быть заключено в двойные кавычки. Если этого не сделать, то данные невозможно будет корректно обработать.
символ двойной кавычки в поле должен быть удвоен.
кот

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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <vector>
#include <utility>
using string = std::string;
using std::vector; using std::pair;
using boost::property_tree::ptree;
 
class ParserXLSX{
using row_t = vector<string>;
public:
    ParserXLSX(string sheetf, string stringsf){
        m_sheetf   = sheetf;
        m_stringsf = stringsf;
        is_data = false;
    }
    bool to_CSV(string filename){
        if (is_data){
            std::ofstream fout(filename);
            if (fout.is_open()){
                for(size_t r=0; r<rows.size(); ++r){
                    if (!rows[r].empty())
                        fout << rows[r][0];
                    for(size_t c=1; c<rows[r].size(); ++c)
                        fout << ',' << rows[r][c];
                    fout << std::endl;
                }
                return true;
            }
        }
        return false;
    }
    vector<row_t>& readData(){
        if (loadStrings(m_stringsf, m_strings) && loadSheet(m_sheetf, rows))
            is_data = true;
        return rows;
    }
 
private:
    vector<string> m_strings;
    vector<row_t> rows;
    string m_sheetf, m_stringsf;
    pair<int,int> start_cell, end_cell;
    bool is_data;
    bool loadStrings(string file, vector<string>& strings){
        ptree pt;
        try{
            read_xml(m_stringsf, pt);
            for ( auto [str, end] = pt.get_child("sst").equal_range("si"); str!=end; ++str)
                strings.push_back(str->second.get<string>("t"));
        }catch(std::exception& e){
            strings.clear();
            return false;
        }
        return true;
    }
    bool loadSheet(string file, vector<row_t>& data_rows){
        ptree pt;
        try{
            read_xml(m_sheetf, pt);
            auto dimm = pt.get<string>("worksheet.dimension.<xmlattr>.ref");
            auto delim = dimm.find(':');
            start_cell = cell_to_i(dimm.substr(0, delim));
            end_cell    = cell_to_i(dimm.substr(delim+1));
            int rows = end_cell.first  - start_cell.first + 1;
            int cols = end_cell.second - start_cell.second + 1;
            data_rows.reserve(rows);
            int last_row = start_cell.first, last_col = start_cell.second;
            int curr_row, curr_col;
            row_t empty_row(cols);
            for ( auto [row, end] = pt.get_child("worksheet.sheetData").equal_range("row"); row!=end; ++row){
                curr_row = row->second.get<int>("<xmlattr>.r");
                while(last_row < curr_row - 1){
                    data_rows.emplace_back(empty_row);
                    ++last_row;
                }
 
                row_t data_row(cols);
                last_col = start_cell.second;
                for ( auto [cell, end] = row->second.equal_range("c"); cell!=end; ++cell){
                    curr_col = cell_to_i(cell->second.get<string>("<xmlattr>.r")).second;
                    string v;
                    try{
                        v = cell->second.get<string>("v");
                    }catch(...){}
                    string type;
                    // с атрибутами нужно быть внимательными, их может и не быть
                    // как в случае с типом у ячеек. поэтому я обрабатываю исключение
                    if (!v.empty()){
                        try{
                            type = cell->second.get<string>("<xmlattr>.t");
                        }catch(...){}
                        if (!type.empty()){
                            // нужна функция экранирования спец символов
                            if (type == "s") // если строковой тип
                                data_row.at(curr_col) = m_strings.at(cell->second.get<int>("v"));
                        }
                        else
                            data_row.at(curr_col) = v;
                    }
                    last_col = curr_col;
                }
                data_rows.push_back(std::move(data_row));
                last_row = curr_row;
            }
        }catch(std::exception& e){
            data_rows.clear();
            std::cout << e.what();
            return false;
        }
        return true;
    }
 
    pair<int, int> cell_to_i(const string& str){
        pair<int, int> res{0,0};
        if (str.size()>1){
            res.second = str[0] - 'A';
            res.first  = std::atoi(&str[1])-1;
        }
        return res;
    }
};
 
 
int main(){
    std::system("chcp 65001");
    ParserXLSX parser("sheet1.xml", "sharedStrings.xml");
    std::cout << "pasred lines : " << parser.readData().size() << std::endl;
    if (parser.to_CSV("table.csv")){
        std::cout << "Export to csv - success.";
    }else
        std::cout << "Export to csv - error.";
 
    return 0;
}


Добавлено через 36 секунд
Цитата Сообщение от zenitsaOka Посмотреть сообщение
И больше к плюсам не притронусь)
Это наверное хорошо )
1
1 / 1 / 0
Регистрация: 14.06.2022
Сообщений: 61
08.07.2022, 09:01  [ТС]
value = boost::locale::conv::to_utf<wchar_t>(fj. second.get<string>("v"), "UTF-8");
вот тут оно превращается в wstring, и записывается в вектор , тип данных которого <wstring>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.07.2022, 09:01

почему выводит при добавлении новой структуры какой- то мусор
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;stdio.h&gt; #include&lt; windows.h &gt; using namespace...

Программа реверса строки: почему на экран выводится мусор, вместо нужного текста?
Пишу программу реверса строки (меняет местами первый символ и последний, второй и предпоследний и т.д.). На экран выводится мусор, вместо...

Подскажите, пожалуйста, почему выводит мусор и как это исправить ? Заранее спасибо
#include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; //Дан массив целых чисел a1, ... an. Используя указатели, выяснить, какая...

Сортировка массива, вместо массива выводит мусор
Здравствуйте Уважаемые жители форума! Есть рабочий код сортируем массив выбором поиск наименьшего значения, но почему выводит какой то...

Почему выводит красные квадратики вместо Backspace?
ЛЮДИ! Помогите пожалуйста!!! Проблема: после некоторых манипуляций ламера(просьба сильно не ругать) Borland C++ 5.02 стал выводить...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru