Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/47: Рейтинг темы: голосов - 47, средняя оценка - 4.77
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152

Как записать в вектор структуру? Это вообще возможно сделать?

27.03.2015, 01:39. Показов 9082. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!
Как записать в вектор структуру? Это вообще возможно сделать?
Надо, чтоб первая строка из файла записывалась в вектор, данные типа char разделены ";" (CSV файл), сколько столбцов будет неизвестно, поэтому выбрал вектор, длинна данных в строке тоже разная, поэтому выбрал string. Так показалось проще и рациональнее, чем делать динамические массивы. Возможно, я запутался с синтаксисом, подскажите...
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
#include <iostream>
#include <fstream>
#include <ostream>
#include <vector>
#include <string> 
using namespace std;
struct elementsOfTheFirstLine
{
    string title;//для записи заголовков столбцов 
};
vector<elementsOfTheFirstLine> theFirstLineInFile;//в этот вектор нужно записать заголовки столбцов
string currentFileName;
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    currentFileName = "d:\\Temp\\test_08.12.2014.csv";
 
    int i = 0;
    char buf[27];
 
    ifstream f(currentFileName, ios::in);
    while (!f.eof())
    {
        f.getline(buf, 27, ';');
        //theFirstLineInFile.title.push_back(buf); Как тут записать buf в vector в поле структуры title?
        i = i + 1;
        cout << i << ' ' << buf << endl;
    }
    f.close();
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.03.2015, 01:39
Ответы с готовыми решениями:

как можно сделать это? если вообще возможно (не задача)
есть задача, на двумерный массив... вывел массив 5х5 с рандомными числами, нужно найти числа локального минимума, т.е. чтоб число было...

Как своими руками сделать лабораторный бп из обычного компьютерного бп? Это возможно вообще?
хочу для проверки сделать себе блок питания лабораторный . подскажите мне есть ли у кого уже такой ???

Как найти правильные числа. И возможно ли это вообще?
Дано такое условие a &gt; b b &gt; c a &lt; c Какие простые числа подходят для выполнение такого условия? Как вообще такое решить, и...

37
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
27.03.2015, 01:57
russian_pepper, а зачем вам вообще структура с единственным полем типа std::string?
0
20 / 20 / 14
Регистрация: 07.02.2015
Сообщений: 145
27.03.2015, 02:00
Нужно создать вспомогательную структуру -
C++
1
elementsOfTheFirstLine bufferStruct;
И считывать данные в bufferStruct.title, поочередно добавляя эту структуру в конец вектора.
Но, как выше уже сказали, в структуре из одного поля нет смысла.
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
27.03.2015, 02:00  [ТС]
Дальше, возможно, в структуру поля добавятся.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.03.2015, 02:10
Лучший ответ Сообщение было отмечено russian_pepper как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
struct my_struct
{
    my_struct(const std::string&_first,const std::string&_second):first(_first),second(_second){}
    std::string first,second;
};
int main()
{
    std::vector<my_struct>test;
    test.emplace_back("1234","5678");
    return 0;
}
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
27.03.2015, 02:47  [ТС]
Хорошо, а как тогда вобще без структуры сделать если только данные типа string в вектор записывать?
Вектор должен быть типа string а buf у меня типа char, как-то просто совсем должно быть, а я эту структуру придумал...
Тут никак неявное приведение типов не получится...
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
#include <iostream>
#include <fstream>
#include <ostream>
#include <vector>
#include <string> 
using namespace std;
 
vector<string> theFirstLineInFile;//в этот вектор нужно записать заголовки столбцов
string currentFileName;
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    currentFileName = "d:\\Temp\\ГАЗПРОМ ао_08.12.2014.csv";
 
    int i = 0;
    char buf[27];
 
    ifstream f(currentFileName, ios::in);
    while (!f.eof())
    {
        f.getline(buf, 27, ';');
        theFirstLineInFile.push_back(buf); 
        i = i + 1;
        cout << i << ' ' << buf << ' ' << theFirstLineInFile[i]<< endl;
    }
    f.close();
}
Добавлено через 22 минуты
DISTURB, Хорошо, а как тогда в моём случае сделать правильно без структуры? Если полей в моей структуре больше не будет? Я же не могу мой buf типа char добавлять к вектору типа string.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
27.03.2015, 02:58
Цитата Сообщение от russian_pepper Посмотреть сообщение
Я же не могу мой buf типа char добавлять к вектору типа string.
Что мешает buf сделать типа string?
0
20 / 20 / 14
Регистрация: 07.02.2015
Сообщений: 145
27.03.2015, 02:58
Цитата Сообщение от russian_pepper Посмотреть сообщение
Я же не могу мой buf типа char добавлять к вектору типа string.
А что мешает заменить
C++
1
char buf;
на
C++
1
string buf;
?
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
27.03.2015, 03:04
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
#include <iostream>
#include <fstream>
#include <ostream>
#include <vector>
#include <string> 
using namespace std;
 
vector<string> theFirstLineInFile;//в этот вектор нужно записать заголовки столбцов
string currentFileName;
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    currentFileName = "d:\\Temp\\ГАЗПРОМ ао_08.12.2014.csv";
 
    int i = 0;
    string buf;
 
    ifstream f(currentFileName, ios::in);
    while (getline(f, buf, ';'))
    {
        theFirstLineInFile.push_back(buf); 
        //i = i + 1;
        cout << i + 1 << ' ' << buf << ' ' << theFirstLineInFile[i]<< endl;
        ++i;
    }
    f.close();
}
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
27.03.2015, 03:15  [ТС]
Пробовал и куча ошибок сразу...

Добавлено через 7 минут
Не работает так...
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
27.03.2015, 03:17
Цитата Сообщение от russian_pepper Посмотреть сообщение
Не работает так...
Что и как не работает? Файл выложи.
0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
27.03.2015, 03:17  [ТС]
Спасибо, работает...
0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
28.03.2015, 13:57  [ТС]
Я прочитал тут
https://msdn.microsoft.com/ru-... x1zkx.aspx
вроде бы понял к тут работает while (getline(f, buf, ';'))
Но ведь тут buf считывается сразу до ";" как в такой цикл теперь вставить, например
C++
1
2
3
4
5
char a = symbol;
if(a == '\n')
        {
                break;
        }
мне в этот вектор надо только первую строку считать из файла...
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
28.03.2015, 15:03
Цитата Сообщение от russian_pepper Посмотреть сообщение
мне в этот вектор надо только первую строку считать из файла...
Первая строка вот так считывается (по умолчанию getline() читаете до '\n'):
C++
1
getline(f, buf);
Добавлено через 2 минуты
Тебе в вектор нужно прочитать строки, разделённые ';', из первой строки? Покажи первую строку в файле.
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
28.03.2015, 15:22
Для примера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <sstream>
...
    ifstream f(currentFileName, ios::in);
    string buf;
    getline(f, buf); // читаем первую строку в файле
    cout << buf << endl;
    stringstream s(buf); // помещаем её в строковый поток
    int i = 0;
    while (getline(s, buf, ';')) // читаем из строкового потока строки, разделённые ';'
    {
        theFirstLineInFile.push_back(buf); // помещаем их в вектор
        cout << i + 1 << ' ' << theFirstLineInFile[i]<< endl;
        ++i;
    }
    f.close();
Первая строка в файле: 12 34;56 78;910 1112
Миниатюры
Как записать в вектор структуру? Это вообще возможно сделать?  
0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
28.03.2015, 15:57  [ТС]
stringstream - это новое для меня сейчас читаю. В приведённом Вами варианте у меня подчёркивается s в 7-й строке Вашего кода и потом, соответственно getline 9-й.

Первая строка в моём файле:
ServerTime;SP;PR;SpPr;AV_INDICATOR_PLUS; AV_INDICATOR_MINUS;INDICATOR;CN;average_ CN;average_CN2;V_SEC;VolumeAverage;+-;V_DayPlus;V_DayMinus;V_DayPlusIndefinit e;V_DayMinusIndefinite;V_Day;V_DayIndefi nite;CN_Open;CN_Close;SUM_INDICATOR;WAPR ICE;TIMESEC;CONNECTIONTIME;CONDITION;BLO CK;ASSETS;SPREAD_1;SPREAD_2;SPREAD_3;SPR EAD_4;SPREAD_5;MiddlePraiceInSpredLtvel_ 1;MiddlePraiceInSpredLtvel_2;MiddlePraic eInSpredLtvel_3;MiddlePraiceInSpredLtvel _4;MiddlePraiceInSpredLtvel_5;LOTSIZE;SE C_PRICE_STEP;STEPPRICET;STEPPRICE;SC;SUM _INDICATOR_PLUS;SUM_INDICATOR_MINUS;LenF ile;n;MyProfit;StockExchangeFee;Brokerag eFee;IOplusSI;INDICATOR_OPEN
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
28.03.2015, 16:02
Лучший ответ Сообщение было отмечено russian_pepper как решение

Решение

Цитата Сообщение от russian_pepper Посмотреть сообщение
В приведённом Вами варианте у меня подчёркивается s в 7-й строке
Это сделал?
Цитата Сообщение от lss Посмотреть сообщение
#include <sstream>
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
28.03.2015, 16:35  [ТС]
Всё работает, спасибо!
После своих вопросов иногда думаю, что свои способности переоценил взявшись за C++...
0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
07.04.2015, 02:26  [ТС]
Здравствуйте!
Не могу до конца понять работу со строковым потоком. После считывания первой строки, мне нужно считывать данные из файла в векторы в соответствии с названиями столбцов в theFirstLineInFile, (первая строка файла). Я пытаюсь сделать считывание данных в соответствующие векторы перебирая значения в векторе theFirstLineInFile (лучше ничего не придумал пока). В результате нужно сделать программу, которая будет обрабатывать несколько файлов с данными, которые иногда менялись местами в столбцах. Поставить в строке 37 while (getline(f, buf, ';')); нельзя, потому, что getline считывает последние значение в строке вместе с первым значением следующей строки и символом "\n" между ними. Я сделал строковый поток s2 но, у меня примерно по 36000 строк в файлах, и я не могу для каждой строки делать строковый поток с новым названием. Снова использовать строковый поток s не получилось. Можете подсказать как это правильно сделать?
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
#include <iostream>
#include <fstream>
#include <ostream>
#include <vector>
#include <string> 
#include <sstream>
using namespace std;
 
vector<string> theFirstLineInFile;//в этот вектор нужно записать заголовки столбцов
string currentFileName;
vector<string> ServerTime;
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    currentFileName = "d:\\Temp\\ГАЗПРОМ ао_08.12.2014.csv";
 
    ifstream f(currentFileName, ios::in);
    string buf;
    getline(f, buf); // читаем первую строку в файле
    cout << buf << endl;
    stringstream s(buf); // помещаем её в строковый поток
    int i = 0;
    while (getline(s, buf, ';')) // читаем из строкового потока строки, разделённые ';'
    {
        theFirstLineInFile.push_back(buf); // помещаем их в вектор
        cout << i  << ' ' << theFirstLineInFile[i] << endl;
        ++i;
    }
 
    getline(f, buf); // читаем вторую строку в файле
    cout << buf << endl;
    stringstream s2(buf); // помещаем её в строковый поток
    i = 0;
    int ii = 0;//для перебора элементов в векторе theFirstLineInFile
    while (getline(s2, buf, ';')) // читаем из строкового потока строки, разделённые ';'
        //  while (getline(f, buf, ';'))
    {
        if (theFirstLineInFile[ii] == "ServerTime")
        {
            //запись в свой вектор и так все... если нет заголовка в theFirstLineInFile, считать значение в поток и никуда не записывать
            cout << i << ' ' << ii << ' ' << ServerTime.size() << ' ' << buf << endl;
            ServerTime.push_back(buf);
        }
        i++;
        ii++;
        if (ii > (theFirstLineInFile.size() - 2))
        {
            ii = 0;
        }
    }
    f.close();
}
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
07.04.2015, 02:44
Цитата Сообщение от russian_pepper Посмотреть сообщение
Снова использовать строковый поток s не получилось. Можете подсказать как это правильно сделать?
Если всё считано из него, то:
C++
1
s.clear();
Добавлено через 2 минуты
Если что-то осталось в потоке и нужно очистить, то:
C++
1
s.str("");
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.04.2015, 02:44
Помогаю со студенческими работами здесь

Нужно расшифровать, если это вообще как-то возможно
yadi.sk/i/7/3/100000,(big)9/1/010,9/5/1000000,(big)7/5/100,_,7/3/100000,(big)1/3/00100000000,9/5/1000000,2/4/000100,(big)2/3/000100,6/1/0000...

Кто может это переработать для андроида? И вообще это возможно?
програма на CLI (windows form)

Как указать счетчику с какого номера продолжать считать записи и возможно ли это вообще ?
Существует некая таблица 'Журнал учета счетов-фактур' с набором записей, каждая запись (строка) была пронумерована поле '№ СЧ-фактуры',...

Как загрузить файл формата .PLT в C++ И возможно ли это вообще, что бы с++ запускал программу?
Для начала пишу программу, что бы она мне создала точки для будущго графика использую при этом 2 функции, при этом еще ищу тройную...

как вообще это сделать?
проверить можно ли в пятеричную запись числа х вставить цифру 4 так чтобы оно стало степенью 2?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru