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

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

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

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

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

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

Пропали файлы на флешке.Вместо них файлы и папки со странными именами - Восстановление данных
Вставил флешку с программами(пользовался ей недавно) и тут такое.... Ни одну папку открыть не могу. Как вернуть нормальные...

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

Как в IntelliJ IDEA скомпилировать исходные файлы в файлы классов - JAVA IDE
Учусь делать апелты <html> <body> <applet code="aplet.class",width="300" height=300> /*</aplet> </body> </html> import...

Почему не отправляются файлы docx, txt и прочие текстовые файлы? - PHP
Архивы и картинки проверял- отправляются на сервер, а текстовые файлы- нет. Что нужно, чтоб они тоже отправлялись? <?php ...

Восстановить удаленные файлы (пропали файлы после нажатия Ctrl +Z) - Восстановление данных
Народ, срочно нужна ваша помощь. Кратко, вчера с флеш-адаптера скопировал себе видео-материал с мероприятия. Сегодня каким-то путем нажал...

Текстовые файлы. Создать новый файл, объединив исходные файлы - Pascal ABC
даны текстовые файлы Name1 и Name2 .создать Name3 файл объединив Name1 и Name2 текстовые файлы

Не могу открыть файлы Word, jpeg, pdf - файлы повреждены - Удаление вирусов
Помогите, пожалуйста, по-глупости словила вирус. Теперь не открываются файлы Word, jpeg, pdf, пишет файл поврежден, или просмотр...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
-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
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.
co6ak
Кошковед
407 / 500 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
19.08.2011, 15:03     С++ файлы #6
а как же ключи для двоичных файлов под виндой?))
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
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
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
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
Кошковед
407 / 500 / 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++
1286 / 1220 / 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
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
19.08.2011, 15:58     С++ файлы #14
там разница нет просто из за того что читать из файла 1 байт sizeof() раз.... или прочитать сразу sizeof() байт один раз.... тока интресно как он так в структуру записывает?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 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++
1286 / 1220 / 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     С++ файлы
Еще ссылки по теме:

Архивные файлы, да и просто файлы которые весят больше 1гига читаются с ошибкой. - Компьютерное железо
Началось где-то месяца два назад. Архивные файлы, да и просто файлы которые весят больше 1гига читаются с ошибкой. При попытке извлеч из...

Находить в папке файлы с расширением .pes, и обрабатывать эти файлы с формированием скриншотов - VBA
Ребят столкнулся с такой задачей которую я буду выполнять очень долго сам в програмировании не селен, решил спросить тут помощи может кто...

Сделать макрос, находящий все файлы .txt и открывающий эти файлы по очереди - VBA
Надо сделать макрос в vba excel , чтобы он находил все файлы txt и открывал после нажатие ок, все файлы txt по очереди! Sub...

Занесите в отдельные файлы списки студентов различных форм обучения(Типизированные файлы) - Turbo Pascal
Помогите пожалуйста написать программку. Трудно мне даются блин эти файлы... Создайте файл Студент. Занесите в отдельные файлы списки...

Файлы. Как заставить прогу всегда читать файлы из папки, в которой она сама? - C++/CLI
Здравствуйте. Вобщем написал прогу, в ней используется относительный путь к файлам. Прога лежит в %ProgramFiles%\Свояпапка прикол в том,...


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

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

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