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

Чтение из файла в массив - C++

Восстановить пароль Регистрация
 
iceglen
 Аватар для iceglen
24 / 24 / 2
Регистрация: 24.06.2013
Сообщений: 105
28.09.2013, 22:34     Чтение из файла в массив #1
Задача №6
Кликните здесь для просмотра всего текста
Постройте программу, которая отслеживает пожертвования в Общество Защиты Влиятельных Лиц. Она должна запрашивать у пользователя количество меценатов, а затем приглашать вводить их имена и суммы пожертвований от каждого. Информация должна сохраняться в динамически выделяемом массиве структур. Каждая структура должна иметь два члена: символьный массив (или объект string) для хранения имени и переменную-член типа double — для хранения суммы пожертвования. После чтения всех данных программа должна отображать имена и суммы пожертвований тех, кто не пожалел $10 000 и более. Этот список должен быть озаглавлен меткой "Grand Patrons". После этого программа должна выдать список остальных жертвователей. Он должен быть озаглавлен "Patrons". Если в одной из двух категорий не окажется никого,программа должна напечатать "none". Помимо отображения двух категорий,никакой другой сортировки делать не нужно.

Задача №9
Кликните здесь для просмотра всего текста
Выполните упражнение 6, но измените его так, чтобы данные можно было получать из файла. Первым элементом файла должно быть количество меценатов,а остальная часть состоять из пар строк, в которых первая строка содержит имя, а вторая — сумму пожертвования. То есть файл должен выглядеть примерно так:
4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000


Проблема в 9-й задаче в том, что если в именах есть пробелы, то с вводом данных в массив возникают проблемы (и с выводом в консоль соотв. тоже). Если пробелы убрать, то программа работает. Что мне нужно изменить, чтобы исправить данную проблему?

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
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <cstdlib> //для exit(EXIT_FAILURE)
 
using namespace std;
 
struct patron {
  //char name[25];
  string name;
  double donation;
};
 
int main()
{
  string filename;
  cout << "Enter name of the file: ";
  getline(cin, filename);
  fstream file;
  file.open(filename);
  if (!file.is_open())
  {
    cout << "Can't open " << filename << "." << endl;
    exit(EXIT_FAILURE);
  }
  int n;
  file >> n;
  patron * data = new patron [n];
  cout << "Reading the information about patrons." << endl;
  for (int i = 0; i < n; i++)
  {
    file >> data[i].name;
    //file.getline(data[i].name, 25); не работает даже с заменой типа string на char
    file >> data[i].donation;
  }
  file.close();
  cout << "Grand Patrons." << endl;
  int countgp = 0;
  for (int j = 0; j < n; j++)
  {
    if (data[j].donation >= 10000)
    {
      cout << data[j].name << " with " << data[j].donation << endl;
      countgp++;
    }
  }
  if (countgp == 0)
    cout << "none" << endl;
  cout << endl;
  cout << "Patrons." << endl;
  int countp = 0;
  for (int k = 0; k < n; k++)
  {
    if (data[k].donation < 10000)
    {
      cout << data[k].name << " with " << data[k].donation << endl;
      countp++;
    }
  }
  if (countp == 0)
    cout << "none" << endl;
  return 0;
}

Вот пример работы с 2-я файлами (tmp2 без пробелов в именах):

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[iceglen@iceglen 9]$ g++ -std=c++11 9.cpp 
[iceglen@iceglen 9]$ ./a.out 
Enter name of the file: tmp2
Reading the information about patrons.
Grand Patrons.
FreidaFlass with 100500
RichRaptor with 55000
 
Patrons.
SamStone with 2000
TammyTubbs with 5000
[iceglen@iceglen 9]$ ./a.out 
Enter name of the file: tmp
Reading the information about patrons.
Grand Patrons.
none
 
Patrons.
Sam with 0
 with 0
 with 0
 with 0
[iceglen@iceglen 9]$
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2013, 22:34     Чтение из файла в массив
Посмотрите здесь:

Чтение из файла в массив char C++
Чтение из файла в массив C++
Чтение из файла в массив до разделителя C++
C++ Чтение из файла в массив
C++ Чтение из файла в массив строк
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2013, 02:58     Чтение из файла в массив #2
Цитата Сообщение от iceglen Посмотреть сообщение
Что мне нужно изменить, чтобы исправить данную проблему?
Использовать std::getline:
C++
1
getline(file, data[i].name);
iceglen
 Аватар для iceglen
24 / 24 / 2
Регистрация: 24.06.2013
Сообщений: 105
29.09.2013, 03:16  [ТС]     Чтение из файла в массив #3
Пробовал - не канает. Вывод как во 2-м случае.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2013, 04:32     Чтение из файла в массив #4
Цитата Сообщение от iceglen Посмотреть сообщение
Пробовал - не канает. Вывод как во 2-м случае.
Гле пробовали? Как пробовали? Код покажите, который пробовали.
Если правильно пробовать, то всё будет канать...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2013, 04:39     Чтение из файла в массив #5
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
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <cstdlib> //для exit(EXIT_FAILURE)
 
using namespace std;
 
struct patron {
    //char name[25];
    string name;
    double donation;
};
 
int main()
{
    string filename;
    cout << "Enter name of the file: ";
    getline(cin, filename);
    fstream file;
    file.open(filename);
    if (!file.is_open())
    {
        cout << "Can't open " << filename << "." << endl;
        exit(EXIT_FAILURE);
    }
    int n;
    (file >> n).get();
    patron * data = new patron[n];
    cout << "Reading the information about patrons." << endl;
    for (int i = 0; i < n; i++)
    {
        //file >> data[i].name;
        getline(file, data[i].name);
        (file >> data[i].donation).get();
    }
    file.close();
    
    cout << "Grand Patrons." << endl;
    int countgp = 0;
    for (int j = 0; j < n; j++)
    {
        if (data[j].donation >= 10000)
        {
            cout << data[j].name << " with " << data[j].donation << endl;
            countgp++;
        }
    }
    if (countgp == 0)
        cout << "none" << endl;
    cout << endl;
    cout << "Patrons." << endl;
    int countp = 0;
    for (int k = 0; k < n; k++)
    {
        if (data[k].donation < 10000)
        {
            cout << data[k].name << " with " << data[k].donation << endl;
            countp++;
        }
    }
    if (countp == 0)
        cout << "none" << endl;
    
    cin.get();
    return 0;
}
Миниатюры
Чтение из файла в массив  
iceglen
 Аватар для iceglen
24 / 24 / 2
Регистрация: 24.06.2013
Сообщений: 105
29.09.2013, 04:46  [ТС]     Чтение из файла в массив #6
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
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <cstdlib> //для exit(EXIT_FAILURE)
 
using namespace std;
 
struct patron {
  //char name[25];
  string name;
  double donation;
};
 
int main()
{
  string filename;
  cout << "Enter name of the file: ";
  getline(cin, filename);
  fstream file;
  file.open(filename);
  if (!file.is_open())
  {
    cout << "Can't open " << filename << "." << endl;
    exit(EXIT_FAILURE);
  }
  int n;
  file >> n;
  patron * data = new patron [n];
  cout << "Reading the information about patrons." << endl;
  for (int i = 0; i < n; i++)
  {
    //file >> data[i].name;
    //file.getline(data[i].name, 25); //для строк в стиле C
    getline(file, data[i].name); //не канает
    file >> data[i].donation;
  }
  if (file.eof())
    cout << "End of file reached." << endl;
  file.close();
  cout << "Grand Patrons." << endl;
  int countgp = 0;
  for (int j = 0; j < n; j++)
  {
    if (data[j].donation >= 10000)
    {
      cout << data[j].name << " with " << data[j].donation << endl;
      countgp++;
    }
  }
  if (countgp == 0)
    cout << "none" << endl;
  cout << endl;
  cout << "Patrons." << endl;
  int countp = 0;
  for (int k = 0; k < n; k++)
  {
    if (data[k].donation < 10000)
    {
      cout << data[k].name << " with " << data[k].donation << endl;
      countp++;
    }
  }
  if (countp == 0)
    cout << "none" << endl;
  return 0;
}
Попробую Ваш код =\

Добавлено через 2 минуты
Ваш код работает. Наверное дело в
C++
1
(file >> data[i].donation).get();
Уже почти 5 утра у меня. Если не сложно, то поясните этот момент. Символ перехода на новую строку остается в очереди или что?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2013, 04:54     Чтение из файла в массив #7

Не по теме:

Цитата Сообщение от iceglen Посмотреть сообщение
Уже почти 5 утра у меня.
У меня тоже.


