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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
#1

Строки - C++

02.04.2009, 16:55. Просмотров 1479. Ответов 11
Метки нет (Все метки)

Помоги разобраться. Переписываю код с книжкиVisual CPP 6 - Руководство Разработчика, компилирую в MS VS2008 - выбивает ошибки
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
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <iomanip>
#define max 20
void row(void);
 
int main(int argc,char* argv[])
{
...
// вывод 19-ти символов строки, минимальная ширина 20
    row(); //[24]
    ostream(str,20).write(psz,19)<<ends;
    cout.width(19);
    cout << str;
    // вывод первых двух символов строки
    row(); //[25]
    ostream(str,3).write(psz,2)<<ends;
    cout << str;
...
void row(void){
    static int In = 0;
    cout << "\n [";
    cout.width(2);
    cout << ++In << "] ";
}
Ошибки
Код
1>c:\myprojects\ioflags\ioflags\ioflags.cpp(137) : error C2665: std::basic_ostream<_Elem,_Traits>::basic_ostream: ни одна из 3 перегрузок не может преобразовать все типы аргументов
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        c:\program files\microsoft visual studio 9.0\vc\include\ostream(50): может быть 'std::basic_ostream<_Elem,_Traits>::basic_ostream(std::basic_streambuf<_Elem,_Traits> *,bool)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        c:\program files\microsoft visual studio 9.0\vc\include\ostream(56): или       'std::basic_ostream<_Elem,_Traits>::basic_ostream(std::_Uninitialized,bool)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        при попытке сопоставить список аргументов '(char [20], int)'
1>c:\myprojects\ioflags\ioflags\ioflags.cpp(137) : error C2228: выражение слева от ".write" должно представлять класс, структуру или объединение
1>c:\myprojects\ioflags\ioflags\ioflags.cpp(142) : error C2665: std::basic_ostream<_Elem,_Traits>::basic_ostream: ни одна из 3 перегрузок не может преобразовать все типы аргументов
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        c:\program files\microsoft visual studio 9.0\vc\include\ostream(50): может быть 'std::basic_ostream<_Elem,_Traits>::basic_ostream(std::basic_streambuf<_Elem,_Traits> *,bool)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        c:\program files\microsoft visual studio 9.0\vc\include\ostream(56): или       'std::basic_ostream<_Elem,_Traits>::basic_ostream(std::_Uninitialized,bool)'
1>        with
1>        [
1>            _Elem=char,
1>            _Traits=std::char_traits<char>
1>        ]
1>        при попытке сопоставить список аргументов '(char [20], int)'
1>c:\myprojects\ioflags\ioflags\ioflags.cpp(142) : error C2228: выражение слева от ".write" должно представлять класс, структуру или объединение
1>Журнал построения был сохранен в "file://c:\MyProjects\ioflags\ioflags\Debug\BuildLog.htm"
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2009, 16:55     Строки
Посмотрите здесь:

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

Добавить строки, начиная со строки К1 и до строки К2, в динамический массив строк - C++
Есть динамический массив строк. Заполняется, т.е. размер его уже известен будет. Но дальше нужно сделать задание: &quot;Добавить строки, начиная...

Ввести строки и через n символов первой строки вставить вторую строку, и так до конца строки - C++ Builder
Помогите исправить баг задача состоит в следующем :ввести строку и простроку тоесть две строки и надо через (n) символов первой строки...

Даны три строки. Определить можно ли из символов третьей строки получить первую и вторую строки - Java
Помогите пожалуйста! 1)Даны три строки. Определить можно ли из символов третьей строки получить первую и вторую строки. 2)Дана...

Сравнить строки, первый несовпадающий элемент строки-приемника записать в регистр AL, строки-источника - в DL - Assembler
Помогите написать программу на ассемблерене совсем еще разобрался с этим задание: Ввести с клавиатуры две строки одноразрядных...

Слить две строки, вставив символы одной строки между символами другой строки - Pascal
Строка a из n символов лексикографически меньше строки b из n символов, если существует такой индекс j, что aj &lt; bj, а для всех i &lt; j ai =...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
02.04.2009, 16:57     Строки #2
что такое ends???
ой, тут вообще что-то страшное...
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
02.04.2009, 17:07  [ТС]     Строки #3
так в книге напечатано. Ещё в начали в книге написано подключить #include <strstrea.h>, но у меня такого нету.
вот объявление строки и псевдобуфера: char psz[] = "Строка для экспременента", str[max];(max = 20 - объявлен в константах).
Haster
инженер-системотехник
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
02.04.2009, 17:16     Строки #4
Так ты в 11-ой строчке так и пишешь ...?
Или у тебя там что-то есть ))
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
02.04.2009, 17:18  [ТС]     Строки #5
Цитата Сообщение от Haster Посмотреть сообщение
Так ты в 11-ой строчке так и пишешь ...?
Или у тебя там что-то есть ))
Да, вместо ... там код, но вроде он не должен повлиять на поток.
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
02.04.2009, 17:21     Строки #6
ты можешь скинуть весь исходник?
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
02.04.2009, 17:22  [ТС]     Строки #7
Пробовал вместо ostream писать ostrstream, но компилятор пишет
[CODE]
1>c:\myprojects\ioflags\ioflags\ioflags.cpp(137) : error C2228: выражение слева от ".write" должно представлять класс, структуру или объединение
1> тип: 'unknown-type'
1>c:\myprojects\ioflags\ioflags\ioflags.cpp(137) : error C3861: ostrstream: идентификатор не найден
1>c:\myprojects\ioflags\ioflags\ioflags.cpp(142) : error C2228: выражение слева от ".write" должно представлять класс, структуру или объединение
1> тип: 'unknown-type'
1>c:\myprojects\ioflags\ioflags\ioflags.cpp(142) : error C3861: ostrstream: идентификатор не найден
[\CODE]

вот весть код:
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
// ioflags.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
#include <iomanip>
#define max 20
void row(void);
 
int main(int argc,char* argv[])
{
    char c = 'А', psz[] = "Строка для экспременента", str[max];
    int i = 1234;
    double d = 3.14159265;
    // вывод символа с
    row(); // [1]
    cout << c;
    // вывод ASCII-кода символа с
    row(); // [2]
    cout << (int)c;
    // вывод сисвола с ASCII-кодом 90
    row(); //[3]
    cout << (char)90;
    // вывод значения i в восьмеричной системе
    row(); //[4]
    cout << oct << i;
    // вывод значения i в шестнадцатеричной системе
    // с буквами в нижнем регистре 
    row(); //[5]
    cout << hex << i;
    // вывод значения i в шестнадцатеричной системе 
    // с буквами в верхнем регистре
    row(); //[6]
    cout.setf(ios::uppercase);
    cout << hex << i;
    cout.unsetf(ios::uppercase); //отмена верхнего регистра символов
    cout << dec; //возрат к десятичной
    // вывод одного символа, минимальная ширина поля 5,
    // выравнивание вправо с дополнением пробелами
    row(); //[7]
    cout.width(5);
    cout << c;
    // вывод одного символа, минимальная ширина поля 5,
    // выравнивание влево с дополнением пробелами
    row(); //[8]
    cout.width(5);
    cout.setf(ios::left);
    cout << c;
    cout.unsetf(ios::left);
    // вывод строки, отображается 24 символа
    row(); //[9]
    cout.width(24);
    cout << psz;
    // вывод строки, отображается 5 символов
    row(); //[10]
    cout.width(5);
    cout << psz;
    // вывод минимум 38-ми символов строки
    // с выравниванием вправо с дополнением пробелами
    row(); //[11]
    cout.width(38);
    cout.setf(ios::right);
    cout << psz;
    cout.unsetf(ios::right);
    // вывод минимум 38-ми символов строки
    // с выравниванием влево с дополнением пробелами
    row(); //[12]
    cout.width(38);
    cout.setf(ios::left);
    cout << psz;
    cout.unsetf(ios::left);
    // вывод значения i,по умолчанию отображаются 4 символа
    row(); //[13]
    cout << i;
    // вывод значения i с отображением знака
    row(); //[14]
    cout.setf(ios::showpos);
    cout << i;
    cout.unsetf(ios::showpos);
    // вывод значения i минимум 3-х цифр, отобраются 4 цифры
    row(); //[15]
    cout.width(3);
    cout << i;
    // вывод значения минимум из 10-ти цифер
    // с выравниваем вправо
    row(); //[16]
    cout.width(10);
    cout << i;
    // вывод значения i минимум из 10-ти цифер
    // с выравниманием влево с дополнением пробелами
    row(); //[17]
    cout.width(10);
    cout.setf(ios::left);
    cout << i;
    cout.unsetf(ios::left);
    // вывод значения i минимум из 20-ти цифер
    // с выравниванием вправо с дополнением нулями
    row(); //[18]
    cout.width(10);
    cout.fill('0');
    cout << i;
    cout.fill(' ');
    // вывод значения d,по умолчания
    row(); //[19]
    cout << d;
    // вывод значения d,миниммальная ширина 20,
    // с выравниванием вправо с дополнением пробелати
    row(); //[20]
    cout.width(20);
    cout << d;
    // вывод значения d, минимальная ширина 20
    // с выравниванием влево с дополнением нулями
    row(); //[21]
    cout.width(20);
    cout.fill('0');
    cout << d;
    cout.fill(' ');
    // вывод значения, минимальная ширина 20,
    // с выравниванием влево с дополнением пробелами
    row(); //[22]
    cout.width(20);
    cout.setf(ios::left);
    cout << d;
    cout.unsetf(ios::left);
    // вывод значения, минимальная ширина 20,
    // с выравниванием влево с дополнением нулями
    row(); //[23]
    cout.width(20);
    cout.fill('0');
    cout.setf(ios::left);
    cout << d;
    cout.unsetf(ios::left);
    cout.fill(' ');
    // вывод 19-ти символов строки, минимальная ширина 20
    row(); //[24]
    ostream(str,20).write(psz,19)<<ends;
    cout.width(19);
    cout << str;
    // вывод первых двух символов строки
    row(); //[25]
    ostream(str,3).write(psz,2)<<ends;
    cout << str;
    // вывод двух превых строк, минимальная ширина 19
    // с выравниванием вправо с дополнением пробелами
    row(); //[26]
    cout.width(19);
    cout << str;
    // вівод двух первіх символов строки, минимальная ширина 19,
    // с выравниванием влево с дополнением пробелами
    row(); //[27]
    cout.width(19);
    cout.setf(ios::left);
    cout << str;
    cout.unsetf(ios::left);
    // вывод значения d из 5-ти цифр
    row(); //[28]
    cout.precision(5);
    cout << d;
    // вывод значения d из двух цифер, минимальная ширина 20
    // с выравниванием вправо с дополнением пробелами
    row(); //[29]
    cout.width(19);
    cout.precision(2);
    cout << d;
    // вывод значения d из 4-х цифер
    row(); //[30]
    cout.precision(4);
    cout << d;
    // вывод значения d из 4-х цифер, минимальная ширина 20,
    // с выравниваниев вправо с дополнением пробелами
    row();//[31]
    cout.width(20);
    cout << d;
    // вывод значения d, минимальная ширина 20
    // 4 цифры после десятичной запятой, с выравниванием вправо
    // с дополнением пробелами, научная форма(експанента)
    row();//[32]
    cout.setf(ios::scientific);
    cout.width(20);
    cout << d;
    cout.unsetf(ios::scientific);
    system("PAUSE");
    return 0;
}
void row(void){
    static int In = 0;
    cout << "\n [";
    cout.width(2);
    cout << ++In << "] ";
}
Haster
инженер-системотехник
109 / 108 / 2
Регистрация: 10.03.2009
Сообщений: 533
02.04.2009, 17:27     Строки #8
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
class ostream : public ios {
public:
    explicit ostream(streambuf *strbuf);
    class sentry;
    virtual ~ostream();
    ostream& operator<<(
        ostream& (*pfn)(ostream&));
    ostream& operator<<(
        ios_base;& (*pfn)(ios_base&));
    ostream& operator<<(
        ios& (*pfn)(ios&));
    ostream& operator<<(
        streambuf *strbuf);
    ostream& operator<<(bool val);
    ostream& operator<<(short val);
    ostream& operator<<(unsigned short val);
    ostream& operator<<(int val);
    ostream& operator<<(unsigned int val);
    ostream& operator<<(long val);
    ostream& operator<<(unsigned long val);
    ostream& operator<<(float val);
    ostream& operator<<(double val);
    ostream& operator<<(long double val);
    ostream& operator<<(const void *val);
    ostream& put(char_type ch);
    ostream& write(char_type *str, streamsize count);
    ostream& flush();
    pos_type tellp();
    ostream& seekp(pos_type pos);
    ostream& seekp(off_type off,
        ios_base::seek_dir way);
    };
Судя по этому коду, у класса osteram нет конструктора с двумя параметрами
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
02.04.2009, 17:40  [ТС]     Строки #9
Не знаю, до классов не ещё не дошел. Вообще это книга("Visual CPP 6 - Руководство Разработчика") очень странная и ошибок много, но до этого мои знания помогали мне их решить, а с этой проблемой даже не знаю, что делать))

Добавлено через 4 минуты 7 секунд
Вот так в книге объединяться действие с потоком:
В этой программе следует обратить внимание на использование класса ostrstream в пунктах 24
и 25, а также неявно в пунктах 26 и 27. Этот класс управляет выводом строк. Необходимость в
нем возникла в связи с тем, что флаги форматирования оказывают влияние на работу
оператора <<, но не функции write() класса ostream(класс ostrstream является его потомком и
наследует данную функцию), которая записывает в поток указанное число символов строки.
Выводимые ею данные всегда прижимаются к левому краю. Поэтому мы поступаем
следующим образом:
ostrstream(strbuffer, 20).write(psz,19)<< ends;
cout.width(19); cout << strbuffer;
Разберем этот фрагмент шаг за шагом. Сначала вызывается конструктор класса ostrstream,
создающий временный безымянный объект данного класса, автоматически уничтожаемый по
завершении строки. Если вы еще не знакомы с понятием конструктора, то поясним, что это
особая функция, предназначенная для динамического создания объектов своего класса.
Конструктор класса ostrstreamтребует указания двух аргументов: буферной строки, в которую
будет осуществляться вывод, и размера буфера. Особенность заключается в том, что
реальный размер буферного массива может быть больше указанного, но все данные,
записываемые сверх лимита, будут отсекаться.
Итак, конструктор создал требуемый объект, связанный с буфером strbuffer(я просто назвал str). Этот объект
является обычным потоком в том смысле, что им можно управлять как и любым другим
потоком вывода, только данные будут направляться не на экран, а в буфер. Вторым действием
вызывается функция write() объекта, записывающая в поток первые 19 символов строки psz.
Оператор точка (.) в данном случае обозначает операцию доступа к члену класса. Здесь тоже
есть своя особенность: функция write() возвращает адрес потока, из которого она была
вызвана. А это, в свою очередь, означает, что мы можем тут же применить к потоку оператор вывода <<. Итого, три действия в одном выражении! Манипулятор endsкласса
ostreamвставляет в поток символ \0,служащий признаком завершения строки. Именно поэтому
в буфере было зарезервировано 20 ячеек — на единицу больше, чем количество выводимых
символов строки psz. В результате выполненных действий в буфере оказалась
сформированной готовая строка, которая, в конце концов, и направляется в поток cout.
Теперь рассмотрим, что происходит в пункте 25:
ostrstream (strbuf fer, 3) .write (psz, 2) << ends;
cout << strbuffer;
Последовательность действий та же, но резервируется не весь буфер, а только первые три
ячейки. Трюк в том, что объект cout воспринимает массив strbuffer как обычную строку, но
поскольку в третьей ячейке стоит символ \0,то получается, что строка состоит из двух
символов! В пунктах 26 и 27 используется содержимое буфера, полученное в пункте 25.
Важно также помнить, что функция width( ) оказывает влияние только на следующий за ней
оператор вывода, тогда как, например, действие функции precision() останется в силе до тех
пор, пока она не будет выполнена снова либо не будет вызван манипулятор setprecision( ) .
Alexiski
Любитель давать советы
339 / 131 / 2
Регистрация: 12.01.2009
Сообщений: 511
02.04.2009, 17:50     Строки #10
Должно быть ostrstream, но надо добавить #include <strstream>
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
02.04.2009, 17:56  [ТС]     Строки #11
Цитата Сообщение от Alexiski Посмотреть сообщение
Должно быть ostrstream, но надо добавить #include <strstream>
СПАСИБО! Помогло))пока что.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2009, 18:09     Строки
Еще ссылки по теме:

Определить длину строки. Если длина строки >6, удалить часть строки в { } скобках. - Turbo Pascal
Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши &quot;Ввод&quot;. Программа должна определить длину введенной...

Строки. Определить длину введенной строки, если длина кратна 4, то первая часть строки меняется местами со второй - Turbo Pascal
Ввести с клавиатуры строку символов.признак окончания ввода строки-нажатие клавиши ввод.Программа должна определить длину введенной строки...

Строки. Если в конце строки точка отсутствует, то найти слово, заканчивающееся точкой и перенести его в конец строки. - Pascal
Дана строка, состоящая из слов и содержащая одну точку в конце одного из слов. Если в конце строки точка отсутствует, то найти слово,...

Строки. Даны строка S и подстрока S1.Удалить из строки S все вхождения строки S1 - Turbo Pascal
Даны строка S и подстрока S1.Удалить из строки S все вхождения строки S1.В строке S подсчитать кол-во вхождений строки S1.


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

Или воспользуйтесь поиском по форуму:
Alexiski
Любитель давать советы
339 / 131 / 2
Регистрация: 12.01.2009
Сообщений: 511
02.04.2009, 18:09     Строки #12
Так и нажал бы на кнопочку "спасибо"
Yandex
Объявления
02.04.2009, 18:09     Строки
Ответ Создать тему
Опции темы

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