С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.96
Algiz
160 / 160 / 13
Регистрация: 23.02.2011
Сообщений: 347
#1

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

19.08.2011, 13:22. Просмотров 3451. Ответов 17
Метки нет (Все метки)

Скажите, а как в C++ работать с типизированными файлами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2011, 13:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос С++ файлы (C++):

Заголовочные файлы .h, файлы исходного когда c/c++ и установление связи между ними - C++
Всем добрый вечер!) Относительно недавно стал изучать c/c++, хочу полюбопытствовать ,так как появился вопрос. Почему при объявлении...

Работа в Visual Studio 2015 - как добавить файлы исходного кода и заголовочные файлы? - C++
Приветствую всех! Столкнулся с тем, что решая задачи по книге Лафоре про графику, не смог добавить файлы .h и .cpp, скачав их с одной из...

Зачем нужно добавлять файлы в файлы исходного кода - C++
Зачем нужно добавлять файлы в файлы исходного кода (кроме main.cpp)? И как вызвать из main.cpp другой файл?

Заголовочные файлы и файлы cpp - C++
Со временем сложилось представление что при написании программ стоит разделять МЕТА данные и данные, но для лучшего понимания своих...

Раздельная компиляция: что помещать в заголовочные файлы, а что в файлы реализации (исходники)? - C++
Здравствуйте, я учусь пользоваться Visual Studio.Пишу программу, в которой создаются и разрушаются объекты, определенного пользователем...

нужно переделать код (из Файлы текстовые (FILE*) в Файлы текстовые (потоки)) - C++
вот задание для программы: 6. Задан текстовый файл input.txt. Требуется определить строки этого файла, содержащие максимальную по длине...

17
soft.creator
104 / 104 / 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
1
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;
}
//---------------------------------------------------------------------------

вот весь код программы ) может кому понадобится
0
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 14:24 #4
Цитата Сообщение от soft.creator Посмотреть сообщение
fread(&tmp, sizeof(MyData), 1, fp);
- не верно верно так
C++
1
fread(&tmp, 1, sizeof(MyData), fp);
0
Algiz
160 / 160 / 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.
0
co6ak
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
19.08.2011, 15:03 #6
а как же ключи для двоичных файлов под виндой?))
0
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
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
0
-=ЮрА=-
Заблокирован
Автор FAQ
19.08.2011, 15:17 #8
Цитата Сообщение от Algiz Посмотреть сообщение
у меня fread работает так (&tmp, sizeof(MyData), 1, fp), мне кажется зависит от библиотек, которые с компилятором шли. У меня gcc.
- почитай тут
http://www.cplusplus.com/reference/clibrary/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/clibrary/cstdio/fread/
0
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
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.
0
-=ЮрА=-
Заблокирован
Автор 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)
И сравним результаты???
0
co6ak
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
19.08.2011, 15:29 #11
а давайте письма мериться?
0
-=ЮрА=-
Заблокирован
Автор 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, юзай код на здоровье, "типизированных" файлов на сколько знаю не существует - думаю под словом типизированный подразумевается файлы определённой структуры (например со структурами внутри), по моему коду можешь увидеть как можно организовать их запись и чтение
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 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). Т.е. ты всё вывернул наизнанку, но разницы в данном случае не видно.
0
morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
19.08.2011, 15:58 #14
там разница нет просто из за того что читать из файла 1 байт sizeof() раз.... или прочитать сразу sizeof() байт один раз.... тока интресно как он так в структуру записывает?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
19.08.2011, 16:00 #15
Цитата Сообщение от morphling Посмотреть сообщение
тока интресно как он так в структуру записывает?
void*, такой void*...
0
19.08.2011, 16:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2011, 16:00
Привет! Вот еще темы с ответами:

Файлы.Текстовые файлы - C++
Считая t текстовым файлом (файлом типа text), ответить на следующие вопросы: А)Кроме текстовых файлов,файлы какиъ еще типов могут...

файлы в C - C++
Пожалуйста помогите написать программу, которая создает 5 текстовых файлов и обменивает данные между ними в след. последовательности из 1 в...

Файлы в С - C++
Напишите, пожалуйста, программу для копирования содержимого одного файла в другой файл в обратном порядке (на С).

Файлы - C++
1. Задано 3 файла, состоящие из 7 чисел каждый. Сформировать новый файл из чисел, принадлежащим одновременно всем трем...


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

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

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