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

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

04.01.2017, 16:53. Показов 6017. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2017, 16:53
Ответы с готовыми решениями:

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

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

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

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

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

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

Цитата Сообщение от nd2 Посмотреть сообщение
Нужно просто прочитать три слова (фамилию и инициалы), с помощью f1 >>, и слепить из них одно слово, которое и поместить в поле структуры
Как это сделать?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
04.01.2017, 18:51
Цитата Сообщение от 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  [ТС]
Благодарю! Работает. Про функцию 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
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
04.01.2017, 19:31
Для сравнения Си-строк есть функция strcmp(): http://www.cplusplus.com/reference/cstring/strcmp/
1
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
04.01.2017, 20:08  [ТС]
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2017, 20:08
Помогаю со студенческими работами здесь

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

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

Считывание строки с пробелами
Ситуация такая, необходимо с консоли прочитать строку вводимую пользователем вместе с пробелами. #include &lt;iostream&gt; ...

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru