powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / вывод в файлы в двоичном режиме, cpp- шные классы +
36 сообщений из 36, показаны все 2 страниц
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971099
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в принципе в файле получается два целых, но не нравится
необходимость мои массивы преобразовывать к указателю на символы.
Похоже я не могу взять правильный класс?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	ofstream fout("1.bin", ios::binary);
        ....

        int y[2] = {1,2};
        char * py =  (char *)y;

        fout.write(py, sizeof(int)*2);
 
        fout.close();
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971100
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всю жизнь делал через FILE *, а тут приспичило по сиплюсовски.
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971101
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще не пятница...
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971108
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizне нравится необходимость мои массивы преобразовывать к указателю на символы.


Нет, всё верно, преобразование заложено by design.
Вместо void* они просто использовали char*.
Оба байт -- так что всё едино.
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971121
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
1.
спасибо, полегчало на душе
(а то я уже начал склонятся к состоянию
стою на асфальте я в лыжи обутый...).
2
тю, а перегрузок
write (int * pint, size_t numberOfElementsOfIntArraY );
нету?
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971143
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
	strstream buf((char*)y, sizeof y, 0);
	fout << buf;
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971162
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не, что то бред получается (
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971184
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зимарглне, что то бред получается (
Да, нолик лишний )
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971189
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz,

Напишите простую обертку, чтобы записывать бинарное представление переменных в поток не морочась преобразованиями.
Типа какого (только отладить)
Код: plaintext
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.
template <typename T>
struct as_bin_impl {
  as_bin_impl(const T& val)
    : m_val(val) 
  {
  }
  template <typename Stream> friend Stream& operator<<(Stream& stream, const as_bin_impl& val) {
    stream.write((const char*)&val.m_val, sizeof(val.m_val));
    return stream;
  }
  private:
  const T& m_val;
};

template <typename T> as_bin_impl<T> as_bin(const T& val)
{
    return as_bin_impl<T>(val);
}


...

	ofstream fout("1.bin", ios::binary);
        ....

        int y[2] = {1,2};

        fout << as_bin(y);
 
        fout.close();



ЗЫ. А может такое есть и в стандартной библиотеке, не в курсе.
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971279
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz.).
2
тю, а перегрузок
write (int * pint, size_t numberOfElementsOfIntArraY );
нету?

нету, мы же не на Java пишем....
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971314
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskytchingiz,

Напишите простую обертку, чтобы записывать бинарное представление переменных в поток не морочась преобразованиями.
Типа какого (только отладить)
Код: plaintext
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.
template <typename T>
struct as_bin_impl {
  as_bin_impl(const T& val)
    : m_val(val) 
  {
  }
  template <typename Stream> friend Stream& operator<<(Stream& stream, const as_bin_impl& val) {
    stream.write((const char*)&val.m_val, sizeof(val.m_val));
    return stream;
  }
  private:
  const T& m_val;
};

template <typename T> as_bin_impl<T> as_bin(const T& val)
{
    return as_bin_impl<T>(val);
}


...

	ofstream fout("1.bin", ios::binary);
        ....

        int y[2] = {1,2};

        fout << as_bin(y);
 
        fout.close();



ЗЫ. А может такое есть и в стандартной библиотеке, не в курсе.

Код: plaintext
1.
2.
3.
4.
FILE f* = fopen("1.bin", "w");
int y[] = {1,2};
fwrite(y, 1, sizeof(y), f);
fclose(f);



Вывод: С++ намного проше и удобнее чем Си.
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971644
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White_Owl++
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971767
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Код: plaintext
1.
2.
3.
4.
FILE f* = fopen("1.bin", "w");
int y[] = {1,2};
fwrite(y, 1, sizeof(y), f);
fclose(f);

Вывод: С++ намного проше и удобнее чем Си.ошибочка в код закралась, правда ;)
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971809
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВывод: С++ намного проше и удобнее чем Си.
Согласен.
Вот это
Код: plaintext
1.
fout << as_bin(y);


намного проще, понятнее и удобнее, чем
Код: plaintext
1.
fwrite(y, 1, sizeof(y), f);


Особенно, если учесть что в реальной программе должна быть обработка ошибок, и в С надо каждый write оборачивать в эту обработку, а в С++ достаточно в конце серии write один раз проверить ошибку.

egorychошибочка в код закралась, правда ;)
А в чем ошибка?
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971816
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА в чем ошибка?есть уверенность, что sizeof( int ) == 1? у меня - нет ))
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971829
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychAnatoly MoskovskyА в чем ошибка?есть уверенность, что sizeof( int ) == 1? у меня - нет ))
А там не size а кол-во.
Главное чтобы 2 и 3 аргументы при перемножении давали размер записываемого буфера.
В данном случае это так.
Конечно, обычно принято вначале указывать размер элемента, а потом количество, как это описано в прототипе функции, но от перемены мест произведение не меняется.
Меняется только код ошибки. Но если проверять на != 0 то и это не имеет значения.
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971837
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyне имеет значения.
Но, согласен, данный пример демонстрирует отличную читабельность кода на С
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971871
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНо, согласен, данный пример демонстрирует отличную читабельность кода на С да, я именно это и имел ввиду ))
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971969
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На гипотетическом json-dsl

Код: javascript
1.
2.
3.
4.
5.
{
    "1.bin": {
		"write": [1,2]
	}
}
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971978
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Плохой АПИ. Не хватает идемпотентности. Декларативный язык все-таки
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38971985
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед DSL не ставится задач идемпотентностей. Это первое.

И второе... я-же не раскрыл тайну свойства "write"... возможно оно
не меняет вселенную а создаёт новую....
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972044
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПеред DSL не ставится задач идемпотентностей.
Перед DSL не ставится никаких задач - это просто аббревиатура ))
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972046
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох уж эти пятничные дискурсы...
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972054
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОх уж эти пятничные дискурсы...это вам не простые числа в системе счисления Фибоначчи находить, это вечные ценности ;)
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972060
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я вить систему счисления Фибоначчи пилил. Мдя.
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972242
oop_forever
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlAnatoly Moskovskytchingiz,

Напишите простую обертку, чтобы записывать бинарное представление переменных в поток не морочась преобразованиями.
Типа какого (только отладить)
Код: plaintext
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.
template <typename T>
struct as_bin_impl {
  as_bin_impl(const T& val)
    : m_val(val) 
  {
  }
  template <typename Stream> friend Stream& operator<<(Stream& stream, const as_bin_impl& val) {
    stream.write((const char*)&val.m_val, sizeof(val.m_val));
    return stream;
  }
  private:
  const T& m_val;
};

template <typename T> as_bin_impl<T> as_bin(const T& val)
{
    return as_bin_impl<T>(val);
}


...

	ofstream fout("1.bin", ios::binary);
        ....

        int y[2] = {1,2};

        fout << as_bin(y);
 
        fout.close();



ЗЫ. А может такое есть и в стандартной библиотеке, не в курсе.

Код: plaintext
1.
2.
3.
4.
FILE f* = fopen("1.bin", "w");
int y[] = {1,2};
fwrite(y, 1, sizeof(y), f);
fclose(f);



Вывод: С++ намного проше и удобнее чем Си.
- если им не занимаются рукожопые писатели на чистом С
Код: plaintext
1.
2.
3.
4.
	ofstream fout("1.bin", ios::binary);
 int y[2] = {1,2};
 fout<<y[0]<<y[1];
 fout.close(); 
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972249
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oop_forever- если им не занимаются рукожопые писатели на чистом С

Вообще-то, перед тем как писать программу принято прочесть и понять техзадание ))
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972276
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oop_forever,

Код: plaintext
1.
fout<<y[0]<<y[1];



а что, если мильён целых - то нужно мильён операторов << использовать?

P.S. Si tacuisses, philosophus mansisses.
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972345
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oop_forever- если им не занимаются рукожопые писатели на чистом С
Код: plaintext
1.
2.
3.
4.
	ofstream fout("1.bin", ios::binary);
 int y[2] = {1,2};
 fout<<y[0]<<y[1];
 fout.close(); 



рукожопным писателям на грязном с++ видимо, невдомек,
что после работы указанной программы в файле 1.bin
будет не 8 байт с целыми числами 1 и 2, а два байта с символами '1' и '2'
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972346
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskytchingiz,

Напишите простую обертку, чтобы записывать бинарное представление переменных в поток не морочась преобразованиями..
сенкс за идею. Меня как человека, измученного нарзаном фортраном устроило
так


Код: plaintext
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.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
using namespace std;

class oXstream : public ofstream{
public:
//
	oXstream(char *_Filename, ios_base::openmode _Mode) : ofstream(_Filename, _Mode){};
	template<typename TYPE> void write(TYPE* val, size_t count){
		ofstream::write((char*)val, count*sizeof(TYPE));
	}
};


