У меня есть файл с int числом в нем. Значит в памяти этот файл занимает 4 байта. Так вот, как мне прочитать эти 4 байта и записать в массив char buffer[4] каждый байт?
Также еще вопрос, как мне прочитать биты этого же файла?
P.S. Простите если это глупый вопрос, только начинаю в c++, знаю как читать и записывать в файл и все.
Ну, если это бинарный файл, то вроде того:
int main(int argc, const char * argv[])
{
char buf[sizeof(int)];
ifstream in("filename",ios::binary);
in.read(buf,sizeof(int));
}
Если вы записывали int
в текстовый файл - типа
ofile << i;
то что вы хотите прочесть в buf
- текстовое же представление числа или внутреннее бинарное представление int
?
Update
По результатам беседы в комментариях -
ifstream in("filename");
in >> *(int*)buf;
Ну, или, если тут будут говорить про strict-aliasing - то
ifstream in("filename");
int i;
in >> i;
memcpy(buf,&i,sizeof(int));
У меня как-то была подобная задача: сделать цифровую сортировку для чисел. Чтобы не делить на 10, или типа того, я решил использовать байты, а для этого я воспользовался указателями. Для этого вам понадобится два указателя: на char и на int (можно обойтись без последнего). Берете адрес нужного вам числа и присваиваете его указателю на char, для этого используйте static_cast. После этого просто разыменовываете указатель и значение записываете в массив. После этого инкреминируете указатель и проделываете все заново. Количество повторений равно sizeof (int).
Для начала считайте число в переменную типа uint32_t - это 4-байтное число, а дальше вам потребуются побитовые операции. Вот примерный код. Результат записывается в конец. Для наглядности вывожу в хексах:
#include <stdio.h>
#include <stdint.h>
#define BUF_SIZE 4
int main()
{
// считали число в переменную x
uint32_t x = 255;
uint8_t buffer[BUF_SIZE];
int i;
for (i = 0; i < BUF_SIZE; ++i)
{
buffer[BUF_SIZE - 1 - i] = (x >> (8 * i)) & 0xff;
}
for (i = 0; i < BUF_SIZE; ++i)
{
printf("%02X", buffer[i]);
if (i != (BUF_SIZE - 1) )
{
printf(" ");
}
}
printf("\n");
return 0;
}
Результат:
00 00 00 FF
Один из вариантов:
using namespace std;
string i; // если файл бинарный
int i; // если текстовый
//т.е. тип переменной, куда будем читать, зависит от того, текстовый файл или бинарный
// остальной код одинаков для обеих случаев
file >> i;
const size_t n = sizeof(int);
bitset<n * 8> b(i);
cout << b;
string s = b.to_string();
for (size_t i = n * 8, k = 1; i >= 8; i -= 8, ++k) {
bitset<8> bch(s.substr(i - 8, i));
cout << endl << "Бинарный вид бита номер " << k <<'\t' << bch
<< endl << "числовой вид бита номер " << k <<'\t' << bch.to_ulong();
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно в CXX-extension объявить метод, который принимал бы блок Ruby (чтобы прогресс задачи отслеживать)Использую биндинги RICE
создаю, заполняю и вывожу двумерные массивыНо почему-то числа в первой строке и в первом столбце одинаковые
У меня имеется программа - тестирование,в которой 10 вопросовКаждый вопрос в отдельной форме
В конструкторе инициализируются локальные переменныеХотелось бы использовать их в других методах класса, какие есть методы решения данной...