Цитата Сообщение от iceglen Посмотреть сообщение
Символ перехода на новую строку остается в очереди или что?
Да. Перед getline() его нужно убирать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2014, 18:20     Чтение из файла в массив
Еще ссылки по теме:

C++ Чтение из файла в массив
Чтение из файла в динамический массив C++
Чтение из файла в массив C++

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

Или воспользуйтесь поиском по форуму:
andreypplk
1 / 1 / 0
Регистрация: 08.02.2014
Сообщений: 27
11.06.2014, 18:20     Чтение из файла в массив #8
вариант с работающей getline
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
// upr6-9.cpp: определяет точку входа для консольного приложения.
//МОДИФИЦИРОВАТЬ ПОД ФАЙЛОВЫЙ ВВОД-ВЫВОД
 
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <fstream>
#include <cstdlib> //для exit()
 
using namespace std;
 
const int strsize = 50;
 
typedef struct _OZVL
{
    char fullname[50];
    double mec_donate;
}OZVL, *POZVL;
 
int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    //Создание файла из которого нужно читать
    int num;
    char outName[50];
    double outDonat;
    ofstream outFile;
    outFile.open("text.txt");
    cout << "Введите количество участников: ";
    cin >> num;
    cin.get();
    outFile << fixed;
    outFile.precision(2);
    outFile.setf(ios_base::showpoint);
    outFile << num << endl;
    for (int i = 0; i <= num-1; i++)
    {
        cout << "Введите имя: ";
        cin.getline(outName, 50);
        outFile << outName << endl;
        cout << "Введите сумму: ";
        cin >> outDonat;
        cin.get();
        outFile << outDonat << endl;
    }
    outFile.close();
    
    //Чтение из файла
    cout << "Введите имя файла text.txt: ";
    char filename[50];
    char temp;
    ifstream inFile;
    //открываем файл
    cin.getline(filename, 50);
    inFile.open(filename);
    //проверка на открытие
    if (!inFile.is_open())
    {
        cout << "Не удалось открыть файл" << filename << endl;
        cout << "Программа будет закрыта. \n";
        system("pause");
        exit(EXIT_FAILURE);
    }
    //Обработка данных
    int unsigned lu_val_ppl;
    inFile >> lu_val_ppl;
    cout << "Количество меценатов: " << lu_val_ppl << endl;
    //cin >> lu_val_ppl;
    //cin.get();
    POZVL st_maecenas = new OZVL[lu_val_ppl];
 
    //КОД ИЗ ПРОЭКТА 6-4 ПЕРЕДЕЛАТЬ ПОД НОВОЕ ЗАДАНИЕ
    while (inFile.good())
    {
        if (!lu_val_ppl == 0)
        {
            for (int i = 0; i < lu_val_ppl; i++)
            {
                if (!inFile.eof())
                {
                    inFile.getline(&temp, strsize);
                    inFile.getline(st_maecenas[i].fullname, strsize);
                    inFile >> st_maecenas[i].mec_donate;
                }
                //переработать для чтения из файла
                //cout << "Введите имя: ";
                //inFile.getline(st_maecenas[i].fullname, strsize);
                //cin.getline(st_maecenas[i].fullname, strsize);
                //cout << "Введите сумму: ";
                //inFile >> st_maecenas[i].mec_donate;
                //cin >> st_maecenas[i].mec_donate;
                //cin.get();
            }
            //вывод результатов
            cout << "Большие меценаты:" << endl;
            for (int i = 0; i < lu_val_ppl; i++)
            {
                if (st_maecenas[i].mec_donate >= 10000 && st_maecenas[i].mec_donate <= 100000000)
                {
                    cout << st_maecenas[i].fullname << " Сумма: " << st_maecenas[i].mec_donate << endl;
                }
            }
            cout << endl << "Меценаты:" << endl;
            for (int i = 0; i < lu_val_ppl; i++)
            {
                if (st_maecenas[i].mec_donate >= 1 && st_maecenas[i].mec_donate <= 9999)
                {
                    cout << st_maecenas[i].fullname << " Сумма: " << st_maecenas[i].mec_donate << endl;
                }
            }
        }
        else
        {
            cout << "Выбрано менее 1 человека перезапустите программу для повторного ввода" << endl;
        }
    }
    
    inFile.close();
    delete[] st_maecenas;
    cout << "Bay!\n";
    system("pause");
 
    return 0;
}
Yandex
Объявления
11.06.2014, 18:20     Чтение из файла в массив
Ответ Создать тему
Опции темы

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