class iXstream : public ifstream{
public:
//
	iXstream(char *_Filename, ios_base::openmode _Mode) : ifstream(_Filename, _Mode){};
	template<typename TYPE> void read(TYPE* buf, size_t count){
		ifstream::read((char*)buf, count*sizeof(TYPE));
	}
};



void main(){
	int b[] = { 1, 2, 3 };
	double c[] = { 3.14, 2.71 };
	oXstream out("1.bin", ios::binary);
	out.write(b, sizeof(b)/sizeof(int));
	out.write(c, sizeof(c)/sizeof(double));
	printf ("28 bytes has been outputed");
	out.close();
	
	b[1]=200;
	c[1]=200.;

	iXstream in("1.bin", ios::binary);
	in.read(b, 3);
	cout << b[0] << ' ' << b[1]<< ' ' << b[2];
	in.read(c, 2);
	cout <<"\n"<< c[0] << ' ' << c[1];


}
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972370
oop_forever
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonoop_forever,

Код: plaintext
1.
fout<<y[0]<<y[1];



а что, если мильён целых - то нужно мильён операторов << использовать?

P.S. Si tacuisses, philosophus mansisses.
использовать цикл, если не напрягают нанопотери производительности.
Увы нельзя сделать отдельную обработку для T* и T[n].
Поэтому нужно юзать оболочку:

Код: plaintext
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.
template<typename T>
class Slice
{
public:
	Slice(int start_i,int right_nargin_i)
};

template<typename T>
Slice<T> slice(T *ar,int n)
{
	return Slice<T>(0,n);
}

template<typename T>
Slice<T> slice(T *ar,int start_i,int right_nargin_i)
{
	return Slice<T>(start_i,right_nargin_i);
}

template<typename T>
ofstream& operator<<(ofstream& stm,const Slice<T> &);

....

ofstream fout("1.bin", ios::binary);
int y[2] = {1,2};
fout<<slice(y,2);
fout.close(); 
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972374
oop_forever
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oop_forevermaytonoop_forever,

Код: plaintext
1.
fout<<y[0]<<y[1];



а что, если мильён целых - то нужно мильён операторов << использовать?

P.S. Si tacuisses, philosophus mansisses.
использовать цикл, если не напрягают нанопотери производительности.
Увы нельзя сделать отдельную обработку для T* и T[n].
Поэтому нужно юзать оболочку:

Код: plaintext
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.
template<typename T>
class Slice
{
public:
	Slice(T* ar, int start_i,int right_margin_i)
};

template<typename T>
Slice<T> slice(T* ar,int n)
{
	return Slice<T>(ar,0,n);
}

template<typename T>
Slice<T> slice(T* ar,int start_i,int right_nargin_i)
{
	return Slice<T>(ar,start_i,right_nargin_i);
}

template<typename T>
ofstream& operator<<(ofstream &stm,const Slice<T> &);

....

ofstream fout("1.bin", ios::binary);
int y[2] = {1,2};
fout<<slice(y,2);
fout.close(); 


поправил
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972380
oop_forever
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tchingizoop_forever- если им не занимаются рукожопые писатели на чистом С
Код: plaintext
1.
2.
3.
4.
	ofstream fout("1.bin", ios::binary);
 int y[2] = {1,2};
 fout<<y[0]<<y[1];
 fout.close(); 



рукожопным писателям на грязном с++ видимо, невдомек,
что после работы указанной программы в файле 1.bin
будет не 8 байт с целыми числами 1 и 2, а два байта с символами '1' и '2'
не придирайтесь к мелочам. Создателей стандартной библиотеки тоже нельзя назвать в полной мере пряморукими,
поэтому я её не использую. В Qt(QDataStream) такой трюк работает.
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972410
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поставить в один ряд White_Owl и Создателей (Кернигана Ритчи) это не мелочь,
на его месте я бы начал гордиться
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38972415
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizпоставить в один ряд White_Owl и Создателей (Кернигана Ритчи) это не мелочь,
на его месте я бы начал гордитьсяДа я такой!
...
Рейтинг: 0 / 0
вывод в файлы в двоичном режиме, cpp- шные классы +
    #38974795
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <fstream.h>
#include <strstream.h>

void main()
{

	ofstream fout("1.bin", ios::binary);

        int y[] = {1,2};

	strstreambuf buf((char*)y, sizeof y);
	fout << &buf;

        fout.close();
}


Поправил. Так все же работает.
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / вывод в файлы в двоичном режиме, cpp- шные классы +
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]