Простенький вопрос по С++

Модератор: Модераторы разделов

ForrestGump
Сообщения: 13
ОС: Debian 2.6.18-6-k7

Простенький вопрос по С++

Сообщение ForrestGump »

Вопрос действительно простой до безобразия и возник просто в связи с тем, что ожидаемый и полученный результат, к сожалению, не совпадают.
Вобщем мне надо считать большой бинарник и единственное, что мне о нем известно, - это что значения в него записаны одно за другим без пробелов, по два байта на число.
Считать надо в массив естественно.

Вопрос заключается в следующем. Есть вот такой страшенный цикл :).

Код: Выделить всё

for(int i=0; i<sAr; ++i)
{
  readf.read((char*)&a[i],2);
}


Как я понимаю, описание функции считывания в буфер выглядит так: read(buff,buff_size); - где buff - это собственно буфер, в который идет чтение, а buff_size - размер буфера в байтах. То есть 2-ка после запятой в коде подразумевает, что в буфер больше 2-ух байт не влезет и чтение в каждый элемент массива происходит по 2 байта. Массив определен как int (целочисленный, это тоже известно). Дак вот вапрос в следующем: правильно ли я думаю: выполняется сия операция? (просто достало уже, там на числа не по два байта получаются, ибо они бредовые) Если нет, то подскажите плиз, в чем загвоздка.
Предвижу, что возможно проблема в (char*)& передачи типа.
Вобщем как мог сформулировал проблему...
iУведомление от модератора Aectann
Большая просьба стараться писать грамотно, расставлять знаки препинания. Если не умеет, используйте встроенную в браузер проверку орфографии.
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Простенький вопрос по С++

Сообщение Женя Подсыпальников »

ForrestGump писал(а):
08.05.2009 11:52
Массив определен как int (целочисленный, это тоже известно). Дак вот вапрос в следующем пральна ли я думаю выпольняется сия опеация?


Можа и правильно... :)

Можа, к бреду ведёт неинициализированный массив
да разница опромеж sizeof(short) и sizeof(int) ? :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: Простенький вопрос по С++

Сообщение Denjs »

Есть ещё такой замечательный ресурс http://forum.vingrad.ru/

Давайте всех по программным вопросам отсылать именно туда.
А там можно сказать что по вопросам Линукс - отсылать сюда.

Нечего расплываться по теме и терять спецификацию.
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: Простенький вопрос по С++

Сообщение Denjs »

по топику - если приводите кусок текста, хоть описывайте типы переменных которые у вас упоминаются.
что такое "readf"? "a"?
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
shevan
Сообщения: 992
ОС: Debian, Puppy

Re: Простенький вопрос по С++

Сообщение shevan »

ForrestGump
Для начала изучите русский язык, а потом C++

Иначе вас не поймут, и не смогут/не захотят помочь
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Простенький вопрос по С++

Сообщение serzh-z »

ForrestGump
Вместо "++i" нужно сделать "i += 2".
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Простенький вопрос по С++

Сообщение drBatty »

ForrestGump писал(а):
08.05.2009 11:52
Вопрос заключаеться в следующем.Есть вот такой страшенный цикл

нету цикла
не понятно, что такое readf и a
и вобще ничего не понятно. если a - целое([] не перезагружены, и + это плюс), то действительно, почему на 1 перемешаем? если по 2 байта читать надо? Или?
вопрос больше про астрал и телепатию ИМХО ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
ForrestGump
Сообщения: 13
ОС: Debian 2.6.18-6-k7

Re: Простенький вопрос по С++

Сообщение ForrestGump »

Код:

int a[sAr]// сиё массив int sAr// переменая которой задаеться размер массива ifstream readf; readf.open("file.bin", ios::binary);// читаемый файл


по 1 шагаем потаму что цикл идет по индексам элементов массива, в которые по одному 2-ух байтовому числу и записываем.
зачем шаг в 2 делать? Функция read((char*)&a[i],2) задает буфер в который читаем тоесть a[i] элемент массива и размер его в байтах - 2.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Простенький вопрос по С++

Сообщение drBatty »

ForrestGump писал(а):
08.05.2009 23:42
Функция read((char*)&a[i],2) задает буфер в который читаем тоесть a[i] элемент массива и размер его в байтах - 2.
лень смотреть по таблицам порядок группировки и приоритет. но думаю, вы ошиблись. ;)
сделайте указатель на char*, и читайте в него. А проще

Код: Выделить всё

short a[sAr]

подразумевается, что ваш short в 2 байта.
Кроме того, я бы не стал делать такие массивы, они недавно появились, и ИМХО ещё не работают должным образом. Делайте обычные, где sAr это константа

Код: Выделить всё

#define sAr 10
short a[sAr]

А читать по 2 байта 10 чисел можно простой fread(). Тогда и цикл не нужен, и все эти [] и &, и спорные ++
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: Простенький вопрос по С++

Сообщение Red User »

ForrestGump писал(а):
08.05.2009 11:52
(просто достало уже там на число не по два байта получаются ибо они бредовые)

Ты записываешь только первые 2 байта в int-е, остальная его часть не меняется, там мусор, если ты массив не забил нулями до чтения.
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
Аватара пользователя
XLBaron
Сообщения: 12
ОС: Ubentu

Re: Простенький вопрос по С++

Сообщение XLBaron »

ForrestGump писал(а):
08.05.2009 11:52
Вапрос действитель прастой до безобрязия и возник просто в связи с тем что ожидаемый и полученный результат к сожалению не совпадают.
Вобщем мне нада считать большой бинарник и единственное что мне о нем известно это что значения в него записаны одно за другим без пробелов по два байта на число.
Считать надо в массив есессно.

Вопрос заключаеться в следующем.Есть вот такой страшенный цикл :).

Код:

for(int i=0; i<sAr; ++i) { readf.read((char*)&a[i],2); }


Kak я понимаю описание функции считываня в буфер выглядит так read(buff,buff_size); - где buff это собсна буфер в который идет чтение а buff_size размер буфера в байтах. То есть 2-ка после запятой в коде подразумевает что в буфер больше 2-ух байт не влезет и чтение в каждый элемент массива происходит по 2 байта. Массив определен как int (целочисленный, это тоже известно). Дак вот вапрос в следующем пральна ли я думаю выпольняется сия опеация?(просто достало уже там на число не по два байта получаются ибо они бредовые) Если нет то падскажите плиз в чем загвостка.
Предвижу что возможно проблема в (char*)& предачи типа.
Вобщем как мог сформулировал проблему...

делай то, куда читается дисятичным число, а потом преобразуй в целое
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Простенький вопрос по С++

Сообщение drBatty »

XLBaron писал(а):
11.05.2009 18:03
делай то, куда читается дисятичным число, а потом преобразуй в целое

в С нет таких чисел.
есть только char short int long
и ещё float и double
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
ForrestGump
Сообщения: 13
ОС: Debian 2.6.18-6-k7

Re: Простенький вопрос по С++

Сообщение ForrestGump »

drBatty писал(а):
09.05.2009 00:24
ForrestGump писал(а):
08.05.2009 23:42
Функция read((char*)&a[i],2) задает буфер в который читаем тоесть a[i] элемент массива и размер его в байтах - 2.
лень смотреть по таблицам порядок группировки и приоритет. но думаю, вы ошиблись. ;)
сделайте указатель на char*, и читайте в него. А проще

Код: Выделить всё

short a[sAr]

подразумевается, что ваш short в 2 байта.
Кроме того, я бы не стал делать такие массивы, они недавно появились, и ИМХО ещё не работают должным образом. Делайте обычные, где sAr это константа

Код: Выделить всё

#define sAr 10
short a[sAr]

А читать по 2 байта 10 чисел можно простой fread(). Тогда и цикл не нужен, и все эти [] и &, и спорные ++


Спасибо за совет, вканало инициализировать массив как short, значения вроде как нада получились буду обсчитывать :).
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Простенький вопрос по С++

Сообщение Женя Подсыпальников »

ForrestGump писал(а):
14.05.2009 21:02
...вканало инициализировать массив как short, значения вроде как нада получились буду обсчитывать :).


Остаткам бреда вканает пойти погулять,
когда в гости пожалует разница -

опромеж декларацией и инициализацией, вроде... :)
Пойдём на рыбалку !
Спасибо сказали: