Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > адресная арифметика жесткого диска


Автор: GIK 5.1.2007, 18:19
Всем доброго времени суток. 
Меня интересует адресная арифметика жесткого диска. Долго думал, почему в книгах по  С++ нет информации, решил освоить винду, купил книгу, но пока ничего не нашел...
Решил по эксперементировать с указателями с типом FILE.
Код

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream.h>
using namespace std;
       /*
 */
int main(int argc, char* argv[])
{ char ch;
  FILE *f[3];

  f[0]=fopen("C:\\test\\test.txt", "rb");
  if(!f[0]){
  cout<<"Not File"<<endl;
  }
  else{cout<<f[0]<<endl;
  }

  f[1]=fopen("C:\\test\\test2.txt", "rb");
  if(!f[1]){
  cout<<"Not File"<<endl;
  }
  else{cout<<f[1]<<endl; 
  }

  f[2]=fopen("C:\\test\\test3.txt", "rb");
  if(!f[2]){
  cout<<"Not File"<<endl;
  }
  else{cout<<f[2]<<endl; 
   f[2]+=1; //Попробуем увеличить адрес.
  cout<<f[2]<<endl;
  }


 cin>>ch;
         return 0;
}



Почемуто разница между адресами файлов = 24, если даже в файле инфы больше, и почему то при увеличении указателя, тоже происходит увеличение на 24. 
Хотелосб бы разобратся что и как там происходит.   

Автор: W4FhLF 5.1.2007, 19:41
Арифметика жёсткого диска напрямую зависит от файловой системы, ну само собой не учитывая основополагающих понятий о хранении информации. Могу скинуть полную спецификацию FAT32(на русском), а вот по NTFS даже не знаю, что посоветовать. Ну и конечно же Глава 12 величайшей книги, библии системного программиста, "Внутреннее устройство Windows" Марк Руссинович, Девид Соломон.

Автор: GIK 5.1.2007, 20:34
Цитата(W4FhLF)

Могу скинуть полную спецификацию FAT32(на русском), 

Буду рад, надоже с чего то копать.

Автор: W4FhLF 5.1.2007, 20:49
http://fearus.narod.ru/FAT32.rar

Автор: BreakPointMAN 5.1.2007, 23:51
Цитата(GIK @  5.1.2007,  19:19 Найти цитируемый пост)
Меня интересует адресная арифметика жесткого диска.

Что есть "адресная арифметика жесткого диска" в твоем понимании?  smile 
Цитата(GIK @  5.1.2007,  19:19 Найти цитируемый пост)
Долго думал, почему в книгах по  С++ нет информации

Ответ очевиден: потому что книги по C++. Каким образом язык C++ связан с жесткими дисками и файловыми системами? Язык это язык. Жесткий диск это жесткий диск. Файловая система эта файловая система.
Цитата(GIK @  5.1.2007,  19:19 Найти цитируемый пост)
решил освоить винду, купил книгу, но пока ничего не нашел...

Какую книгу, и что именно ты хочешь в ней найти?..
Цитата(GIK @  5.1.2007,  19:19 Найти цитируемый пост)
Почемуто разница между адресами файлов = 24, если даже в файле инфы больше, и почему то при увеличении указателя, тоже происходит увеличение на 24. 

Между какими адресами файлов?..  Ты понимаешь, что такое "FILE", что такое "FILE *f[3];"? Тебе не  книжка по "адресной арифметике жесткого диска" нужна, а букварь по C++, а, вернее, C... 

FILE - это структура. Ни больше ни меньше. Вот, например, как она определена в файле stdio.h среды программирования Borland C++ Builder:
Код

/* Definition of the control structure for streams
*/
typedef struct
{
        unsigned char  *curp;       /* Current active pointer     */
        unsigned char  *buffer;     /* Data transfer buffer       */
        int             level;      /* fill/empty level of buffer */
        int             bsize;      /* Buffer size                */
        unsigned short  istemp;     /* Temporary file indicator   */
        unsigned short  flags;      /* File status flags          */
        wchar_t         hold;       /* Ungetc char if no buffer   */
        char            fd;         /* File descriptor            */
        unsigned char   token;      /* Used for validity checking */
}       FILE;                       /* This is the FILE object    */

Функция fopen возвращает указатель на экземпляр этой структуры, который в дальнейшем используется функциями типа fclose, fseek, fread, fwrite, fprintf и т.д. Этот указатель ссылается на адрес в оперативной памяти, а вовсе не на какой-то там адрес на поверхности жесткого диска!..

А "FILE *f[3];" - это массив из 3 указателей на структуры типа FILE.
Что касается твоего недоумения, откуда берется число 24... это всего-навсего размер памяти в байтах, занимаемый одной такой структурой.  Можешь выполнить программу:
Код
#include <stdio.h>
#include <conio.h>

int main()
{
   printf("%d",sizeof(FILE));
   getch();
   return 0;
}

На экран будет выведено число "24".

Автор: Dude03 6.1.2007, 00:02
Цитата(W4FhLF @  5.1.2007,  19:41 Найти цитируемый пост)
Арифметика жёсткого диска напрямую зависит от файловой системы, ну само собой не учитывая основополагающих понятий о хранении информации. Могу скинуть полную спецификацию FAT32(на русском), а вот по NTFS даже не знаю, что посоветовать. Ну и конечно же Глава 12 величайшей книги, библии системного программиста, "Внутреннее устройство Windows" Марк Руссинович, Девид Соломон. 

Хелен Кастер "Основы Windows и NTFS" smile Советую прочитать всю
Не менее кстати легендарная... Учитывая то, что предисловие писал Девид Катлер smile . В книги конечно взгляд отличается от взгляда в книге Соломона&Руссиновича, больше сделан упор на философию(ОС smile NT 4.0), но от этого книга ничего не теряет. Короче, must read.

Автор: BreakPointMAN 6.1.2007, 00:10
Еще недавно в издательстве BHV вышла книга "Восстановление данных" © Крис Касперски (подробности http://oz.by/books/more1026905.html):
Цитата
Книга представляет собой пошаговое руководство по восстановлению поврежденных данных на жестких и оптических дисках. Подробно рассмотрена структура популярных файловых систем: NTFS, ext2/ext3, UFS/FFS и др. Описаны автоматические методы восстановления данных для операционных систем Windows и Linux. Приведены способы ручного восстановления, используемые в случае, когда автоматическое восстановление невозможно. Материал сопровождается большим количеством полезных советов и исчерпывающим справочным материалом. На компакт-диске помещены полезные утилиты и исходные коды, приведенные в книге.

Для пользователей ПК

Думаю, что кое-какую информацию по NTFS можно почерпнуть оттуда.

Автор: GIK 6.1.2007, 09:47
BreakPointMAN, спасибо, просветил  smile 

Автор: jonie 6.1.2007, 15:13
Цитата

арифметика жесткого диска.
а по мне это как работает контролер)
Цитата

Что касается твоего недоумения, откуда берется число 24... это всего-навсего размер памяти в байтах, занимаемый одной такой структурой....
ыгы. лучше сказал бы сразу "учить парню надо арифметику с указателями..." потому как lp++ раскрывается компилятором как lp = lp +sizeof(типа на что указывает lp)

по структурам NTFS и прочего можно почитать и в кодах драйверов из nix-ов например...собсна оттуда же и все остальное можно изъять )....

Автор: GIK 6.1.2007, 20:07
Цитата(jonie)

ыгы. лучше сказал бы сразу "учить парню надо арифметику с указателями..." потому как lp++ раскрывается компилятором как lp = lp +sizeof(типа на что указывает lp)

Ну уж за полного лоха то не держите меня...
Хотя.. может я и полный лох....
Почему, у меня к примкру, адрес указателя на файл = 845 833 048, или 845 миллионов 833 тысячи 48. А оперативы у меня 512 миллионов?

Добавлено @ 20:08 
Код

                         #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream.h>
using namespace std;


int main(int argc, char* argv[])
{ char ch;
  FILE *f[3];
  f[0]=fopen("C:\\test\\test.txt", "rb");
  if(!f[0]){
  cout<<"Not File"<<endl;
  }
  else{cout<<f[0]<<endl; //vikitet adress

  };

  f[1]=fopen("C:\\test\\test2.txt", "rb");
  if(!f[1]){
  cout<<"Not File"<<endl;
  }
  else{cout<<f[1]<<endl; //vikitet adress
  }
  f[2]=fopen("C:\\test\\test3.txt", "rb");
  if(!f[2]){
  cout<<"Not File"<<endl;
  }
  else{cout<<f[2]<<endl; //vikitet adress

  }      int i=120;
  int *ppp = &i;
  printf("%d", ppp);
 cin>>ch;
         return 0;
}

Автор: MAKCim 6.1.2007, 21:22
Цитата

Почему, у меня к примкру, адрес указателя на файл = 845 833 048, или 845 миллионов 833 тысячи 48. А оперативы у меня 512 миллионов?

У тебя виртуальный адрес во flat 32-ом адресном пространстве, который отображается на физический в пределах твоих 512Мб
http://forum.vingrad.ru/index.php?showtopic=128468&view=findpost&p=970029

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)