Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перезаписать структуру в файл 
:(
    Опции темы
dlp
  Дата 25.10.2012, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.10.2012

Репутация: нет
Всего: нет



Добрый день. Помогите плиз. Имеется файл со структурой(фильм, режиссер. продолжительность, цена).  нужно вывести на экран фильмы цены которых  ниже заданного пользователя и перезаписать результат в тот же файл. Вывод получается но при вызове функции void print(dvd *p1) появляется ошибка http://s1.ipicture.ru/uploads/20121025/RhchIUs4.png 
user posted image
Код

// kurs_9_2.cpp: главный файл проекта.

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <atlstr.h>
 
 
#include <stdio.h>
#include <stdlib.h>
 
 
using namespace System;
using namespace std;
 
//**********
 
int t; // кол dvd дисков
 
struct dvd //структура dvd диска 
{
char namefilm[20];//название фильма
char namereg[20];// имя режисера
int prodol; // продолжительность в минутах
int cena; // цена
};
 
void addvd(dvd *p1) // добавление дисков
{   

    cout<<"Вводите только латиницей(английскими)\n";
    cout<<"Количество dvd дисков = "; 
    cin>>t;
 //запись в файл
 fstream f("f.dat", ios::out);
    for(int i=0; i<t; i++)
 {  cout<<"\nназвание фильма: ";           cin>>p1[i].namefilm;   f<<p1[i].namefilm<<" ";
    cout<<"имя режисера: ";                cin>>p1[i].namereg;    f<<p1[i].namereg<<" ";
    cout<<"продолжительность в минутах: "; cin>>p1[i].prodol;     f<<p1[i].prodol<<" ";
    cout<<"цена: ";                        cin>>p1[i].cena;       f<<p1[i].cena<<"\n";
 
 }
 f.close();//закрытие потока

}
 
 
void print(dvd *p1)//вывести на экран
{
cout<<"\n";
fstream f("f.dat", ios::in);
for(int i = 0; !f.eof(); i++)
{  
    char temp[100];
    f >> temp;
    if (f.eof()) break;
    strcpy(p1[i].namefilm, temp); 
    cout<<"    Диск: "<<i+1<<endl;
    cout<<"Название фильма: "<<p1[i].namefilm<<endl;
    f >> p1[i].namereg; cout<<"Имя режисера: "<<p1[i].namereg<<endl;
    f >> p1[i].prodol; cout<<"Продолжительность: "<<p1[i].prodol<<endl;
    f >> p1[i].cena; cout<<"Цена: "<<p1[i].cena<<"\n\n";
    
}
f.close();
}
//*********
void poisk_cena(dvd *p1)
{
int rub;
cout<<"Задайте цену: ";
cin>>rub;


fstream f("f.dat", ios::in | ios::out);
for(int i = 0; !f.eof(); i++)
{  
    char temp[20];
    f >> temp;
    if (f.eof()) break;
    strcpy(p1[i].namefilm, temp); 
    f >> p1[i].namereg;
    f >> p1[i].prodol;
    f >> p1[i].cena;
    if (p1[i].cena<rub){
    cout<<"Название фильма: "<<p1[i].namefilm<<" ";
    cout<<p1[i].namereg<<" ";
    cout<<p1[i].prodol<<" ";
    cout<<p1[i].cena<<" \n";
    }
}
f.close();
}
//*******  ГЛАВНАЯ ***************
int main()
{
    setlocale(LC_ALL,"Russian"); // подключение русского языка
    int k; // меню
    
  dvd *p1 = new dvd[];
 
    do{
    cout<<"1. Создать БД дисков\n";
    cout<<"2. Вывести данные\n";
    cout<<"3. Удалить с ценой выше чем...\n";
    cout<<"4. Добавить\n";
    cout<<"5. Выход\n";
    cin>>k;
    switch(k){
    case 1: addvd(p1); break;
    case 2: print(p1); break;
    case 3: poisk_cena(p1); break;
    case 4: cout<<""; break;
    }} while(k!=5);
 
    system("pause");
    return 0;
}


При попытке просто вывести на экран появляется такая же примерно ошибка.
PM MAIL   Вверх
feodorv
Дата 25.10.2012, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dlp @  25.10.2012,  10:46 Найти цитируемый пост)
  dvd *p1 = new dvd[];

Это память выделяется на сколько элементов??? С учётом дальнейшего
Цитата(dlp @  25.10.2012,  10:46 Найти цитируемый пост)
    cin>>t;
    for(int i=0; i<t; i++)
 {  cout<<"\nназвание фильма: ";           cin>>p1[i].namefilm;
...

Вы явно вылезаете за пределы запрошенной в new dvd[]; памяти. По логике должно быть так:
Код

    cout<<"Количество dvd дисков = "; 
    cin>>t;
    dvd *p1 = new dvd[t];
    for(int i=0; i<t; i++) ...




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dlp
Дата 25.10.2012, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.10.2012

Репутация: нет
Всего: нет



как реализовать то что вышло на экран в функции void poisk_cena() и перезаписать в тот же файл?

Это сообщение отредактировал(а) dlp - 25.10.2012, 11:26
PM MAIL   Вверх
feodorv
Дата 25.10.2012, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dlp @  25.10.2012,  12:10 Найти цитируемый пост)
как реализовать то что вышло на экран в функции void poisk_cena() и перезаписать в тот же файл?

Прежде всего - правильно выделить память:
Цитата(feodorv @  25.10.2012,  11:28 Найти цитируемый пост)
    cout<<"Количество dvd дисков = "; 
    cin>>t;
    dvd *p1 = new dvd[t];
    for(int i=0; i<t; i++) ...



Это сообщение отредактировал(а) feodorv - 25.10.2012, 19:23


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dlp
Дата 26.10.2012, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.10.2012

Репутация: нет
Всего: нет



почему выходит мусор?
Код

void poisk_cena()
{if (est){ 
dvd *p1 = new dvd[t];
int rub;
cout<<"Задайте цену: ";
cin>>rub;
//*******
dvd *p2 = new dvd[];// сюда сохр отсортированные диски
int m = 0;
int e = 0; // количество оставшихся дисков
//*********
fstream f("f.dat", ios::in | ios::out);
for(int i = 0; i<t; i++)
{  
    f >> p1[i].namefilm; 
    f >> p1[i].namereg;
    f >> p1[i].prodol;
    f >> p1[i].cena;
    if (p1[i].cena<rub){
    cout<<"       Диск: "<<i+1<<"\n";
    cout<<"Название фильма: "<<p1[i].namefilm<<"\n";    p2[m].namefilm==p1[i].namefilm;
    cout<<"Имя режиссера: "<<p1[i].namereg<<"\n";        p2[m].namereg==p1[i].namereg;
    cout<<"Продолжительность: "<<p1[i].prodol<<"\n";    p2[m].prodol==p1[i].prodol;
    cout<<"Цена: "<<p1[i].cena<<"\n\n";                    p2[m].cena==p1[i].cena;
    m++;
    e++;
    }
}

for(int m ; m<e; m++)
{  cout<<"-------------------------\n";
    cout<<"Название фильма: "<<p2[m].namefilm<<endl;
    cout<<"Имя режисера: "<<p2[m].namereg<<endl;
    cout<<"Продолжительность: "<<p2[m].prodol<<endl;
    cout<<"Цена: "<<p2[m].cena<<"\n\n";
    
}

f.close(); delete [] p1; 
delete [] p2;
}
else {cout<<"\nОшибка! Нет дисков\n";}

}

PM MAIL   Вверх
feodorv
Дата 26.10.2012, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dlp @  26.10.2012,  17:48 Найти цитируемый пост)
dvd *p2 = new dvd[];// сюда сохр отсортированные диски

Те же грабли.

Цитата(dlp @  26.10.2012,  17:48 Найти цитируемый пост)
   cout<<"Название фильма: "<<p1[i].namefilm<<"\n";    p2[m].namefilm==p1[i].namefilm;
    cout<<"Имя режиссера: "<<p1[i].namereg<<"\n";        p2[m].namereg==p1[i].namereg;
    cout<<"Продолжительность: "<<p1[i].prodol<<"\n";    p2[m].prodol==p1[i].prodol;
    cout<<"Цена: "<<p1[i].cena<<"\n\n";                    p2[m].cena==p1[i].cena;

Почему ==?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dlp
Дата 27.10.2012, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.10.2012

Репутация: нет
Всего: нет



Если поставить = то выводит ошибку 
1>kurs_9.cpp(90): error C2106: =: левый операнд должен быть левосторонним значением
1>kurs_9.cpp(91): error C2106: =: левый операнд должен быть левосторонним значением
PM MAIL   Вверх
feodorv
Дата 27.10.2012, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dlp @  27.10.2012,  08:49 Найти цитируемый пост)
Если поставить = то выводит ошибку 

Давайте тогда перебирать все имеющиеся в наличии операции: != *= += и т.д.))) Превратим программирование в гадание, почему нет smile 

== - это операция сравнения. И у Вас будут сравниваться два указателя. Но никакого копирования содержимого одной структуры в другую не будет и в помине...

Сперва просто распечатайте значения, потом скопируйте структуры. Как? Да хотя бы простейшим memcpy:
Код

memcpy( &p2[m], &p1[i], sizeof(struct dvd));


Но если уж так хочется копировать всё по отдельности, то для этого есть strcpy.




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
dlp
Дата 27.10.2012, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 25.10.2012

Репутация: нет
Всего: нет



Все исправил но выходит ошибка после вывода первого результата поиска:
Необработанное исключение типа "System.AccessViolationException" произошло в kurs_9.exe

Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.

Код

void poisk_cena(){
if (est){ 
dvd *p1 = new dvd[t];
int rub;
cout<<"Задайте цену: ";
cin>>rub;
//*******
int m = 0; 
dvd *p2 = new dvd[m];// сюда сохр отсортированные диски
int e = 0; // количество оставшихся дисков
//*********

fstream f("f.dat", ios::in);
for(int i = 0; i<t; i++)
{  
    f >> p1[i].namefilm; 
    f >> p1[i].namereg;
    f >> p1[i].prodol;
    f >> p1[i].cena;
    if (p1[i].cena<rub){
        cout<<"       Диск: "<<i+1<<"\n";

        cout<<"Название фильма: "<<p1[i].namefilm<<"\n";    
        cout<<"Имя режиссера: "<<p1[i].namereg<<"\n";        
        cout<<"Продолжительность: "<<p1[i].prodol<<"\n";    
        cout<<"Цена: "<<p1[i].cena<<"\n\n";                    
        // присвоение
        p2[m].namefilm = p1[i].namefilm;
        p2[m].namereg  = p1[i].namereg;
        p2[m].prodol   = p1[i].prodol;
        p2[m].cena     = p1[i].cena;
    
    //memcpy( &p2[m], &p1[i], sizeof(struct dvd)); // присвоение всей структуры
    m++;
    e++;
    }
}

for(int m ; m<e; m++)
{   cout<<"-------------------------\n";
    cout<<"Название фильма: "<<p2[m].namefilm<<endl;
    cout<<"Имя режисера: "<<p2[m].namereg<<endl;
    cout<<"Продолжительность: "<<p2[m].prodol<<endl;
    cout<<"Цена: "<<p2[m].cena<<"\n\n";
}

f.close(); 
// запись результата в файл
fstream fs("f.dat", ios::out);
for(int m ; m<e; m++)
{
fs << p2[m].namefilm << " ";
fs << p2[m].namereg << " ";
fs << p2[m].prodol << " ";
fs << p2[m].cena << "\n";
}
fs.close(); delete [] p2; delete [] p1; 
}
else {cout<<"\nОшибка! Нет дисков\n";}

}

PM MAIL   Вверх
feodorv
Дата 27.10.2012, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(dlp @  27.10.2012,  12:48 Найти цитируемый пост)
int m = 0; 
dvd *p2 = new dvd[m];// сюда сохр отсортированные диски

Вы раз за разом повторяете одну и туже ошибку(((
Вопрос: сколько памяти отведено под p2? Можно ли туда хоть что-нибудь класть?


Цитата(dlp @  27.10.2012,  12:48 Найти цитируемый пост)
        p2[m].namefilm = p1[i].namefilm;
        p2[m].namereg  = p1[i].namereg;
        p2[m].prodol   = p1[i].prodol;
        p2[m].cena     = p1[i].cena;

И что Вы сделали со структурой?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.