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

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

Войти
Регистрация
Восстановить пароль
 
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
#1

Чтение и запись из одного файла - C++

23.07.2015, 21:54. Просмотров 277. Ответов 6
Метки нет (Все метки)

все вроде норм но почему после вывода получаю краш , извините есле что не так только начал читать про файлы

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
class person // класс person
{
protected:
    string name;
    string town;
    string proffesion;
    float how_get_money;
    short age; 
public:
    person() :name("n/b"), town("n/b"), proffesion("n/b"), how_get_money(0.0), age(0)
    {}
    void setdata() // получить данные о человеке
    {
        cout << "\nEnter name          : "; 
        cin >> name;
        cout << "\nEnter age           : "; 
        cin >> age;
        cout << "\nEnter native town   :";
        cin >> town;
        cout << "\nEnter proffesion    :";
        cin >> proffesion;
        cout << "\nEnter how get money : ";
        cin >> how_get_money;
    }
    void showData()const
    {
        cout << "\nName          : "<< name
             << "\nAge           : "<< age
             << "\nNative town   : "<< town
             << "\nProffesion    : "<< proffesion
             << "\nHow get money : "<< how_get_money;
    }
};
 
void addNewPeopl(person p);
void getAllPeopl(person p);
void thoroughOnePeopl(person p);
int main()
{
    setlocale(LC_ALL, "rus");
 
    person persone_one;
    char choise = '\x0' ;
 
    cout << "\nWhat you want do ?"
        << "\n a - add new  data "
        << "\n g - get all  data "
        << "\n t - thorough data \n -> ";
    cin >> choise;
        switch (choise)
        {
        case 'a':
            addNewPeopl(persone_one);
            break;
        case 'g':
            getAllPeopl(persone_one);
            break;
        case 't':
            thoroughOnePeopl(persone_one);
            break;
        }
    
    cout << "\n\n\n\n";
    return 0;
}
 
void addNewPeopl(person p)
{
    char what_to_do = '\x0';
    fstream setFile;
    setFile.open("files.DAT", ios::app | ios::out | ios::binary);   
    do
    {
        p.setdata();
        setFile.write(reinterpret_cast<char*>(&p), sizeof(p));
        cout << "\nYet one times ? y-n -> ";
        cin >> what_to_do;
 
    } while (what_to_do != 'n');
    setFile.close();
}
void getAllPeopl(person p)
{
    fstream setFile;
    setFile.open("files.DAT", ios::in | ios::binary);
    setFile.seekg(0);
    setFile.read(reinterpret_cast<char*>(&p), sizeof(p));
    while (!setFile.eof())
    {
        p.showData();
        setFile.read(reinterpret_cast<char*>(&p), sizeof(p));       
        cout << "\n";
    }
    setFile.close();
}
void thoroughOnePeopl(person p)
{
    fstream setFile;
    setFile.open("files.DAT", ios::in | ios::binary);
 
    // установить указатель на 0 байт от конца файла
    setFile.seekg(0, ios::end);   
 
    int endposition = setFile.tellg();  // найти позицию
    int n = endposition / sizeof(person);  // число человек
 
    cout << "\nВ файле " << n << " человек(а)";
    cout << "\nВведите номер персоны: ";
    cin >> n;
 
    int position = (n - 1) * sizeof(person); // умножить размер данных под персону на число персон
    setFile.seekg(position);   // число байт от начала прочитать одну персону
 
    setFile.read(reinterpret_cast<char*>(&p), sizeof(p));
    p.showData();
    setFile.close();
}
Добавлено через 2 минуты
есле изменить мейн

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    setlocale(LC_ALL, "rus");
 
    person persone_one;
 
    
        addNewPeopl(persone_one);
            getAllPeopl(persone_one);
            thoroughOnePeopl(persone_one);
 
    cout << "\n\n\n\n";
    return 0;
}
то все нормально (((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2015, 21:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение и запись из одного файла (C++):

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

Потоки и запись/чтение в/из одного массива - C++
Имеется массив данных (каких - неважно, пусть double). Один поток пишет данные. Остальные (один или более) читают. Как...

Чтение/запись файла - C++
Вот сделал такую прогу. Очень простая. Создает файл, где есть 100 полей. Каждое поле это строка из индекса, названия, кол-ва (например...

Запись и чтение из файла - C++
Доброго время суток! Так от балди решыл набросать прогу которая создаёт файл записывает туда 11 рандомных чисел,потом з помощю ifstream я...

Запись и чтение из файла - C++
Всем добрый вечер, как можно записать данные в файл? Например записать в txt файл список паролей. На одном сайте нашел информацию по...

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

6
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
23.07.2015, 22:07 #2
Цитата Сообщение от Maksumko Посмотреть сообщение
но почему после вывода получаю краш
Какого вывода?
0
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
23.07.2015, 23:08  [ТС] #3
например есле выбираю вариант "a" то нормально додаю нового человека , а есле вывод всех или конкретного то выводит и потом краш программы .
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
24.07.2015, 00:40 #4
Объекты класса с такими полями (string) не годятся для бинарного чтения/записи.
1
Krasiosoft
51 / 51 / 15
Регистрация: 01.06.2015
Сообщений: 189
24.07.2015, 03:07 #5
Maksumko, при вашем варианте записи в файл:
C++
1
setFile.write(reinterpret_cast<char*>(&p), sizeof(p));
В файл записывается содержимое класса string, а т.к. этот класс выделяет память динамически, то в файл попадают указатели на эту память, но не ее содержимое, в этом и есть проблема.
1
Maksumko
12 / 12 / 4
Регистрация: 13.06.2015
Сообщений: 60
24.07.2015, 08:51  [ТС] #6
а как сделать чтоб принимало содержимое класса string и попадало содержимое а не указатели ?
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
24.07.2015, 13:56 #7
Цитата Сообщение от Maksumko Посмотреть сообщение
а как сделать чтоб принимало содержимое класса string и попадало содержимое а не указатели ?
Использовать текстовые методы чтения/записи.

Добавлено через 5 минут
Запись и чтение структуры с файла
1
24.07.2015, 13:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2015, 13:56
Привет! Вот еще темы с ответами:

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

Чтение из файла и запись - C++
Доброго времени суток. Передо мной стоит следующая задача - имеется файл и строк слов такого типа: АААА ББББ ВВВВВ АААА ПППП АААА...

Запись и чтение из файла - C++
Здравствуйте не могли бы мне помочь разобраться, что не так. Есть две программы, одна для записи в файл “Writer.exe” а для чтения...

запись\чтение из файла - C++
У меня несколько вопросов по поводу запись\чтение из файла Как это вообще работает?) Чтобы потом читать из файла надо забивать каждое...


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

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

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