быдлокодер
1723 / 910 / 106
Регистрация: 04.06.2008
Сообщений: 5,666
1

Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла?

21.08.2011, 20:16. Показов 19272. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ничего нельзя. Итак, новичкам напомню, что после выполнения кода
C++
1
FILE* f= fopen ("file.txt", "w");
в переменной f содержится указатель на структуру FILE. Если файл file.txt открыт корректно, то, по логике вещей *f некоторым образом должна описывать открытый file.txt. Размер там, имя, адрес в памяти, куда файл спроецирован хоть что-то. Так, в инете я не нашёл по этой структуре ничего, но в инклудах нашёл. Вот описание структуры FILE (stdio.h)
C++
1
2
3
4
5
6
7
8
9
10
11
typedef struct _iobuf
{
    char*    _ptr;
    int    _cnt;
    char*    _base;
    int    _flag;
    int    _file;
    int    _charbuf;
    int    _bufsiz;
    char*    _tmpfname;
} FILE;
И хотя имена мне мало о чём говорят, я уверен, что обратясь к полям этой структуры увижу нечто- я перечислял уже что. Итак, вот код:
C++
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
#include <iostream>
using namespace std;
int main () {
 
 FILE* f;
 char text []= "etot text bydet zapisan v file\n";
 char text_0 [sizeof(text)];
 
//Записываем текст в файл 
 f= fopen ("fail.txt", "w");
 
 //Если нормально заприсалось, то
 if (fprintf(f, "%s", text)+ 1== sizeof(text)) {
  
  //Закрываем файл
  fclose(f);
 
  //... и открываем файл на чтение
   f= fopen ("fail.txt", "r");
 
   //Смотрим, чё за структуру мы получаем при открытии файла
   if (f) {   
    printf ("f._ptr= %s\n", f->_ptr);
    printf ("f._cnt= %d\n", f->_cnt);
    printf ("f._base= %s\n", f->_base);
    printf ("f._flag= %d\n", f->_flag);
    printf ("f._file= %d\n", f->_file);
    printf ("f._charbuf= %d\n", f->_charbuf);
    printf ("f._bufsiz= %d\n", f->_bufsiz);
    printf ("f._tmpfname= %s\n", f->_tmpfname);
   }
 
   //смотрим, чё у нас в файле
   printf ("%s", fgets (text_0, sizeof(text_0), f));
 
 }
 
 getchar ();
 return 0;
}

Ну то есть программно создаёт текстовый файл, наполняем его содержанием, открываем на чтение. И вот вывод:
C++
1
2
3
4
5
6
7
8
9
f._ptr= (null)
f._cnt= 0
f._base= (null)
f._flag= 1
f._file= 3
f._charbuf= 0
f._bufsiz= 4096
f._tmpfname= (null)
etot text bydet zapisan v file
Странно, строковые данные, в которых я ожидал увидеть имя файла или его содержание обнулены. Адреса какого-нибудь в памяти тоже не наблюдается. Те не менее откуда-то из этой структуры всё-таки выуживается строка etot text bydet zapisan v file
Кто-нибудь задумывался, как это происходит?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2011, 20:16
Ответы с готовыми решениями:

Функция внутри структуры использует указатель, как поле этой структуры
Коротко, есть класс A, описан в файле A_class.h ну и реализованы функции в A_class.cpp, есть файл...

Оптимизация кода, структуры базы, или что еще можно сделать что бы быстрее работало!?
Всем привет! Господа, выручайте. Не пойму как еще оптимизировать... Есть куча связанных таблиц....

Чтение структуры из файла, глобальный указатель
Помогите, пожалуйста! имеется код, имеется файл. код то работает, то нет. причем код при этом не...

Структуры, массивы структур (как можно присваивать(инициализировать) значения полям структуры)
Есть у меня вот такая структура, например struct Subject { int cost; int Volume; }; Потом...

6
403 / 359 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
21.08.2011, 20:20 2
читай K&R там про это написано
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.08.2011, 20:23 3
а кто сказал, что в этой структуре нужно имя?
там текущее состояние файла описывается.
0
быдлокодер
1723 / 910 / 106
Регистрация: 04.06.2008
Сообщений: 5,666
21.08.2011, 20:38  [ТС] 4
aram_gyumri, а где там что написано?
Так-то я нехороший человек, ни одной книги до конца не прочёл. Скучно становится. K&R добил до "интерфейс системы Unix", открытие файлов- тема эта есть, да. Но и только. Периодически обращаюсь к K&R как к справочнику- не встречал. Ткни носом, а?

