Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
EfimKR
53 / 26 / 10
Регистрация: 24.06.2014
Сообщений: 229
Записей в блоге: 1
#1

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

27.10.2014, 16:42. Просмотров 250. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неуловимая ошибка при считывании строк (C++):

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

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

Ошибка при считывании двоичного файла - C++
При считывании из .EXE файла возникает ошибка, а возникает она когда считываемый байт равен 0x1A. Если он есть в файле то программа &quot;видит&quot;...

Ошибка при считывании строковых данных - C++
Нужно просто считать русский текст из файла, выводит смайлики без пробелов. #include &quot;stdafx.h&quot; #include &quot;fstream&quot; #include...

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

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

3
nmcf
5763 / 5074 / 1734
Регистрация: 14.04.2014
Сообщений: 20,777
27.10.2014, 18:29 #2
В каком месте? Как выглядит?
0
jurok_85
243 / 227 / 78
Регистрация: 21.02.2013
Сообщений: 521
Завершенные тесты: 1
27.10.2014, 18:49 #3
Цитата Сообщение от EfimKR Посмотреть сообщение
char buff[30] = " ";
здесь наверное проблема в функции get_name
buff получается не заканчивается '\0'

Добавлено через 11 минут
не, не правильно я указал
1
alsav22
5431 / 4826 / 442
Регистрация: 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
27.10.2014, 18:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2014, 18:54
Привет! Вот еще темы с ответами:

Знаю что информация неправильно преобразовывается при записи в файл, скорее всего и при считывании тоже. Как это исправить? - C++
Знаю что информация неправильно преобразовывается при записи в файл, скорее всего и при считывании тоже. Как это исправить? Вот что...

Переполнение при считывании из файла - C++
Подскажите пожалуйста, где ошибка, вот код чтения из файла: void read_file(void) { int mass; FILE* file = fopen(&quot;arr.txt&quot;, &quot;r&quot;); ...

Не находит пробелы при считывании - C++
ifstream file_i(&quot;text.txt&quot;); for(int j = 0; j &lt; 32; j++){ file_i &gt;&gt; CH; } Дан файл...

Проблема при считывании из файла - C++
Пишу простенькую программу по криптографии. В результате шифрования получается txt файлик с набором закорючек(он во вложении). Для...


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

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

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