LINUX.ORG.RU

вот эта прога извлекает побайтово, т.е. ансигнед чар и пишет в 
строку, соответственно, а оказалось что в файле старший и младший байт, т.е. 16 бит данные.

/*read*/
  FILE * fp;
  int l = 2895360;
  int k = 1447680;
  unsigned short bbb[l];
  unsigned short * pix;
  pix=malloc(l*sizeof(*pix));
  fp = fopen ("1113721721.raw", "r");
  int n=0; int c =0;
  while (n < l) {
    if (n%2==0){
      bbb[n] = getc (fp);
      pix[с]=bbb[n];
    c++;
    }
    n++;
  }
//  for (n=0;n<k;n++){
//    if (n%2==0) printf("%d\n",pix[n]);
//  }
  free (bbb);
/*end read*/


thx!!!

vilfred ☆☆
() автор топика

man fread:

unsigned short s;

fread(&s, sizeof(unsinged short), 1, fptr);

кстати, надо быть увереным, что sizeof(unsinged short) == 2. Как я понял, это верно для 32 и 64-битных архитектур.

Keiko
()
Ответ на: комментарий от Selecter

да я уж сделал все:

  FILE * fp;
  fp = fopen (argv[1], "r");
  fread(&pix, size, 2, fp);

эта сволочь, оказывается, работает так, первый аргумент - куда 
считывать, второй аргумент - сколько считывать, третьий - по сколько 
считывать, четверый откуда считывать

теперь что написано в man fread:

ОПИСАНИЕ
       Функция fread считывает элементы данных nmemb (с размером каждого size байтов) с потока,
       на который указывает stream, и сохраняет их в позиции, на которую указывает ptr.

как этот ман понять одному богу ясно.

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

>как этот ман понять одному богу ясно.
ну что тебе ламо не ясно?

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

читает nmemb элементов - перевожу число элементов - значение nmemb

каждый размером size - т.е. каждый элемент имеет размер равный значению size,
т.е. всего прочитается

nmemb*size байтов.

и все что прочитали записывается в область памяти на которую указывает ptr,

т.е.

unsigned short t;
fread((void *)&t, sizeof(t), 1, f);

ты по русски с трудом читаешь?

anonymous
()
Ответ на: комментарий от anonymous

> ну что тебе ламо не ясно?

вообще, многое не ясно.

> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); > читает nmemb элементов - перевожу число элементов - значение nmemb

что такое nmemb, почему там буква b на конце стоит? это значит байт или бит? А первую букву n понимать в смысле nmap или как еще?

> каждый размером size - т.е. каждый элемент имеет размер равный > значению size, т.е. всего прочитается

а что такое size? всмысле sizeof(* char), а это значит, чо надо подумать о том, сколько char занимает в стеке(а каком стеке? яж не знаю, что их там не 20 штук на 20 случаев или еще что-то).

> nmemb*size байтов.

а каков физический смысл произведения этих двух величин? короче говоря, так просто не въехать.

> и все что прочитали записывается в область памяти на которую > указывает ptr, > т.е. > unsigned short t; > fread((void *)&t, sizeof(t), 1, f); > ты по русски с трудом читаешь?

по русски я беру токовый словать ожегова или даля, там толкование слов есть... Но это, в принципе, дело опыта, а я в сях ноль полный.

Ну, короче, теперь вроде бы ясно что к чему... thx! Спасибо, что хоть маны по русски есть...

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

>>что такое nmemb, почему там буква b на конце стоит? это значит байт или бит? А первую букву n понимать в смысле nmap или как еще?

:))))) Ты скажи, честно, курил ? Завтра же на работу!!

Перевожу - nmemb = Number of MEMBers. ни 'n' ни 'b' тут ни при чём :)

>>а что такое size

размер в байтах


Смысл fread в том, чтобы можно было читать МАССИВЫ любых данных - чисел int, char, long, структур.

Keiko
()
Ответ на: комментарий от vilfred

> не, я реально никогда не писал на С!...

Да, С тяжелый, чего там... А на чем ты писал, если не секрет? С чего начинал свое обучение?

murla
()
Ответ на: комментарий от murla

java :) броуновское движение на Symantec Visual Cafe2.0 кажись, в далеком 1996 году :)

vilfred ☆☆
() автор топика
Ответ на: комментарий от Keiko

> Смысл fread в том, чтобы можно было читать МАССИВЫ любых данных - чисел int, char, long, структур...

... и "переносимое" решение должно выглядесть примерно так:

#define NELEMS(array) (sizeof(array)/sizeof(array[0]))

/* x[], fp declarations ... */

fread(x, sizeof(x[0]), NELEMS(x), fp);

murla
()
Ответ на: комментарий от murla

fread(x, sizeof(x[0]), NELEMS(x), fp);

насколько я понял из того как оно работает на выходе x - куда читает, переменная unsigned short. вторым аргументом идет число пар байт, находящееся в файле третьим аргументом идет число считываемых в один элемент short fp то, что в перле называется файловым дескриптором

если я указываю вторым аргументом не 1100000 (число штук 16 бит байтов во всем файле), а число 2, то на выходе не получается картинка, генерирумая из 16бит IBM PC raw файла.

vilfred ☆☆
() автор топика
Ответ на: комментарий от vilfred

Непосредственно с дескрипторами файлов (переменная типа int) работает системный вызов read() (man 2 read). А FILE* (здесь могу наврать) - указатель на структуру, которая содержит в числе прочего этот дескриптор. fread - ф-ция более высокого уровня, буферизующая поток и использующая read(). Как именно устроена эта структура - тебе это надо? :)

murla
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.