Форум программистов, компьютерный форум CyberForum.ru

ifsream + разномастные данные полей структуры - C++

Восстановить пароль Регистрация
 
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
03.06.2013, 23:40     ifsream + разномастные данные полей структуры #1
9е задание из 6й главы Прата
Никак не могу заставить сожрать данные(инты и стринги) из файла
Выдает несоответствие типов. Это в цикле фор на 43 строке.

P.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
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
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
const char Size = 100;
 
struct association
{
    string name;
    double donation;
};
/////////////////////////////////////////////////
int main()
{
    system("chcp 1251 > nul");
 
    int number, count = 0;
    char file_name[Size];
    ifstream inFile;
 
    cout << "Пожалуйста введите название файла: ";
    cin.getline(file_name, Size);
    inFile.open(file_name);
    if (!inFile.is_open())
    {
        cout << "Файл " << file_name << " отсутствует!" << endl;
        exit(EXIT_FAILURE);
    }
 
    while (inFile.good())
    {
        ++count;
        inFile >> number;
        break;
    }
    association *spip = new association[number];
    while (inFile.good())
    {
        ++count;
        for (int j = 0; j < number; ++j)
        {
            inFile >> spip[j].name;
            inFile >> spip[j].donation;
        }
        break;
    }
 
    if (inFile.eof())
        cout << "Достигнут конец файла." << endl;
    else if (inFile.fail())
        cout << "Ввод прекращен из-за несоответствия типа данных!" << endl;
    else
        cout << "Ввод прекращен по неизвестной причине!" << endl;
    if (count == 0)
        cout << "Данные для обработки отсутствуют!" << endl;
    else
    {
        int lask = 0;
        if (number != 0)
        {
            cout << endl << "Великие Покровители: " << endl;
            for (int j = 0; j < number; ++j)
            {
                if (spip[j].donation >= 10000)
                    cout << "Меценат: " << spip[j].name << " внес: " << spip[j].donation << endl;
                else
                    ++lask;
                if (lask == number)
                    cout << "Отсутствуют." << endl;
            }
 
            lask = 0;
            cout << endl << "Покровители: " << endl;
            for (int j = 0; j < number; ++j)
            {
                if (spip[j].donation < 10000)
                    cout << "Меценат: " << spip[j].name << " внес: " << spip[j].donation << endl;
                else
                    ++lask;
                if (lask == number)
                    cout << "Отсутствуют." << endl;
            }
        }
        else
            cout << "Нет информации." << endl;
    }
    inFile.close();
    inFile.clear();
    delete [] spip;
 
    system("pause");
    return 0;
}
Текстовой файл выглядит так:
4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.06.2013, 23:41     ifsream + разномастные данные полей структуры #2
C++
1
getline(inFile. spip[j].name);
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
03.06.2013, 23:45  [ТС]     ifsream + разномастные данные полей структуры #3
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
getline(inFile. spip[j].name);
Когда отлаживал, заметил, что inFile почему-то не жрет стринг целиком, считает пробел за конец строки. Решил применить getline, но заругался компилятор. И я откатил все назад т.е. без гетлайн.
Но если сделать, как Вы предложили, то:
Миниатюры
ifsream + разномастные данные полей структуры  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.06.2013, 23:53     ifsream + разномастные данные полей структуры #4
Там у меня точка вместо нужной запятой, после первого параметра. Исправьте.

Добавлено через 3 минуты
Цитата Сообщение от FliXis Посмотреть сообщение
Решил применить getline
Тот getline, который вы хотели применить (из класса istream) не читает в string, ему нужен массив char. Поэтому нужно использовать глобальный getline.
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
04.06.2013, 00:14  [ТС]     ifsream + разномастные данные полей структуры #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Там у меня точка вместо нужной запятой, после первого параметра. Исправьте.

Добавлено через 3 минуты

Тот getline, который вы хотели применить (из класса istream) не читает в string, ему нужен массив char. Поэтому нужно использовать глобальный getline.
Про запятую я как-то не подумал, действительно, с ней теперь не ругается.
Но данные в стринг все равно отказываются записываться. Если даже сделать фаил таким:
4
Sam
2000
Freida
100500
Tammy
5000
Rich
55000
То ничего не изменяется + начинают тупить данные инта. т.е. несоответствие типа данных

Добавлено через 14 минут
Раньше читал такой файл
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 00:15     ifsream + разномастные данные полей структуры #6
У вас этот цикл что делает?
C++
1
2
3
4
5
6
while (inFile.good())
    {
        ++count;
        inFile >> number;
        break;
    }
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
04.06.2013, 00:39  [ТС]     ifsream + разномастные данные полей структуры #7
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас этот цикл что делает?
C++
1
2
3
4
5
6
while (inFile.good())
    {
        ++count;
        inFile >> number;
        break;
    }
Жрет четверку из файла. А она потом идет в association *spip = new association[number]; т.к. в следующем цикле идет фор с записью в поля структуры.
Не придумал ничего лучше, как сделать отдельный блок.)
P.S> жрет он ее отменно и задуманное удалось, а вот со следующим блоком из-за того, что не смотря на стринг, он считает пробел за конец строки, получилась запара.

Добавлено через 22 минуты
С чарами тоже несоответствие типов. Сразу конец строки вписывает в себя
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
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
const char Size = 100;
 
