Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.67
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
#1

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

21.08.2011, 20:16. Просмотров 4977. Ответов 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
Кто-нибудь задумывался, как это происходит?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2011, 20:16     Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла?
Посмотрите здесь:
Функция внутри структуры использует указатель, как поле этой структуры C++
C++ Чтение структуры из файла, глобальный указатель
Структуры, массивы структур (как можно присваивать(инициализировать) значения полям структуры) C++
Помещение структуры в вектор, удаление структуры, изменение элементов структуры C++
C++ Мнение. Что лучше Структуры или Классы?
C++ Указатель на указатель внутри структуры
Указатель на Массив Структуры C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
21.08.2011, 20:20     Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла? #2
читай K&R там про это написано
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.08.2011, 20:23     Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла? #3
а кто сказал, что в этой структуре нужно имя?
там текущее состояние файла описывается.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
21.08.2011, 20:38  [ТС]     Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла? #4
aram_gyumri, а где там что написано?
Так-то я нехороший человек, ни одной книги до конца не прочёл. Скучно становится. K&R добил до "интерфейс системы Unix", открытие файлов- тема эта есть, да. Но и только. Периодически обращаюсь к K&R как к справочнику- не встречал. Ткни носом, а?

villu, я где-то говорил ТОЛЬКО ПРО имя?
Вообще вопрос заключается: как на основании полей структуры получить содержание файла. Наверное, нужно его имя или если он спроецирован в память, адрес буфера (а в структуре ничего этого нет). Не?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.08.2011, 22:11     Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла? #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
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
21.08.2011, 22:17  [ТС]     Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла? #6
Цитата Сообщение от villu Посмотреть сообщение
зато там есть индекс, который есть системный хендл, не?
не знаю, но за подсказку спасибо, просто я привык что хэндл это HANDLE, а никак не int, надо будет поковыряться как-нибудь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2011, 22:34     Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла?
Еще ссылки по теме:
C++ Выводятся иероглифы при чтении структуры из файла...
C++ Указатель на член структуры/класса
C++ указатель масива структур из структуры
Указатель на следующий элемент структуры C++
C++ Стек. Что добавить в код, или как изменить его, чтобы в нём были структуры ?

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
21.08.2011, 22:34     Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла? #7
Цитата Сообщение от kravam Посмотреть сообщение
не знаю, но за подсказку спасибо, просто я привык что хэндл это HANDLE, а никак не int, надо будет поковыряться как-нибудь
в виндовс это void* (HANDLE), в линуксе int
разницы нет - все это число по своему системный идентификатор
в отличии от c++овых потоков видно, что внутренности не специфицированы, а потому компиляторо-зависимые
Yandex
Объявления
21.08.2011, 22:34     Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru