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

Считывание массива символов с пробелами

04.01.2017, 16:53. Показов 3878. Ответов 6

Доброго времени суток, коллеги!
Есть задача считать из файла в поле структуры фамилию и инициалы,между ними стоят пробелы, следующею информацию из этой же строки нужно уже считывать в другие поля структуры.
Первая проблема это прописать условие чтобы считывание в первое поле шло не до первого пробела, а получается до 3-го, решил это сделать через цикл While и задал алгоритм подсчёта пробелов, но не работает, не пойму почему.

И вторая проблема что бы при поиске имени в базе (функция find) программа сравнивала значение введённой переменной до конца символов, а не до конца всего массива символов. Функция не ищет человека даже если он есть в базе. Я так понимаю это из-за того что функция сравнивает все 30 символов массива, а так как у нас имя занимает меньшее кол-во символов, то оставшиеся и дают не соответствие в переменных (так как адреса ячеек там разные). Как решить эту проблему не знаю.
Помогите пожалуйста!

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
using namespace std;
const int l_name = 30, l_year=5, l_pay=10,l_baz=6;
 
 
struct htat
{
    char fio[l_name];
    int brith_year;
    float pay;
 
 
};
float summ(int* b, htat *a)
{
    double s=0, midle; int k = 0;
    for (int j = 0; j < l_baz; j++){
        if (j ==b[j]) { s += a[j].pay; k++;}
    }
    midle = (s / k);
    cout << "Средняя з/п:" << midle << endl;
    return midle;
}
void find(htat*a)
{
    char x[l_name];
    int y = 0;
    int* b = new int[l_baz];
    cout << "Enter name" << endl;
    cin.getline(x, l_name,'\n');
    while (x !="."){
        for (int i = 0; i < l_baz; i++)
        {
            if (a[i].fio == x){
                cout << a[i].fio << "  " << a[i].brith_year << "  " << a[i].pay << endl; b[i] = i; y++;
            }
        }
        if (y == 0) cout << "Not found" << endl;
        cin.getline(x, l_name, '\n');
    }
 
}
 
void print(htat*a)
{
    for (int i = 0; i < l_baz; i++)
        cout << a[i].fio << "  " << a[i].brith_year << "  " << a[i].pay << endl;
}
int main()
{
    float(*sp)(int*, htat*);
    sp =summ;
    void (*fp)(htat*);
    fp = find;
    int n=0;
    ifstream f1("people.txt");
    htat*a = new htat [l_baz];
    for (int i = 0; i <l_baz; i++){
        while (n<3)
        {
            f1 >> a[i].fio;
            if (a[i].fio ==" ") n++;
        }
        f1 >> a[i].brith_year >> a[i].pay;
    }
    print(a);
    fp(a);
    system("pause");
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2017, 16:53
Ответы с готовыми решениями:

Последовательное считывание массива символов
Я всего лишь несколько дней изучаю C++, а потому то и дело возникают разного рода трудности в...

Считывание строки с пробелами
Пишу небольшую эмуляцию БД. Пользователь вводит с клавиатуры название и тип товара цену колво...

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

Считывание вместе с пробелами
Столкнулся с одной проблемой при считывании из файла программа считает пробелы символами...

6
nd2
3419 / 2799 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
04.01.2017, 17:15 2
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Есть задача считать из файла в поле структуры фамилию и инициалы,между ними стоят пробелы,
Пример покажи данных в файле. Это по заданию так должно быть? Или сам придумал?

Добавлено через 5 минут
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
f1 >>
Этот оператор первые пробелы пропускает, читает до пробела, поэтому пробелы вообще не будут прочитаны, поэтому считать их нет смысла.

Добавлено через 3 минуты
Нужно просто прочитать три слова (фамилию и инициалы), с помощью f1 >>, и слепить из них одно слово, которое и поместить в поле структуры.
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
04.01.2017, 18:42  [ТС] 3
Цитата Сообщение от nd2 Посмотреть сообщение
Пример покажи данных в файле. Это по заданию так должно быть? Или сам придумал?
Это по заданию так, пример данных в файле:
dgek Y G 1987 200000
dru F K 1986 150000
Имя и инициалы должны попасть в первое поле структуры, а остальные соответственно в последующие.

Цитата Сообщение от nd2 Посмотреть сообщение
Нужно просто прочитать три слова (фамилию и инициалы), с помощью f1 >>, и слепить из них одно слово, которое и поместить в поле структуры
Как это сделать?
0
nd2
3419 / 2799 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
04.01.2017, 18:51 4
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Как это сделать?
Например, так:
C++
1
2
3
4
5
6
7
8
9
10
11
     for (int i = 0; i < l_baz; i++)
    {
        f1 >> a[i].fio;
        strcat(a[i].fio, " ");
        char temp[30];
        f1 >> temp;
        strcat(a[i].fio, temp);
        f1 >> temp;
        strcat(a[i].fio, temp);
        f1 >> a[i].brith_year >> a[i].pay;
    }
1
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
04.01.2017, 19:28  [ТС] 5
Благодарю! Работает. Про функцию strcat не знал.

Возможно подскажешь как мне быть с функцией поиска в этом массиве:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void find(htat*a)
{
    char x[l_name];
    int y = 0;
    int* b = new int[l_baz];
    cout << "Enter name" << endl;
    cin.getline(x, l_name,'\n');
    while (x !="."){
        for (int i = 0; i < l_baz; i++)
        {
            if (a[i].fio == x){
                cout << a[i].fio << "  " << a[i].brith_year << "  " << a[i].pay << endl; b[i] = i; y++;
            }
        }
        if (y == 0) cout << "Not found" << endl;
        cin.getline(x, l_name, '\n');
    }
 
}
Функция не ищет человека даже если он есть в базе. Я так понимаю это из-за того что функция сравнивает все 30 символов массива, а так как у нас имя занимает меньшее кол-во символов, то оставшиеся и дают не соответствие в переменных (так как адреса ячеек там разные). Как решить эту проблему не знаю.
0
nd2
3419 / 2799 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
04.01.2017, 19:31 6
Для сравнения Си-строк есть функция strcmp(): http://www.cplusplus.com/reference/cstring/strcmp/
1
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
04.01.2017, 20:08  [ТС] 7
Спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2017, 20:08

Считывание файла с пробелами.
Подскажите, пожалуйста, как при считывание текстового файла сохранить пробелы между словами. Темы...

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

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

Дана строка символов, разделённых пробелами. Вывести i-e слово и количество символов в нём
Добрый день Нужна помощь с заданием вот само задание Дана строка символов, разделённых...


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

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

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