Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
EfimKR
55 / 28 / 13
Регистрация: 24.06.2014
Сообщений: 247
Записей в блоге: 1
1

Неуловимая ошибка при считывании строк

27.10.2014, 16:42. Просмотров 269. Ответов 3
Метки нет (Все метки)

Ниже приведен код. Все работает нормально, но по непонятной причине добавляет 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
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
//1.Написать программу для хранения в битовом поле информации о конфигурации компьютера. 
//Например: Корпус AT – 0, ATX – 1; Видео на борту – 0, карта – 1 и так далее. 
//Параметры выбора: корпус компьютера: 0 - АТ, 1 – АТХ; видеокарта: 0 - интегрированная, 1 – дискретная; 
//звуковая карта: 0 - интегрированная, 1 – дискретная; видеокарта: 0 - AMD, 1 – INTEL; монитор: 0 - LCD, 1 – TFT.
 
#include<iostream>
#include<string>
#include<fstream>
#include<windows.h>
using namespace std;
 
const int nSize = 15; // количество записей
const int n_len = 10;  // длина имени
 
struct Comp
{
    string name;
    unsigned body:1;
    unsigned typeVC:1;
    unsigned typeSC:1;
    unsigned brandVC:1;
    unsigned monitor:1;
};
 
void add (Comp c[], int& count);
void get_name(string& name);
int find_name (Comp *c, const int count);
int menu();
void print (const Comp c);
void print_info();
Comp read_comp();
void remove(Comp c[], int& count);
void out(Comp c[], const int count);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int count = 0;
    Comp comp[nSize];
 
    ifstream fin("comp_base.txt", ios::_Nocreate);
    if (!fin.is_open())
            cout << "Файл базы не найден!\n";
    else
        while (fin>>comp[count].name)
        {
        
            for (int i = comp[count].name.size(); i < n_len; i++)
                comp[count].name+=" ";
            int tmp;
            fin>>tmp;
            comp[count].body = tmp;
            fin>>tmp;
            comp[count].typeVC = tmp;
            fin>>tmp;
            comp[count].typeSC = tmp;
            fin>>tmp;
            comp[count].brandVC = tmp;
            fin>>tmp;
            comp[count].monitor = tmp;
            fin.get();
            count++;
        }
    fin.close();
 
    bool bLabelOut = true;
 
    while(bLabelOut)
    {
        switch (menu())
        {
            case 1: add (comp, count);
                break;
            case 2: 
                {
                    int find = find_name (&comp[0], count);
                    if (find != -1)
                    {
                        print_info();
                        print(comp[find]);
                    }
                }
                break;
            case 3: remove (comp, count);
                break;
            case 4: out (comp, count);
                break;
            case 5: bLabelOut = false;
                break;
        default: cout<<"Некорректный ввод!\n";
            break;
        }
    }
 
    if (count)
    {
        ofstream fout("comp_base.txt", ios::_Nocreate);
        if (!fout.is_open())
            cout<<"Не найден файл для записи!\n";
        else
            for (int i = 0; i < count; i++)
            {
                fout<<comp[i].name;
                fout<<comp[i].body<<" ";
                fout<<comp[i].typeVC<<" ";
                fout<<comp[i].typeSC<<" ";
                fout<<comp[i].brandVC<<" ";
                fout<<comp[i].monitor<<endl;
            }
        fout.close();
    
    }
 
    return 0;
}
 
void add (Comp c[], int& count)
{
    if (count < nSize)
    {
        c[count] = read_comp();
        count++;
    }
    else 
        cout<<"Достигнуто максимальное количество компьютеров в базе!\n";
}
void get_name(string& name)
{
    char buff[30] = "                           ";
    cout<<"Введите имя : ";
    cin.get();
    cin.getline(buff, 13);
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());  // защита от дурака
    name.assign(buff,10);       
}
 
int find_name (Comp *c, const int count)
{
    string name;
    get_name(name);
    for (int i = 0; i < count; i++)
        if ( c[i].name == name)
            return i;
    cout<<"Такого компьютера нет\n";
    return -1;
}
int menu()
{
    int opt;
    cout<<"Выберите операцию:\n"
        <<"1 - добавить компьютер\n2 - найти компьютер\n"
        <<"3 - удалить компьютер\n4 - вывести базу\n"
        <<"5 - выход\n";
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin>>opt;
    if (opt < 1 || opt > 5)
        return 0;
    else return opt;
}
 
void print (const Comp c)
{
    cout<<c.name;
    cout<<c.body<<"   "
        <<c.typeVC<<"   "
        <<c.typeSC<<"   "
        <<c.brandVC<<"   "
        <<c.monitor<<endl;
 
}
void print_info()
{
    cout<<"Параметры выбора:\nкорпус компьютера: 0 - АТ, 1 – АТХ; \nвидеокарта: 0 - интегрированная, 1 – дискретная;" 
        <<"\nзвуковая карта: 0 - интегрированная, 1 – дискретная;\nвидеокарта: 0 - AMD, 1 – INTEL;\nмонитор: 0 - LCD, 1 – TFT.\n\n";
    cout<<"bd - body, tVC - type VC, tSC - type SC, bVC - brand VC, scr - monitor\n\n";
    cout<<"Name      bd  tVC tSC bVC scr\n\n";
}
 
Comp read_comp()
{
    Comp comp;
    get_name(comp.name);
    cout<<"Параметры выбора:\nкорпус компьютера: 0 - АТ, 1 – АТХ; \nвидеокарта: 0 - интегрированная, 1 – дискретная;" 
        <<"\nзвуковая карта: 0 - интегрированная, 1 – дискретная;\nвидеокарта: 0 - AMD, 1 – INTEL;\nмонитор: 0 - LCD, 1 – TFT.\n";
    cout<<"Введите параметры компьютера через пробел\n";
    int tmp[5];
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin>>tmp[0]>>tmp[1]>>tmp[2]>>tmp[3]>>tmp[4];
    comp.body = tmp[0];
    comp.typeVC = tmp[1];
    comp.typeSC = tmp[2];
    comp.brandVC = tmp[3];
    comp.monitor = tmp[4];
    return comp;
}
void remove(Comp c[], int& count)
{
    int find = find_name(&c[0], count);
    if (find != -1)
    {
        for (int i = find; i< count; i++)
        c[i] = c[i+1];
        count--;
    }
}
 
void out(Comp c[], const int count)
{
    print_info();
    for (int i = 0; i < count; i++)
        print(c[i]);
    cout<<"\n";
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2014, 16:42
Ответы с готовыми решениями:

Ошибка при считывании xml
День добрый! Код: #include &lt;iostream&gt; #include &quot;conio.h&quot; #include...

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

Ошибка при считывании двоичного файла
При считывании из .EXE файла возникает ошибка, а возникает она когда...

Ошибка, при считывании инфы с файла...
Вот есть код:#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt;...

Ошибка при считывании через scanf
Помогите, пожалуйста, разобрать, где допустил ошибки. После ввода x выдает...

3
nmcf
6515 / 5744 / 2617
Регистрация: 14.04.2014
Сообщений: 24,494
27.10.2014, 18:29 2
В каком месте? Как выглядит?
0
jurok_85
275 / 258 / 190
Регистрация: 21.02.2013
Сообщений: 617
Завершенные тесты: 1
27.10.2014, 18:49 3
Цитата Сообщение от EfimKR Посмотреть сообщение
char buff[30] = " ";
здесь наверное проблема в функции get_name
buff получается не заканчивается '\0'

Добавлено через 11 минут
не, не правильно я указал
1
alsav22
5445 / 4840 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.10.2014, 18:54 4
C++
1
2
3
4
5
6
void get_name(string& name)
{
    cout<<"Введите имя : ";
    cin.get();
    getline(cin, name);
}
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iomanip>
...
void print (const Comp c)
{
    cout<<setw(10)<<left<<c.name;
    cout<<c.body<<"   "
        <<c.typeVC<<"   "
        <<c.typeSC<<"   "
        <<c.brandVC<<"   "
        <<c.monitor<<endl;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2014, 18:54

Ошибка при Считывании из файла форм-приложением
Создаю приложение с формами на С++, одна из необходимых функций - считывание...

Ошибка при считывании double в переменную int
Добрый день.Столкнулся с такой проблемой Если мы попробуем ввести в переменную...

Ошибка 0xcdcdcdcd при считывании fscanf-ом из файла в указатель
Ошибка заключается в том, что при выделении памяти на указатель он каким-то...


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

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

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