struct association
{
    char name[Size];
    double donation;
};
/////////////////////////////////////////////////
int main()
{
    system("chcp 1251 > nul");
 
    int number, count = 0;
    char file_name[Size];
    ifstream inFile;
 
    cout << "Пожалуйста введите название файла: ";
    cin.getline(file_name, Size);
    inFile.open(file_name);
    if (!inFile.is_open())
    {
        cout << "Файл " << file_name << " отсутствует!" << endl;
        exit(EXIT_FAILURE);
    }
 
    while (inFile.good())
    {
        ++count;
        inFile >> number;
        break;
    }
    association *spip = new association[number];
    while (inFile.good())
    {
        ++count;
        for (int j = 0; j < number; ++j)
        {
            inFile.getline(spip[j].name, Size);
            //inFile >> spip[j].name;
            inFile >> spip[j].donation;
        }
        break;
    }
 
    if (inFile.eof())
        cout << "Достигнут конец файла." << endl;
    else if (inFile.fail())
        cout << "Ввод прекращен из-за несоответствия типа данных!" << endl;
    else
        cout << "Ввод прекращен по неизвестной причине!" << endl;
    if (count == 0)
        cout << "Данные для обработки отсутствуют!" << endl;
    else
    {
        int lask = 0;
        if (number != 0)
        {
            cout << endl << "Великие Покровители: " << endl;
            for (int j = 0; j < number; ++j)
            {
                if (spip[j].donation >= 10000)
                    cout << "Меценат: " << spip[j].name << " внес: " << spip[j].donation << endl;
                else
                    ++lask;
                if (lask == number)
                    cout << "Отсутствуют." << endl;
            }
 
            lask = 0;
            cout << endl << "Покровители: " << endl;
            for (int j = 0; j < number; ++j)
            {
                if (spip[j].donation < 10000)
                    cout << "Меценат: " << spip[j].name << " внес: " << spip[j].donation << endl;
                else
                    ++lask;
                if (lask == number)
                    cout << "Отсутствуют." << endl;
            }
        }
        else
            cout << "Нет информации." << endl;
    }
    inFile.close();
    inFile.clear();
    delete [] spip;
 
    system("pause");
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 00:45     ifsream + разномастные данные полей структуры #8
Вот так, вроде бы, работает (содержимое файла из 1 поста):
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
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
const char Size = 100;
 
struct association
{
    string name;
    double donation;
};
/////////////////////////////////////////////////
int main()
{
   // system("chcp 1251 > nul");
    setlocale(0, "");
 
    int number, count = 0;
    char file_name[Size];
    ifstream inFile;
 
    cout << "Пожалуйста введите название файла: ";
    cin.getline(file_name, Size);
    inFile.open(file_name);
    if (!inFile.is_open())
    {
        cout << "Файл " << file_name << " отсутствует!" << endl;
        exit(EXIT_FAILURE);
    }
    
    while (inFile.good())
    {
        ++count;
        inFile >> number;
        inFile.get();
        break;
    }
    
    association *spip = new association[number];
    while (inFile.good())
    {
        ++count;
        for (int j = 0; j < number; ++j)
        {
            getline(inFile, spip[j].name);
            inFile >> spip[j].donation;
            inFile.get();
        }
        break;
    }
 
    if (inFile.eof())
        cout << "Достигнут конец файла." << endl;
    else if (inFile.fail())
        cout << "Ввод прекращен из-за несоответствия типа данных!" << endl;
    else
        cout << "Ввод прекращен по неизвестной причине!" << endl;
    if (count == 0)
        cout << "Данные для обработки отсутствуют!" << endl;
    else
    {
        int lask = 0;
        if (number != 0)
        {
            cout << endl << "Великие Покровители: " << endl;
            for (int j = 0; j < number; ++j)
            {
                if (spip[j].donation >= 10000)
                    cout << "Меценат: " << spip[j].name << " внес: " << spip[j].donation << endl;
                else
                    ++lask;
                if (lask == number)
                    cout << "Отсутствуют." << endl;
            }
 
            lask = 0;
            cout << endl << "Покровители: " << endl;
            for (int j = 0; j < number; ++j)
            {
                if (spip[j].donation < 10000)
                    cout << "Меценат: " << spip[j].name << " внес: " << spip[j].donation << endl;
                else
                    ++lask;
                if (lask == number)
                    cout << "Отсутствуют." << endl;
            }
        }
        else
            cout << "Нет информации." << endl;
    }
    inFile.close();
    inFile.clear();
    delete [] spip;
 
    system("pause");
    return 0;
}
Миниатюры
ifsream + разномастные данные полей структуры  
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 155
04.06.2013, 00:51  [ТС]     ifsream + разномастные данные полей структуры #9
inFile.get() чтобы отбросить \0 после ввода! Ну все я забыл блин)
Благодарю!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.06.2013, 01:02     ifsream + разномастные данные полей структуры #10
Цитата Сообщение от FliXis Посмотреть сообщение
чтобы отбросить \0 после ввода!
'\n'
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2013, 01:41     ifsream + разномастные данные полей структуры
Еще ссылки по теме:

Заполнение полей структуры C++
C++ Расположение полей структуры в памяти

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

Или воспользуйтесь поиском по форуму:
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
04.06.2013, 01:41     ifsream + разномастные данные полей структуры #11
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
struct member
{
    string name;
    int val;
};
 
int main()
{
    ifstream data("data.txt");
    member m[4];
    int i = 0;
    while ( getline(data, m[i].name) ) {
        data >> m[i].val;
        cout << "Name:\t" << m[i].name
             << "\nVal:\t" << m[i].val << endl;
        data.get();
        ++i;
    }
    data.close();
    return 0;
}
Вывод:
Name: Sam Stone
Val: 2000
Name: Freida Flass
Val: 100500
Name: Tammy Tubbs
Val: 5000
Name: Rich Raptor
Val: 55000
Yandex
Объявления
04.06.2013, 01:41     ifsream + разномастные данные полей структуры
Ответ Создать тему
Опции темы

Текущее время: 17:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru