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

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

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

Добрый день, имеется текстовый файл такого вида:
fgfd
32
cxv
http://www.cyberforum.ru/cpp-beginners/thread1278997.html
54
43
hmgg
65
54
23

Мне нужно считать каждый объект из файла и записать в двунаправленный список.
Сам список состоит из наследованых объектов. Базовый класс имеет два поля, остальные 4,5,6 соответственно. Мне надо как-то различать количество полей во время чтения из файла. Записать их в переменные не проблема, а вот считать правильно проблемно. Пробовал считывать с условием, пока след строка не число, но это не помогло
Помогите пожалуйста это реализовать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2012, 17:50
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Считать объекты из файла разных типов (C++):

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

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

Зачем нужно возвращать ссылку на объекты потоковых типов?
В книжке Герберта Шилдта четко и ясно указано, что для того, чтобы перегружать...

Распределение памяти под объекты числовых типов. Не могу понять
Может быть немного не в тему пишу, т.к. этот вопрос не относится конкретно к...

Сложить объекты двух разных классов
Здравствуйте, при изучении программирования всплыл такой вопрос. Без объявления...

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

Добавлено через 6 минут
Цитата Сообщение от I.M. Посмотреть сообщение
Считывать очередное значение в строку и проверять, является оно числом или нет
Пробовал так делать через функцию isdigit() со счетчиком: если число, то ++.
Как после этого тогда считывать?
По новой открывать файл и считывать до появления новой строки?
0
alsav22
5438 / 4833 / 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
whh
0 / 0 / 0
Регистрация: 28.11.2012
Сообщений: 6
28.11.2012, 19:18  [ТС] #10
alsav22, спасибо огромное, все работает
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.11.2012, 19:39 #11
Одно условие: для правильной работы этого кода, строка не должна начинаться с цифры.
1
28.11.2012, 19:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2012, 19:39
Привет! Вот еще темы с решениями:

Сложение разных типов
У меня из файла в переменную int считывется число.. Мне нужно занести в...

Хранение разных типов
Приветствую всех. Возник вот такой вопрос. У меня есть, например, 3 разных...

Указатели разных типов
Добрый день уважаемые форумчане !!! Хочу уточнить для себя следующую деталь....

Матрица из разных типов
хочу создать клас Matrix елементы обьектов которого могли бы быть разных типов....


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

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

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