villu, я где-то говорил ТОЛЬКО ПРО имя?
Вообще вопрос заключается: как на основании полей структуры получить содержание файла. Наверное, нужно его имя или если он спроецирован в память, адрес буфера (а в структуре ничего этого нет). Не?
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.08.2011, 22:11 5
зато там есть индекс, который есть системный хендл, не?
а вообще структура то из виндовс? там немного все не так работает. Например в линукс это выглядит как:
C
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
struct _IO_FILE {
  int _flags;       /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags
 
  /* The following pointers correspond to the C++ streambuf protocol. */
  /* Note:  Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
  char* _IO_read_ptr;   /* Current read pointer */
  char* _IO_read_end;   /* End of get area. */
  char* _IO_read_base;  /* Start of putback+get area. */
  char* _IO_write_base; /* Start of put area. */
  char* _IO_write_ptr;  /* Current put pointer. */
  char* _IO_write_end;  /* End of put area. */
  char* _IO_buf_base;   /* Start of reserve area. */
  char* _IO_buf_end;    /* End of reserve area. */
  /* The following fields are used to support backing up and undo. */
  char *_IO_save_base; /* Pointer to start of non-current get area. */
  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
  char *_IO_save_end; /* Pointer to end of non-current get area. */
 
  struct _IO_marker *_markers;
 
  struct _IO_FILE *_chain;
 
  int _fileno;
#if 0
  int _blksize;
#else
  int _flags2;
#endif
  _IO_off_t _old_offset; /* This used to be _offset but it's too small.  */
 
#define __HAVE_COLUMN /* temporary */
  /* 1+column number of pbase(); 0 is unknown. */
  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];
 
  /*  char* _save_gptr;  char* _save_egptr; */
 
  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};
 
struct _IO_FILE_complete
{
  struct _IO_FILE _file;
#endif
#if defined _G_IO_IO_FILE_VERSION && _G_IO_IO_FILE_VERSION == 0x20001
  _IO_off64_t _offset;
# if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T
  /* Wide character stream stuff.  */
  struct _IO_codecvt *_codecvt;
  struct _IO_wide_data *_wide_data;
  struct _IO_FILE *_freeres_list;
  void *_freeres_buf;
  size_t _freeres_size;
# else
  void *__pad1;
  void *__pad2;
  void *__pad3;
  void *__pad4;
  size_t __pad5;
# endif
  int _mode;
  /* Make sure we don't get into trouble again.  */
  char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)];
#endif
};
 
#ifndef __cplusplus
typedef struct _IO_FILE _IO_FILE;
#endif
 
typedef struct _IO_FILE FILE;
:: надеюсь ничего лишнего не вытащил, а то заблудился в этих define
2
быдлокодер
1723 / 910 / 106
Регистрация: 04.06.2008
Сообщений: 5,666
21.08.2011, 22:17  [ТС] 6
Цитата Сообщение от villu Посмотреть сообщение
зато там есть индекс, который есть системный хендл, не?
не знаю, но за подсказку спасибо, просто я привык что хэндл это HANDLE, а никак не int, надо будет поковыряться как-нибудь
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
21.08.2011, 22:34 7
Цитата Сообщение от kravam Посмотреть сообщение
не знаю, но за подсказку спасибо, просто я привык что хэндл это HANDLE, а никак не int, надо будет поковыряться как-нибудь
в виндовс это void* (HANDLE), в линуксе int
разницы нет - все это число по своему системный идентификатор
в отличии от c++овых потоков видно, что внутренности не специфицированы, а потому компиляторо-зависимые
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2011, 22:34
Помогаю со студенческими работами здесь

Динамические структуры данных, списковые структуры (надо разобраться что делает программа)
дана программа, надо помочь выяснить что в ней делает каждая подпрограмма unit Unit6; ...

Ошибка File not found при открытии текстового файла
Здравствуйте! Пытаюсь открыть файл на чтение следующим образом: Sub Mean() Open...

Помещение структуры в вектор, удаление структуры, изменение элементов структуры
Здравствуйте. Помогите разобраться с тем, как: 1 - находить элементы в векторе зная уникальный...

чему равен указатель текущей позиции файла при его открытии
чему равен указатель текущей позиции файла при его открытии?

Мнение. Что лучше Структуры или Классы?
Ребят, вопрос такой у меня возник. При решении одной и той же задачи я использовала Структуры и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru