Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.67
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
#1

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

21.08.2011, 20:16. Просмотров 6326. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2011, 20:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Исследование структуры FILE или: что вообще можно выудить из этой структуры, указатель на которую мы получаем при открытии файла? (C++):

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

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

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

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

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

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

6
dr.curse
392 / 348 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
21.08.2011, 20:20 #2
читай K&R там про это написано
0
villu
203 / 204 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
21.08.2011, 20:23 #3
а кто сказал, что в этой структуре нужно имя?
там текущее состояние файла описывается.
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
21.08.2011, 20:38  [ТС] #4
aram_gyumri, а где там что написано?
Так-то я нехороший человек, ни одной книги до конца не прочёл. Скучно становится. K&R добил до "интерфейс системы Unix", открытие файлов- тема эта есть, да. Но и только. Периодически обращаюсь к K&R как к справочнику- не встречал. Ткни носом, а?

villu, я где-то говорил ТОЛЬКО ПРО имя?
Вообще вопрос заключается: как на основании полей структуры получить содержание файла. Наверное, нужно его имя или если он спроецирован в память, адрес буфера (а в структуре ничего этого нет). Не?
0
villu
203 / 204 / 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
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
21.08.2011, 22:17  [ТС] #6
Цитата Сообщение от villu Посмотреть сообщение
зато там есть индекс, который есть системный хендл, не?
не знаю, но за подсказку спасибо, просто я привык что хэндл это HANDLE, а никак не int, надо будет поковыряться как-нибудь
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
21.08.2011, 22:34 #7
Цитата Сообщение от kravam Посмотреть сообщение
не знаю, но за подсказку спасибо, просто я привык что хэндл это HANDLE, а никак не int, надо будет поковыряться как-нибудь
в виндовс это void* (HANDLE), в линуксе int
разницы нет - все это число по своему системный идентификатор
в отличии от c++овых потоков видно, что внутренности не специфицированы, а потому компиляторо-зависимые
0
21.08.2011, 22:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2011, 22:34
Привет! Вот еще темы с решениями:

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

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

jTree и древовидные структуры данных вообще
В таблице хранится дерево в следующем виде: currentID - уникальное поле...

Указатель на указатель внутри структуры
Приветствую. Есть 2 структуры: enum category { Technical, History, Fiction };...


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

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

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