Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 6
1

Считать объекты из файла разных типов

28.11.2012, 17:50. Просмотров 1514. Ответов 10
Метки нет (Все метки)


Добрый день, имеется текстовый файл такого вида:
fgfd
32
cxv
54
43
hmgg
65
54
23

Мне нужно считать каждый объект из файла и записать в двунаправленный список.
Сам список состоит из наследованых объектов. Базовый класс имеет два поля, остальные 4,5,6 соответственно. Мне надо как-то различать количество полей во время чтения из файла. Записать их в переменные не проблема, а вот считать правильно проблемно. Пробовал считывать с условием, пока след строка не число, но это не помогло
Помогите пожалуйста это реализовать
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2012, 17:50
Ответы с готовыми решениями:

Массив указателей на объекты разных типов
Здравствуйте. К примеру, есть такая конструкция (приведена часть кода) // --- enum MyClasses ...

Объекты разных типов в одном контейнере и c++ 11 auto
Собственно дабы упростить себе жизнь, решил использовать auto но столкнулся с траблом... class...

ArrayList объекты разных типов
Здравствуйте.Подскажите пожалуйста. Такой вопрос куда запихнуть объекты разных типов (шаблон ...

Функция, которая принимает и возвращает объекты разных типов
Для пересылки данных между сервером и клиентом использую отдельные классы, которые практически...

10
570 / 553 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
28.11.2012, 18:01 2
whh, оставляйте в файле пометку, к какому типу данных относится следующий набор значений
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 6
28.11.2012, 18:14  [ТС] 3
А без пометки никак? Нельзя сделать так что бы программа сама определяла этот тип данных?
0
570 / 553 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
28.11.2012, 18:20 4
Разве что считать количество чисел между двумя строками и на ходу решать, что за объект создавать.
Но проблему начнутся, как только появится несколько наследников с одинаковым количеством полей
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 6
28.11.2012, 18:24  [ТС] 5
Можете привести пример как считать?
У меня была такая идея, но реализовать у меня ее не вышло..
0
5479 / 4874 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.11.2012, 18:28 6
Первое поле строка?
0
570 / 553 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
28.11.2012, 18:28 7
Считывать очередное значение в строку и проверять, является оно числом или нет
0
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 6
28.11.2012, 18:39  [ТС] 8
Цитата Сообщение от alsav22 Посмотреть сообщение
Первое поле строка?
Да, первое поле строка

Добавлено через 6 минут
Цитата Сообщение от I.M. Посмотреть сообщение
Считывать очередное значение в строку и проверять, является оно числом или нет
Пробовал так делать через функцию isdigit() со счетчиком: если число, то ++.
Как после этого тогда считывать?
По новой открывать файл и считывать до появления новой строки?
0
5479 / 4874 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.11.2012, 19:00 9
Как пример. В отладке посмотрел - работает правильно. В файле:
fgfd
32
cxv
54
43
hmgg
65
54
23

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
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
 
class A
{
 public:
  string str;
  int x;
};
 
class B
{
 public:
  string str;
  int x;
  int y;
};
 
class D
{
 public:
  string str;
  int x;
  int y;
  int z;
};
 
 
int main()
{
  
  ifstream f("1.txt");
  
  while (true)
  {
    string temp;
    f >> temp;
    
    if (f.eof()) break;
    
    streamoff i = f.tellg();
    
    int n;
    int c = 0;
    while (f >> n)
        c++;
    f.clear();
    f.seekg(i, ios::beg);
    
    if (c == 1)
    {
        A a;
        a.str = temp;
        f >> a.x;
    }
    if (c == 2)
    {
        B b;
        b.str = temp;
        f >> b.x;
        f >> b.y;
    }
    if (c == 3)
    {
        D d;
        d.str = temp;
        f >> d.x;
        f >> d.y;
        f >> d.z;
    }
  }
  
    
  system("pause");
  return(0);
}
1
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 6
28.11.2012, 19:18  [ТС] 10
alsav22, спасибо огромное, все работает
0
5479 / 4874 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.11.2012, 19:39 11
Одно условие: для правильной работы этого кода, строка не должна начинаться с цифры.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2012, 19:39

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Создать массивы разных типов(3 типов), вывести их на экран
Создать массивы разных типов(3 типов), вывести их на экран.

Аналоги типов объекты COM
Добрый день. В общем есть необходимость подцепить COM-объект. Для удобства пользовался...

Объекты и приведение типов
Добрый день. Я написал класс, на подобии std::string, только для типа wchar_t. Вот сам класс:...

объекты двух типов SymbString и DecString
Написать программу, демонстрирующую работу с объектами двух типов: SymbString(символьная строка) и...


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

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

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