- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#define BOOST_TEST_MODULE trololo
#include <boost/test/included/unit_test.hpp>
using namespace std;
std::string gen(size_t l, int s = 1, int r = 10/*'\253'*/)
{
std::string res;
res.reserve(l);
for (size_t i = 0; i < l; ++i)
res.push_back(/*'\1'*/'0' + (char)((i + s) % r));
return res;
}
std::string readl(std::istream& st, size_t l, bool human = false)
{
std::string res(l, '\0');
st.read((char*)res.data(), l);
res.resize((size_t)(st.gcount()));
if (human)
return "'" + res + "'";
else
return res;
}
void sp(std::iostream& st, size_t pos)
{
st.seekp(pos);
st.seekg(pos);
}
std::shared_ptr<std::iostream> makeStream(size_t bufSize = 8)
{
(void)bufSize;
return std::make_shared<std::stringstream> (std::ios::in | std::ios::out | std::ios::binary);//comment it
auto r = std::make_shared<std::fstream>();
r->open("test.txt", std::fstream::in | std::fstream::out | std::fstream::binary | std::fstream::trunc);
return r;
}
BOOST_AUTO_TEST_CASE(cross)
{
auto ss_=makeStream();
auto& ss = *ss_;
ss << gen(11);
BOOST_REQUIRE((readl(ss, 11) == gen(11)));
ss << gen(11);
sp(ss, 0);
BOOST_REQUIRE((readl(ss, 11) == gen(11)));
sp(ss, 11);
BOOST_REQUIRE((readl(ss, 11) == gen(11, 11)));
BOOST_REQUIRE((readl(ss, 1) == std::string()));
BOOST_REQUIRE(ss.eof());
ss.clear();
BOOST_REQUIRE(!ss.eof());
sp(ss, 0);
BOOST_REQUIRE((readl(ss, 0) == std::string()));
BOOST_REQUIRE(!ss.eof());
ss << std::string();
BOOST_REQUIRE(!ss.eof());
BOOST_REQUIRE((readl(ss, 0) == std::string()));
sp(ss, 0);
BOOST_REQUIRE((readl(ss, 100500) == gen(11) + gen(11)));
}
BOOST_AUTO_TEST_CASE(full)
{
auto ss_ = makeStream();
auto& ss = *ss_;
ss << gen(8);
BOOST_REQUIRE((readl(ss, 8) == gen(8)));
ss << gen(11);
BOOST_REQUIRE((readl(ss, 11) == gen(11)));
sp(ss, 0);
BOOST_REQUIRE((readl(ss, 100500) == gen(8) + gen(11)));
}
BOOST_AUTO_TEST_CASE(parts)
{
auto ss_ = makeStream();
auto& ss = *ss_;
ss << gen(6);
BOOST_REQUIRE((readl(ss, 6) == gen(6)));
ss << gen(8);
BOOST_REQUIRE((readl(ss, 8) == gen(8)));
ss << gen(8);
BOOST_REQUIRE((readl(ss, 8) == gen(8)));
sp(ss, 0);
BOOST_REQUIRE((readl(ss, 100500) == gen(6) + gen(8) + gen(8)));
}
BOOST_AUTO_TEST_CASE(seek)
{
auto ss_ = makeStream();
auto& ss = *ss_;
laMer007 25.10.2016 19:06 # −2
guest 25.10.2016 20:43 # −2
bormand 25.10.2016 20:44 # 0
guest 25.10.2016 22:24 # 0
guest 25.10.2016 22:48 # −1
barop 26.10.2016 02:34 # −65
3oJIoTou_xyu 26.10.2016 02:37 # −1
kurwa 26.10.2016 02:44 # +5
Alina_Poksenova 04.12.2022 00:44 # 0
roman-kashitsyn 25.10.2016 21:59 # −1
laMer007 26.10.2016 00:21 # −1
laMer007 26.10.2016 00:41 # −1
laMer007 26.10.2016 01:03 # −1
Dr_Stertor 26.10.2016 01:11 # −64
laMer007 26.10.2016 01:37 # −1
Soul_re@ver 26.10.2016 02:02 # +2
stringbuf это полностью С++ конструкция, и работает она как ожидается.
Вообще потоки это странная вещь. fstream не является o/ifstream, внезапно. iostream вообще лучше использовать пореже, так как он может оказаться как очередью, где ввод попадает на вывод, так и объединением двух несвязаных потоков.
laMer007 26.10.2016 03:54 # −1
А вообще какому мудаку это вообще пришло в голову? Имя?
Есть же языки где все единообразно. А тут...
Зачем надо было делать общий интерфейс так, как-будто все единообразно?
Почему чуть ли не единственная иерархия с интерфейсами и виртуальными функциями стандартной библиотеки в крестах нарушает ООП-основополагающий принцип лисков?
Вопросы риторические. Зубы стучат в бессильной злобе. Однажды я определенно сопьюсь...
barop 26.10.2016 04:10 # −64
Soul_re@ver 26.10.2016 08:30 # 0
iostream и его потомков лучше вообще не трогать. У него куча проблем, его потомков нормально не представить при помощи С++ наследования, почти всё у него implementation-defined и т.д.
roman-kashitsyn 26.10.2016 15:17 # +4
Полностью согласен. Имена методов они придумывали в состоянии упячки. tellg, ага.
Я подозреваю, что виртуальное множественное навледование протащили в C++ специально для того, чтобы реализовать сраный iostream, который нафиг не нужен. В C++ вообще полно "случайных" фич: шаблоны сделали, чтобы вектор запилить, шаблоны шаблонов — чтобы замутить бесполезные аллокаторы, и т.п.
Зачем склеивать входной поток и выходной поток в один интерфейс? Понятно же, что огребёшь. В жабе вон нормально живётся с отдельными InputStream и OutputStream. Похожее разделение есть и в других языках. Почти всегда ты либо читаешь из стрима, либо пишешь в стрим, но не одновременно. Это же как есть в туалете.
bormand 26.10.2016 18:39 # 0
От сишки ещё не отошли...
> входной поток и выходной поток в один интерфейс
Подброшу немного дров в костёр.
Имхо, попытка скрестить ужа с ежом случайный и последовательный доступ в одном интерфейсе - уже сама по себе фейл.
Истинным стримам (сокеты, пайпы и т.п.) атавизм в виде курсора только мешает. А random-access девайсы из-за курсора превращаются в однопоточное говно. Т.е. от курсора всем одни страдания. Если он где-то и нужен - то только в адаптере, превращающем random-access в sequential.
kurwa-nextgen 26.10.2016 21:00 # 0
bormand 26.10.2016 21:17 # 0
Ну не знаю как диски, но перфоленту или магнитофон он моделирует на все 146% (seek - перемотка).
barop 26.10.2016 04:11 # −64
guest 25.10.2016 22:22 # −3
> нет скобок вокруг тела цикла и ифа
Тебя кто так писать научил? Иди мыть рот с мылом.
guest 25.10.2016 22:51 # −3
ну вопще пездос
laMer007 26.10.2016 00:22 # −1
> ну вопще пездос
ок, разрешаю поправить
huesto 26.10.2016 00:27 # −1
Holly_Shit 26.10.2016 01:00 # −1
Святое гуано
Steve_Brown 26.10.2016 12:04 # −1
kurwa 26.10.2016 02:26 # −1
nihau 26.10.2016 15:34 # −1
kurwa 26.10.2016 23:20 # −74