С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116

Чтение текстового файла и его данных в разные переменные

04.09.2014, 08:59. Показов 2900. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
не работал еще с файлами в плюсах, только в чистом си... никак не соображу как считать данные из файла, вот например такой файл

Кликните здесь для просмотра всего текста
town=Москва
population=11500000
latitude=55,45,07
longitude=37,36,56
transport=метро,автобусы,трамваи

town=Санкт-Петербург
population=4880000
latitude=59,53,39
longitude=30,15,51
transport=метро,трамваи,тролейбусы

town=Пенза
population=517311
latitude=53,11,39
longitude=45,00,00
transport=автобусы,тролейбусы

соответственно надо считывать только параметры и те что через запятую в разные переменные

ну вот как бы начало, а что дальше хз...
C++
1
2
3
4
5
bool Input()
{
    ifstream stream(filename);
    if (stream.bad()) return false;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2014, 08:59
Ответы с готовыми решениями:

Чтение текстового файла. Парсинг его данных. Создание исключений для данных. Запись свойств объектов в файл
Проблема такая. Есть файл data.txt. В нем например какие-то данные. Landon Donovan, 150, A Hulk Hogan , 100, M Duke Nukem, 50,...

Чтение текста из файла и запись его частей в переменные
Здравствуйте, задача такая - у меня есть текстовой документ, в который записаны фраза и ответ на эту фразу через разделитель - | ...

Чтение текста из файла и запись его частей в переменные
Всем привет. Столкнулся с проблемой переноса ключей расшифровки. Одна программа генерирует ключи, записывает их в таком виде: 3|2|3 (могу...

35
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
04.09.2014, 11:10
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от GetHelp Посмотреть сообщение
нет у меня никакого UB тут
Имеется в виду, что функция
C++
1
2
3
4
5
bool Input()
{
    ifstream stream(filename);
    if (stream.bad()) return false;
}
должна, просто обязана вернуть значение. И это значение должно быть или true, или false. Если выполнится условие if (stream.bad()), то функция вернет false. А если не выполнится? Функция вернет что? Функция вернет UB. И UB это будет убивать людей, если эта функция попадет в соответствующий код. Начнутся войны, голод и второй приход христа. А вы говорите "ой, да нет тут никакого UB".

Цитата Сообщение от GetHelp Посмотреть сообщение
подскажите как мне этот чертов файл считать
К примеру вот так:
Считывание из файла строк с getline()

Как считать файл до конца вместе '\n' ?
Как считать файл и обработать содержимое
Как считать файл с табличкой?

Не по теме:

P.S. Как вы пришли именно к этому прилагательному?

1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
04.09.2014, 11:14  [ТС]
0x10, спасибо, это то что нужно, осталось придумать для остальных случаев считывание и проверку если строка пустая (это как разделитель у меня просто)

Добавлено через 1 минуту
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Имеется в виду, что функция
Код C++
C++
1
2
3
4
5
bool Input()
{
     ifstream stream(filename);
     if (stream.bad()) return false;
}
должна, просто обязана вернуть значение. И это значение должно быть или true, или false. Если выполнится условие if (stream.bad()), то функция вернет false. А если не выполнится? Функция вернет что? Функция вернет UB. И UB это будет убивать людей, если эта функция попадет в соответствующий код. Начнутся войны, голод и второй приход христа. А вы говорите "ой, да нет тут никакого UB".
да я просто еще не дописал функцию, че вы гоните, я бы в конце дописал return true и все...
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
04.09.2014, 11:17
DrOffset, из моего опыта при указании что ф-ция что то возвращает, и не сделать return падало 100%(gcc)
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
04.09.2014, 11:17
Цитата Сообщение от GetHelp Посмотреть сообщение
я бы в конце дописал return true и все
"А ты налей и отойди."
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
04.09.2014, 11:20
Сорри, что-то я туплю:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <cstring>
 
int main() {
    // Допустим, строку уже получили
    const char* population = "population=11500000";
    
    int value = 0;
    sscanf(population, "population=%d", &value);
    std::cout << value << std::endl;
}
Но все равно надо сначала найти разделитель (=), затем по левой части определить какой формат значения в правой части.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
04.09.2014, 11:27  [ТС]
так возник еще организационный вопрос... для тех кто не в теме я писал класс тема тут, по совету стал писать загрузку из файла, тут возникли вот эти собственно трудности, так вот вопрос в том, что по идее метод Input должен был только заполнять один экземпляр класса из потока, а если я буду читать таким образом из файла, то это будет несколько скажем так вариантов данных... т.е. как тут быть то? если только делать несколько файлов, в каждом данные только по одному городу...
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.09.2014, 11:33
Цитата Сообщение от GetHelp Посмотреть сообщение
т.е. как тут быть то?
Как быть с чем? Если нужно заплонять несколько объект, хранишь их в контйнере - заполняешь. Можешь из одного файла, можешь из нескольких. Вопрос-то в чем?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
04.09.2014, 11:34
GetHelp, именно поэтому я говорил, что плохая идея - писать один мега-класс, который умеет все на свете. Т.е. если хочется в одном файле хранить несколько проектов, то нужен отдельный класс - парсер, который будет обрабатывать входной поток и понимать, сколько и каких объектов класса нужно создать.
Тут я бы предложил забить и считать, что в одном файле может быть только один регион. В качестве входных данных может быть директория с кучей таких файлов. И в любом случае будет функция вне класса, которая обходит этот каталог и на каждый файл создает объект региона.
1
04.09.2014, 12:41

Не по теме:

Цитата Сообщение от aLarman Посмотреть сообщение
DrOffset, из моего опыта при указании что ф-ция что то возвращает, и не сделать return падало 100%(gcc)
Зависит от того, что возвращаем. Если объект, то да, может упасть. А если целое число, то он просто возьмет из eax какой-то мусор и все будет "нормально".

0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
04.09.2014, 14:04
Вот тут я пытался решить похожую задачу. Вам ещё наверняка пригодятся методы из заголовочного файла <cctype>, чтобы выполнять проверки символов в файле.

Добавлено через 2 минуты
В Вашем варианте задачи я бы сделал что-нибудь навроде
C++
1
2
3
4
5
6
7
8
9
10
struct City
{
    std::string town;
    int population;
    std::vector <int> latitude;
    std::vector <int> longitude;
    std::vector <std::string> transport;
};
 
std::vector <City> cities();  // создаём массив cities структур типа City
Добавлено через 7 минут
И потом уже читал бы из файла символ за символом, проверяя каждый, до тех пор, пока не достигнуто соответствующее условие (ch == ',' или ch == '\n', или ch == '='). Ну а дальше, когда условие достигнуто, пихал бы всё по соответствующим полям структуры (ну, или класса, если надумаете в виде класса оформить).
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
04.09.2014, 14:32
Цитата Сообщение от gru74ik Посмотреть сообщение
std::vector <City> cities(); *// создаём массив cities структур типа City
А может объявляем функцию, которая не принимает аргументов и возвращает вектор городов?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
04.09.2014, 14:36
Цитата Сообщение от 0x10 Посмотреть сообщение
А может объявляем функцию, которая не принимает аргументов и возвращает вектор городов?
А зачем? В смысле, я так подозреваю, что это наверное действительно лучше (Вы плохое предлагать скорее всего не станете), но почему Ваш вариант лучше?
P.S. Посидел, подумал. Наверное Вы хотите заполнение полей структуры в эту функцию вынести?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
04.09.2014, 14:40
Цитата Сообщение от gru74ik Посмотреть сообщение
А зачем?
Я о том, что синтаксически эта запись - не определение объекта, а то, что я написал выше. Нужно убрать круглые скобки.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
04.09.2014, 14:45
Цитата Сообщение от 0x10 Посмотреть сообщение
Нужно убрать круглые скобки.
Ааа, понял. Да, точно:
C++
1
std::vector <City> cities;  // создаём массив cities структур типа City
0
04.09.2014, 15:02

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
и все будет "нормально"
разделено на ноль.

0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
05.09.2014, 11:55
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
/////////////////////////////////////////////////////////////////////////////////////////
//считать данные из файла, вот например такой файл
//
//town=Москва
//population=11500000
//latitude=55,45,07
//longitude=37,36,56
//transport=метро,автобусы,трамваи
//
//town=Санкт-Петербург
//population=4880000
//latitude=59,53,39
//longitude=30,15,51
//transport=метро,трамваи,троллейбусы
//
//town=Пенза
//population=517311
//latitude=53,11,39
//longitude=45,00,00
//transport=автобусы,троллейбусы
//
//соответственно надо считывать только параметры и те что через запятую в разные переменные
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <locale>
#include <sstream>
#include <string>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string             T_str;
typedef std::vector < T_str >   T_strings;
typedef std::vector < int   >   T_geo_coord;
/////////////////////////////////////////////////////////////////////////////////////////
struct  T_city
{
    //-----------------------------------------------------------------------------------
    static  const   char    SPACE_SYMB  =   ' ';
    static  const   char    EQ_SYMB     =   '=';
 
    T_str                   name_;
    int                     population_;
    T_geo_coord             latitude_;
    T_geo_coord             longitude_;
    T_strings               transport_modes_;
    //-----------------------------------------------------------------------------------
    friend  std::istream    &   operator>>
        (
            std::istream    &   istr,
            T_city          &   city
        )
    {
        read_official_word_and_eq_symb_from_stream                  ( istr );
        read_line_of_stream_in_val                                  ( istr,     city.name_              );
 
        read_official_word_and_eq_symb_from_stream                  ( istr );
        read_line_of_stream_in_val                                  ( istr,     city.population_        );
 
        read_official_word_and_eq_symb_from_stream                  ( istr );
        read_line_of_stream_with_punctuation_delimiters_in_vector   ( istr,     city.latitude_          );
 
        read_official_word_and_eq_symb_from_stream                  ( istr );
        read_line_of_stream_with_punctuation_delimiters_in_vector   ( istr,     city.longitude_         );
 
        read_official_word_and_eq_symb_from_stream                  ( istr );
        read_line_of_stream_with_punctuation_delimiters_in_vector   ( istr,     city.transport_modes_   );
 
        return  istr;
    }
    //-----------------------------------------------------------------------------------
    static  void    read_official_word_and_eq_symb_from_stream( std::istream    &   istr )
    {
        getline
            (
                istr,
                T_str(),
                EQ_SYMB
            );
    }
    //-----------------------------------------------------------------------------------
    template< typename  T >
    static  void    read_line_of_stream_in_val
        (
            std::istream    &   istr,
            T               &   val
        )
    {
        T_str               s;
        getline                     ( istr, s );
        std::istringstream  ssin    (s);
        ssin    >>  val;
    }
    //-----------------------------------------------------------------------------------
    template< typename  TT_vector >
    static  void    read_line_of_stream_with_punctuation_delimiters_in_vector
        (
            std::istream    &   istr,
            TT_vector       &   vector
        )
    {
        vector.clear();
        T_str   s;
        getline                             ( istr, s );
        replace_punctuation_with_spaces     (s);
        std::istringstream  ssin            (s);
 
        std::copy
            (
                std::istream_iterator< TT_vector::value_type >  ( ssin      ),
                std::istream_iterator< TT_vector::value_type >  (),
                std::back_inserter                              ( vector    )
            );
    }
    //-----------------------------------------------------------------------------------
    static  void    replace_punctuation_with_spaces( T_str  &   s )
    {
        std::replace_if
            (
                s.begin     (),
                s.end       (),
 
                []  ( char  c )
                {
                    return  std::ispunct
                                (
                                    c,
                                    std::locale("")
                                );
                },
                SPACE_SYMB
            );
    }
    //-----------------------------------------------------------------------------------
    friend  std::ostream    &   operator<<
        (
            std::ostream            &   ostr,
            T_city          const   &   city
        )
    {
        ostr    <<  city.name_          <<  std::endl
                <<  city.population_    <<  std::endl;
 
        write_in_ostream_vector( ostr,  city.latitude_          );
        write_in_ostream_vector( ostr,  city.longitude_         );
        write_in_ostream_vector( ostr,  city.transport_modes_   );
        ostr    <<  std::endl;
        return  ostr;
    }
    //-----------------------------------------------------------------------------------
    template< typename  TT_vector >
    static  void    write_in_ostream_vector
        (
            std::ostream            &   ostr,
            TT_vector       const   &   vector
        )
    {
        std::copy
            (
                vector.begin                                    (),
                vector.end                                      (),
                std::ostream_iterator< TT_vector::value_type >  ( ostr, " " )
            );
 
        ostr    <<  std::endl;
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::vector < T_city    >   T_cities;
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    const   T_str   TOWNS_FILE_NAME   =   "cities.txt";
    std::ifstream   ifile( TOWNS_FILE_NAME );
 
    if( !ifile )
    {
        std::cout   <<  "Файл \""
                    <<  TOWNS_FILE_NAME
                    <<  "\" не найден."
                    <<  std::endl;
    }//if
 
    T_cities    cities;
 
    std::copy
        (
            std::istream_iterator< T_city >     ( ifile     ),
            std::istream_iterator< T_city >     (),
            std::back_inserter                  ( cities    )
        );
 
    std::cout   <<  "Из файла \""
                    <<  TOWNS_FILE_NAME
                    <<  "\" считана информация о "
                    <<  cities.size()
                    <<  " городах:"
                    <<  std::endl
                    <<  std::endl;
 
    std::copy
        (
            cities.begin                        (),
            cities.end                          (),
            std::ostream_iterator< T_city >     ( std::cout )
        );
 
    system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.09.2014, 11:55
Помогаю со студенческими работами здесь

Чтение из файла и занос данных в переменные
Здравствуйте! При чтении из файла числовых данных столкнулся с проблемой, что значения не правильно добавляются в переменные. Вот...

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла.
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt; using namespace std; struct...

Создание текстового файла, чтение и вывод его содержимого на экран
Помогите, пожалуйста разобраться. В учебнике нашла пример, программа должна создавать указанный файл, записывать в него строку-путь к...

Чтение данных с текстового файла
Всем привет. Простите, если спрашиваю очевидное, но я не могу понять, как мне считать переменную с N-ой строки в паскале, например со...

Чтение данных из текстового файла
Всем большой привет! Люди помогите с таким вопросом! У меня есть текстовый файл, Мне нужно что бы с файла каждое определеной слово...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru