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

С++ файлы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.96
Algiz
159 / 159 / 13
Регистрация: 23.02.2011
Сообщений: 347
19.08.2011, 13:22     С++ файлы #1
Скажите, а как в C++ работать с типизированными файлами.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2011, 13:22     С++ файлы
Посмотрите здесь:

Файлы С++ C++
C++ Файлы
Файлы C++
C++ файлы
C++ Файлы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
19.08.2011, 13:51     С++ файлы #2
Паскаль учили? Знакомая фраза с первого курса.
В C++ (к счастью) нет понятия типизированного файла. Читать данные можно примерно так:
C++
1
2
3
4
5
6
7
8
9
struct MyData { ... };
FILE* fp = fopen("file.bin", "rb");
while (!feof(fp))
{
  MyData tmp;
  fread(&tmp, sizeof(MyData), 1, fp);
  // тут можно использовать прочитанные данные в структуре tmp
}
fclose(fp);
Единственный важный момент - компилятор применяет выравнивание полей структур, поэтому структуры для чтения данных нужно объявлять как упакованные (__attribute__((packed)) в gcc или #pragma pack(1) в MSVC), иначе бинарные данные могут быть прочитаны некорректно.

Запись аналогична, только передается "wb" в fopen и вызывается fwrite
morphling
 Аватар для morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
19.08.2011, 14:18     С++ файлы #3
функции fread() и fwrite()

fread() читает из файла sizeof байт... fwrite() записывает в файл sizeof байт

fread(&CORR, sizeof(CORR), 1, f);
прочитать в структуру CORR sizeof(CORR)байт .. количество считываний стольких байт 1... из файла f

fwrite() тоже самое

Добавлено через 26 минут
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
//---------------------------------------------------------------------------
 
#pragma hdrstop
 
 
#include <tchar.h>
#include <windows.h>
#include <iostream.h>
#include <assert.h>
//---------------------------------------------------------------------------
class IntArray
     {
       public:
         //*****************
 
         bool      operator== (const IntArray&)const;
         bool      operator!= (const IntArray&)const;
         IntArray& operator=  (const IntArray&);
              int& operator[] (int index);
         //*****************
 
         int size() const
              {
               return _size;
              }
 
         //*****************
 
         explicit IntArray(int sz = DefaultArraySize);
                  IntArray(int *array, int array_size);
                  IntArray(const IntArray &rhs);
 
         //*****************
 
           ~IntArray()
               {
                delete[] ia;
               }
 
         //*****************
 
         void sort()
              {
               for(i = 0; i < size(); i++)
               for(j = 0; j < size(); j++)
                  {
                    if (ia[j] > ia[i])
                        {
                          temp = ia[j];
                          ia[j] = ia[i];
                          ia[i] = temp;
                        }
                  }
              }
 
         //*****************
 
         int max()
             {
              _max = -1000;
              for(i = 0; i < size(); i++)
                if (ia[i] > _max)
                   {
                     _max = ia[i];
                   }
                return _max;
             }
 
         //*****************
 
         int min()
             {
              _min = 1000;
              for(i = 0; i < size(); i++)
                if (ia[i] < _min)
                   {
                     _min = ia[i];
                   }
                return _min;
             }
 
         //*****************
 
         int find(int value)
             {
              for(i = 0; i < size(); i++)
               if (ia[i] == value)
                  {
                    return i;
                  }
               return -1;
             }
 
         //*****************
       private:
         int _size, *ia, _min, _max, i, j, temp;
         static const int DefaultArraySize = 10;
 
     };
//---Конструктор's------------------------------------------------------------
IntArray::IntArray(int sz)
     {
 
      _size = sz;
      ia = new int[_size];
 
      for(int i = 0; i < _size; ++i)
        ia[i] = i;
 
     }
//---------------------------------------------------------------------------
IntArray::IntArray(int *array, int array_size)
     {
 
        _size = array_size;
        ia = new int[_size];
 
       for(int i = 0; i < _size; ++i)
         ia[i] = array[i];
 
     }
//---------------------------------------------------------------------------
IntArray::IntArray(const IntArray &rhs)
     {
 
       _size = rhs._size;
       ia = new int[_size];
 
       for(int i = 0; i < _size; ++i)
         ia[i] = rhs.ia[i];
 
     }
//---------------------------------------------------------------------------
int& IntArray::operator[](int index)
//[BCC32 Error] File2.cpp(94): E2316 'operator IntArray::[](int)' is not a member of 'IntArray'
     {
       assert(index >= 0 && index < _size);
       return ia[index];
     }
//---------------------------------------------------------------------------
 
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
   int mas[5] = {76, 32, 12, 23, 54};
 
   IntArray myArray1, myArray2(20), myArray3(mas, 5), myArray4 = myArray3;
   int i;
 
 
   cout<<"Массив1: "<<endl;
   for(i = 0; i < myArray1.size(); i++)
      cout<<" "<<myArray1[i];
   cout<<" Размер: "<<myArray1.size()<<" Мин: "<<myArray1.min() <<" Макс: "<<myArray1.max();
   cout<<endl;
 
   cout<<"Массив2: "<<endl;
   for(i = 0; i < myArray2.size(); i++)
      cout<<" "<<myArray2[i];
   cout<<" Размер: "<<myArray2.size()<<" Мин: "<<myArray2.min() <<" Макс: "<<myArray2.max();
     cout<<endl;
 
   cout<<"Массив3: "<<endl;
   for(i = 0; i < myArray3.size(); i++)
      cout<<" "<<myArray3[i];
   cout<<" Размер: "<<myArray3.size()<<" Мин: "<<myArray3.min() <<" Макс: "<<myArray3.max();
     cout<<endl;
 
   cout<<"Массив4: "<<endl;
   myArray4.sort();
   for(i = 0; i < myArray4.size(); i++)
      cout<<" "<<myArray4[i];
   cout<<" Размер: "<<myArray4.size()<<" Мин: "<<myArray4.min() <<" Макс: "<<myArray4.max();
     cout<<endl;
 
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------

вот весь код программы ) может кому понадобится
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 14:24     С++ файлы #4
Цитата Сообщение от soft.creator Посмотреть сообщение
fread(&tmp, sizeof(MyData), 1, fp);
- не верно верно так
C++
1
fread(&tmp, 1, sizeof(MyData), fp);
Algiz
159 / 159 / 13
Регистрация: 23.02.2011
Сообщений: 347
19.08.2011, 15:02  [ТС]     С++ файлы #5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- не верно верно так
C++
1
fread(&tmp, 1, sizeof(MyData), fp);
у меня fread работает так (&tmp, sizeof(MyData), 1, fp), мне кажется зависит от библиотек, которые с компилятором шли. У меня gcc.
co6ak
Кошковед
 Аватар для co6ak
402 / 495 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
19.08.2011, 15:03     С++ файлы #6
а как же ключи для двоичных файлов под виндой?))
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
19.08.2011, 15:14     С++ файлы #7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- не верно верно так
C++
1
fread(&tmp, 1, sizeof(MyData), fp);
SYNOPSIS
#include <stdio.h>

size_t
fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
man fread
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 15:17     С++ файлы #8
Цитата Сообщение от Algiz Посмотреть сообщение
у меня fread работает так (&tmp, sizeof(MyData), 1, fp), мне кажется зависит от библиотек, которые с компилятором шли. У меня gcc.
- почитай тут
http://www.cplusplus.com/reference/c.../cstdio/fread/

Добавлено через 2 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
SYNOPSIS
#include <stdio.h>
size_t
fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
Тут посмотри http://www.cplusplus.com/reference/c.../cstdio/fread/
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
19.08.2011, 15:18     С++ файлы #9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- почитай тут
И там то же самое:
fread
function
<cstdio>

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

Read block of data from stream
Reads an array of count elements, each one with a size of size bytes, from the stream and stores them in the block of memory specified by ptr.
The postion indicator of the stream is advanced by the total amount of bytes read.
The total amount of bytes read if successful is (size * count).

Parameters

ptr
Pointer to a block of memory with a minimum size of (size*count) bytes.
size
Size in bytes of each element to be read.
count
Number of elements, each one with a size of size bytes.
stream
Pointer to a FILE object that specifies an input stream.
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 15:26     С++ файлы #10
easybudda, давай для хохмы проведём тест, запишем и считаем из файла структуру скажем такого типа

C++
1
2
3
4
5
struct test
{
    char s[32];
    int ival;
}
Запишем две структуры
1 : test.s = "struct1"; test.ival = 1;
2 : test.s = "struct2"; test.ival = 2;

Будешь читать
C++
1
 fread(&test,sizeof(test),1,f);
А я буду читать
C++
1
fread(&test,1,sizeof(test),f)
И сравним результаты???
co6ak
Кошковед
 Аватар для co6ak
402 / 495 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
19.08.2011, 15:29     С++ файлы #11
а давайте письма мериться?
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 15:38     С++ файлы #12
Вот код
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
#include <cstdio>
#include <conio.h>
 
struct test
{
    char s[32];
    int ival;
};
 
int main()
{
    FILE * f = fopen("test.txt","wb+");
    test ptest;
    printf("WRITING DATA...\r\n");
    for(int i = 0; i < 2; i++)
    {
        ptest.ival = i + 1;
        sprintf(ptest.s,"struct%d",ptest.ival);
        fwrite((void *)&ptest,1,sizeof(test),f);
    }
    fclose(f);
    printf("WRITING DONE\r\n");
    printf("Press any key to continue\r\n");
    getch();
    f = fopen("test.txt","rb+");
    for(i = 0; i < 2; i++)
    {
        fread((void *)&ptest,1,sizeof(test),f);
        printf("test.s : %s\r\n",ptest.s);
        printf("test.ival : %d\r\n",ptest.ival);
    }
    fclose(f);
    printf("READING DONE\r\n");
    printf("Press any key to continue\r\n");
    getch();
    return 0;
}
Вот результат работы

WRITING DATA...
WRITING DONE
Press any key to continue
test.s : struct1
test.ival : 1
test.s : struct2
test.ival : 2
READING DONE
Press any key to continue


Добавлено через 3 минуты
PS: TC, юзай код на здоровье, "типизированных" файлов на сколько знаю не существует - думаю под словом типизированный подразумевается файлы определённой структуры (например со структурами внутри), по моему коду можешь увидеть как можно организовать их запись и чтение
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
19.08.2011, 15:43     С++ файлы #13
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
А я буду читать
Код C++
1
fread(&test,1,sizeof(test),f)
Вот из MSDN
size_t fread(
void *buffer,
size_t size,
size_t count,
FILE *stream
);
Но для тебя я открою секрет, почему твой код работает. Ты считываешь sizeof(test) байт, вместо того, чтобы считать одну структуру размером sizeof(test). Т.е. ты всё вывернул наизнанку, но разницы в данном случае не видно.
morphling
 Аватар для morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
19.08.2011, 15:58     С++ файлы #14
там разница нет просто из за того что читать из файла 1 байт sizeof() раз.... или прочитать сразу sizeof() байт один раз.... тока интресно как он так в структуру записывает?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
19.08.2011, 16:00     С++ файлы #15
Цитата Сообщение от morphling Посмотреть сообщение
тока интресно как он так в структуру записывает?
void*, такой void*...
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 16:15     С++ файлы #16
Цитата Сообщение от Deviaphan Посмотреть сообщение
Но для тебя я открою секрет, почему твой код работает. Ты считываешь sizeof(test) байт, вместо того, чтобы считать одну структуру размером sizeof(test). Т.е. ты всё вывернул наизнанку, но разницы в данном случае не видно.
- сколько работал и не только с простецкими структурами разницы так и не видел, вот тут согашусь
Цитата Сообщение от Deviaphan Посмотреть сообщение
void*, такой void*...
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
19.08.2011, 16:18     С++ файлы #17
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
сколько работал и не только с простецкими структурами разницы так и не видел
И не увидишь.))) Тут речь о не правильной интерпретации данных. Т.е. компилятору глубоко безразлично, что ты пихаешь под видом void*. Можешь хоть массив интов считать, ему пофиг. Вся ответственность на тебе, а ты проявил безответственность и поменял параметры местами. В этом случае пронесло. А в других может и не пронести.
Лишний плюс в копилку типизированных языков.)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2011, 16:21     С++ файлы
Еще ссылки по теме:

C++ файлы

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
19.08.2011, 16:21     С++ файлы #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
сколько работал и не только с простецкими структурами разницы так и не видел
Разница появляется, когда начинаешь проверять возвращаемые функциями значения. При записи/чтении 1 структуры fread()/fwrite() должны бы 1 возвращать, а не размер структуры. Задумайся о том, что при записи массива из 100 структур будет возвращаться не 100, а опять же размер структуры. Но, если твёрдо верить в то, что никаких ошибок при файловом вводе/выводе в принципе быть не может, то, разумеется, без разницы, что там функции возвращают...
Yandex
Объявления
19.08.2011, 16:21     С++ файлы
Ответ Создать тему
Опции темы

Текущее время: 01:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru