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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.79
Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
#1

Запись в бинарный файл - C++

17.03.2010, 20:47. Просмотров 3550. Ответов 10
Метки нет (Все метки)

Скажите пожалуйста, правильно ли работает моя программа? (Имеется ввиду запись в бинарный файл)

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
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
 
typedef struct Client
{
 int Num;
 char SurName[27];
 char Name[21];
 char SecName[21];
};
 
int main(void)
{
 FILE *stream;
 int i=0;
 Client *AClient=new Client[5];
 
 //Открытие файла для вывода
 if ((stream = fopen("sample.dat", "w+b")) == NULL)
 {
     printf("Cannot open output file.\n");
     return 1;
 }
 
//Заполнение полей структуры
 for (i=0; i<5; i++)
 {
     AClient[i].Num = i;
     strcpy(AClient[i].SurName,"Petrov");
     strcpy(AClient[i].Name, "Petr");
     strcpy(AClient[i].SecName, "Petrovich");
 }
 //Запись структуры в файл 
 fwrite(&AClient, sizeof(AClient), 5, stream);
 
 //Закрытие файла файла
 fclose(stream);
 
Client *RClient=new Client[5];
//Открытие файла для чтения 
 if ((stream = fopen("sample.dat", "rb"))== NULL)
 {
     printf("Cannot open input file.\n");
     return 2;
 }
 fread(&RClient, sizeof(RClient), 5, stream);
 
 //Закрытие файла
 fclose(stream);
 for (int i=0; i<5; i++)
 {
     printf("The structure contains:\n");
     printf("Num = %d  SurName = %s \n", RClient[i].Num, RClient[i].SurName);
     printf("Name = %s SecName = %s\n\n", RClient[i].Name, RClient[i].SecName);
 }
 delete AClient;
 delete RClient;
 return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2010, 20:47     Запись в бинарный файл
Посмотрите здесь:

Запись в бинарный файл - C++
Помогите приделает функцию что бы она записывала не в обычный файл а в бинарный, уже три чеса сижу выходит ерунда. Надо еще что бы при...

Запись в бинарный файл - C++
Всем привет. Подскажите пожалста как через fstream добавить запись в бинарный файл ? нужно добавить именно В НАЧАЛО , не очищая...

Запись в бинарный файл - C++
Всем привет. Столкнулся с следующей проблемой при написании курсача,а именно с записью в бинарный в файл: дело в том, что я каждый раз...

Запись в бинарный файл - C++
Подскажите как записать данные из StringGrid в бинарный файл и компоновка допустим из 2 StringGrid построчно

Запись в бинарный файл - C++
Здравствуйте. Прошу помочь разобраться с проблемой. Необходимо записать в двоичный файл 8-байтовое число, но не как строку, а...

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

Запись в бинарный файл - C++
Подскажите пожалуйста,где в коде ошибка??никак найти не могу почему х не считает. В файл записываются 0. Задние на картинке. #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
17.03.2010, 21:15     Запись в бинарный файл #2
я бы записывал внутри цикла.
P.s и какой смысл закрывать файл до чтения данных.
Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
17.03.2010, 22:41  [ТС]     Запись в бинарный файл #3
Скажите, а как мне быть, если, скажем, я выделяю память под массив структур [10], заполняю только 2 структуры. Потом сохраняю всё это в файл, и выхожу из программы. Снова захожу в программу, снова выделяю то же самое, открываю файл для обновления... Но как мне соединить мои сохранённые записи с новым массивом структур? Или это будет всё происходить автоматически?
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.03.2010, 09:31     Запись в бинарный файл #4
новые структуры будут записываться после старых в режиме ab
файл можно не закрывать, а перемотать - rewind()
можно ещё более точно переставлять указатель в файле - fseek()

Добавлено через 2 минуты
можно размер файла ftell() поделить на размер структуры sizeof
а можно по одной читать, пока файл не кончится
это чтобы узнать, сколько структур в файле
Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
18.03.2010, 20:24  [ТС]     Запись в бинарный файл #5
Еще один вопрос.
Вот функция считывания из бинарного файла fread():
fread(RClient, sizeof(RClient), 1, stream);
Какую роль играет "1"?
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
18.03.2010, 21:02     Запись в бинарный файл #6
1 - количество записей, которые читаются из файла. Если напишешь 10, будет попытка прочитать сразу 10 клиентов как массив.
Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
19.03.2010, 00:42  [ТС]     Запись в бинарный файл #7
Спасибо.)

Вопрос: почему не работает эта программа? Файл записывается, а считывать - не считывается..((

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
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
 
typedef struct Client
{
 int Num;
 char SurName[27];
 char Name[21];
 char SecName[21];
};
int main()
{
 FILE *stream;
 int i=0;
 int a;
 Client *AClient=new Client[5];
 
 //Открытие файла для вывода
 if ((stream = fopen("sample.dat", "rb")) == NULL)
 {
     printf("Cannot open output file.\n");
     return 1;
 }
fread(AClient, sizeof(AClient), 100, stream);
AClient[0].Num=0;
int &counter=AClient[0].Num;
cout<<counter;
//Заполнение полей структуры
cin>>a;
switch (a)
{
case 0:
    {
        for (int i=0; i<5; i++)
        {
            strcpy(AClient[i].SurName,"Petrov");
            strcpy(AClient[i].Name, "Petr");
            strcpy(AClient[i].SecName, "Petrovich");
            counter++;
        }
        break;
    }
case 1:
    {
        for (int i=0; i<counter; i++)
        {
            printf("The structure contains:\n");
            printf("Num = %d  SurName = %s \n", i, AClient[i].SurName);
            printf("Name = %s SecName = %s\n\n", AClient[i].Name, AClient[i].SecName);
        }
    }
}
 //Запись структуры в файл 
 fwrite(AClient, sizeof(AClient), 100, stream);
 
 //Закрытие файла файла
 fclose(stream);
 
 delete AClient;
 return 0;
}
Добавлено через 38 минут
PS. В этой программе разобрался уже сам.)) Спасибо всем за помощь.))

Добавлено через 3 часа 0 минут
Цитата Сообщение от Sasuke Посмотреть сообщение
Еще один вопрос.
Вот функция считывания из бинарного файла fread():
fread(RClient, sizeof(RClient), 1, stream);
Какую роль играет "1"?
Цитата Сообщение от Nick Alte Посмотреть сообщение
1 - количество записей, которые читаются из файла. Если напишешь 10, будет попытка прочитать сразу 10 клиентов как массив.
Вопрос по это й теме. Можно ли более подробней объяснить, ибо немного не понятно. Как зависит это число от массива (в моём случае структур)? Это как-то связано с его размером?
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.03.2010, 04:55     Запись в бинарный файл #8
Код
4.9.8.1 The fread function

Synopsis

         #include <stdio.h>
         size_t fread(void *ptr, size_t size, size_t nmemb,
                  FILE *stream);

Description

   The fread function reads, into the array pointed to by ptr , up to
nmemb members whose size is specified by size , from the stream
pointed to by stream .  The file position indicator for the stream (if
defined) is advanced by the number of characters successfully read.
If an error occurs, the resulting value of the file position indicator
for the stream is indeterminate.  If a partial member is read, its
value is indeterminate.

Returns

   The fread function returns the number of members successfully read,
which may be less than nmemb if a read error or end-of-file is
encountered.  If size or nmemb is zero, fread returns zero and the
contents of the array and the state of the stream remain unchanged.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
19.03.2010, 17:24     Запись в бинарный файл #9
C
1
2
3
4
5
RClient clients[17];
void ReadClients(FILE *f)
{
    fread(clients, sizeof(RClient), 17, f);
}
Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
01.04.2010, 18:41  [ТС]     Запись в бинарный файл #10
Хотел еще кое-что спросить. У меня складывается след. ситуация. Есть программа, содержащая массив структуры [10], в которой еще есть одна переменная, которая яляется еще одной структурой, в ней еще, там еще... + помимо этой структуры есть еще и массив структуры [5]. Мне всё это дело нужно записывать в бинарный файл. Вопрос: почему у меня не записывает всё это в файл, когда я делаю сл. образом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
.....
int main ()
{
     FILE *f;
     // открываю файл
     // свичём выполняю пару действий (ввод структуры, например, или её части)
     ....
     // при выходе делаю сл.
     fwrite(К, sizeof(К), 10, а);
}
// ниже размещены функции.. много...
В это время, мой бинарный файл содержит 1Кб информации... Я пытаюсь его открыть через блокнот, а так всего три символа.. ПОтом, пытаюсь считать с файла, и оно естественно не работает. Я очень прошу мне помочь, очень нужнен совет!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2010, 09:12     Запись в бинарный файл
Еще ссылки по теме:

Запись вектора в бинарный файл. - C++
Ребят помогите кто сделать запись в бинарный файл ,а не в текстовый(как в данном коде ) , а то не выходит как то ! заранее спасибо ! ...

Запись текста в бинарный файл - C++
Есть программа, она должна записывать в бин файл, обычную строку. #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;fstream&gt; ...

Запись вектора в бинарный файл - C++
Здравствуйте, не получаеться написать нормальную запись в файл вектора из обьектов класа. Вот сам клас: public class Human { ...

Запись string в бинарный файл - C++
Здравствуйте еще раз! ^_^ Хочу понять, как правильно записывать бинарный файл и считывать информацию из него на примере string, т.к. с...

Чтение и запись в бинарный файл - C++
Ребят nомогите мне nожалуйста. Я хочу nрочитать бинарный файл , в котором заnисаны данные в виде структуры, глянул в инете как читают и...


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

Или воспользуйтесь поиском по форуму:
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.04.2010, 09:12     Запись в бинарный файл #11
неясно K, это что
Yandex
Объявления
02.04.2010, 09:12     Запись в бинарный файл
Ответ Создать тему
Опции темы

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