Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2011, 16:10   #1
Cyber
Пользователь
 
Регистрация: 07.05.2008
Сообщений: 18
По умолчанию Удаление записи и редактирование существующей

Есть у меня код программы (огромное спасибо kaljan775 за перелопаченный код). Сам я в с++ ниже уровня чайника.

Код:
 
#include "stdafx.h"
#include <fstream>
#include <iostream>// файл протоитпа функциий работы с патоками
#include <malloc.h> //файл протоитпа функциий распределения памяти
#include <string.h>// файл протоитпа функциий строкового типа
#include <stdlib.h> //файл протоитпа функциий функции преобразованиятипов
using namespace std;

struct StrComputer{ // обявление структуры хронящей данные о обонентах
		char Nomer[50];	//Обьявление полей стнруктуры строкового типа
		char User[20];	//Обьявление полей стнруктуры строкового типа
		char Room[15];	//Обьявление полей стнруктуры строкового типа
};

struct StrConfig{ // обявление структуры хроняшей данные о телефонах
		char MB[50];	//Обьявление полей стнруктуры строкового типа
		char CPU[50];	//Обьявление полей стнруктуры строкового типа
		char RAM[50];	//Обьявление полей стнруктуры строкового типа
		char HDD[50];	//Обьявление полей стнруктуры строкового типа
		char VGA[50];	//Обьявление полей стнруктуры строкового типа
};

struct StrSoft{ // обявление структуры хроняшей данные о телефонах
		char OS[50];	//Обьявление полей стнруктуры строкового типа
		char Ver[50];	//Обьявление полей стнруктуры строкового типа
		char Date[50];	//Обьявление полей стнруктуры строкового типа
};

void inputCheck(ifstream & input){//функция проверки потока ввода на ошибки
	if (input.fail()){
		cout<<"Ошибка открытия файла!"<<endl;
		system("pause");//Для продолжения нажмите любую клавишу . . .
		exit(1);//выход из программы
	}
}
	
void sbrosVFile(int size,int j,StrComputer*mas,StrConfig*mas1,StrSoft*mas2){
    ofstream outfile ("Computers.txt", ios::app);        //организация потока для выведения в файл со списком компьютеров        
    //outfile.seekp( 0, ios::end );
    ofstream outfile1 ("Config.txt", ios::app);        //организация потока для выведения в файл со списком конфигурации
    //outfile.seekp( 0, ios::end );
    ofstream outfile2 ("Soft.txt", ios::app);        //организация потока для выведения в файл со списком ПО
    //outfile.seekp( 0, ios::end );

    for (int i = j; i < size; i++){                //Цикл проходки по массиву
        outfile << mas[i].Nomer     << endl;//передача из массива в поток номер компьютера
        outfile << mas[i].User   << endl;        //передача из массива в Пользователя
        outfile << mas[i].Room << endl;
        
        outfile1 << mas1[i].MB  << endl;//Потоковое сохранение оценок и предметов из редактированного массива структур
        outfile1 << mas1[i].CPU << endl;
        outfile1 << mas1[i].RAM  << endl;
        outfile1 << mas1[i].HDD << endl;
        outfile1 << mas1[i].VGA  << endl;
        
        outfile2 << mas2[i].OS  << endl;
        outfile2 << mas2[i].Ver << endl;
        outfile2 << mas2[i].Date  << endl;
    }
    outfile.close();
    outfile1.close();
    outfile2.close();
}

int ПодсчетКоличестваОбъектов(){
	char text[100];
	int j=0;
	ifstream input("Computers.txt");
	inputCheck(input);
	while(!input.eof()){
		input.getline(text,100,'\n');
		input.getline(text,100,'\n');
		input.getline(text,100,'\n');
		j++;
	}
	j--;
	return j;
}

void checkingInput(char *slovo1,char *slovo2,char * slovo3,char *slovo4){
	cout << "****************************************************************************" << endl;
	cout << "Критерий "<<slovo1<<" ?"					<< endl;
	cout << "Искать по "<<slovo2<<" 		 1"				<< endl;
	cout << "Искать по "<<slovo3<<"  	 2"			<< endl;
	cout << "Искать по "<<slovo4<<"   		 3"				<< endl;
}
Cyber вне форума Ответить с цитированием
Старый 16.02.2011, 16:11   #2
Cyber
Пользователь
 
Регистрация: 07.05.2008
Сообщений: 18
По умолчанию

Код:
void vvodDannih(int size,StrComputer*mas,StrConfig*mas1,StrSoft*mas2){
	cout << "****************************************************************************" << endl;
	cout<<("Введите номер компьютера: ");//предложение ввести номер компьютера
	cin.getline(mas[size - 1].Nomer,sizeof(mas[size - 1].Nomer));//считывание в массив номер компьютера
	cout<<("Введите пользователя ");//предложение ввести пользователя
	cin.getline(mas[size - 1].User,sizeof(mas[size - 1].User));//считывание в массив пользователя
	cout<<("Введите кабинет ");//предложение ввести кабинет
	cin.getline(mas[size - 1].Room,sizeof(mas[size - 1].Room),'\n');//считывание в массив телефона абонента
	cout<<("Введите название материнской платы ");//предложение ввести название материнской платы
	cin.getline(mas1[size - 1].MB,sizeof(mas1[size - 1].MB),'\n');//считывание в массив названия материнской платы
	cout<<("Введите название просессора "); 		 
	cin.getline(mas1[size - 1].CPU,sizeof(mas1[size - 1].CPU),'\n');
	cout<<("Введите название оперативной памяти ");
	cin.getline(mas1[size - 1].RAM,sizeof(mas1[size - 1].RAM),'\n');
	cout<<("Введите название жесткого диска "); 		 
	cin.getline(mas1[size - 1].HDD,sizeof(mas1[size - 1].HDD),'\n');
	cout<<("Введите название видеокарты ");
	cin.getline(mas1[size - 1].VGA,sizeof(mas1[size - 1].VGA),'\n');
	cout<<("Введите название операционной системы "); 		 
	cin.getline(mas2[size - 1].OS,sizeof(mas2[size - 1].OS),'\n');			
	cout<<("Введите версию OS "); 		 
	cin.getline(mas2[size - 1].Ver,sizeof(mas2[size - 1].Date),'\n');			
	cout<<("Введите дату установки OS "); 		 
	cin.getline(mas2[size - 1].Date,sizeof(mas2[size - 1].Ver),'\n');	
	cout << "****************************************************************************" << endl;
}

void vivodDannih1(int i,struct  StrComputer *MestoPoiska) {				
				cout << "По запросу был найден компьютер: "<< endl;
				cout << MestoPoiska[i].Nomer             << endl;
				cout << MestoPoiska[i].User			<< endl;
				cout << MestoPoiska[i].Room		    << endl;
}
	
//Описание процедуры поиска данных
//Входнве параметры : принцип поиска, с каким значением сравнивать
// количество итераций. Массив в котором призводить поиск
//Выходнве параметры : Индекс найденного элемента массива.
int poisk(int vibor, char *parametr,int kolIter,struct  StrComputer *MestoPoiska){
	int i,index=32000;//обьявление рабочих перменных
	//начальнве парметры пременной
	switch (vibor)//Оператор выбора
	{			
	case 1://1-ый случай выбора
		for ( i = 0 ; i < kolIter ; i++)	//Оператор цикла прохода по массиву
		{
			if ((strcmp(MestoPoiska[i].Nomer , parametr)) == 0)//Хранение Элемента массива хронящего номер компьютера и ключевого слова введенного пользователем
			{
				vivodDannih1(i,MestoPoiska);
				index = i;//Сохранение индекса элемента массива
			}					
		}
	break;		//Операция досрочного выхода из цикла(необходима по синткасису)
	case 2://2-ый случай выбора
		for ( i = 0 ; i < kolIter ; i++)	//Оператор цикла прохода по массиву
		{
			if ((strcmp(MestoPoiska[i].User , parametr)) == 0)//Хранение Элемента массива хронящего пользователя и ключевого слова введенного пользователем
				{
					vivodDannih1(i,MestoPoiska);
					index = i;
				}					//Сохранение индекса элемента массива
		}
	break;			//Операция досрочного выхода из цикла(необходима по синткасису)
	case 3:		//3-ый случай выбора
		for ( i = 0 ; i < kolIter ; i++)			//Оператор цикла прохода по массиву	
		{
			if ((strcmp(MestoPoiska[i].Room , parametr)) == 0)//Сранение Элемента массива хронящего номер кабинета и ключевого слова введенного пользователем
			{
				vivodDannih1(i,MestoPoiska);
				index = i;
			}					//Сохранение индекса элемента массива
		}
	break;
	}			//Операция досрочного выхода из цикла(необходима по синткасису)	
	return index;	//возврат из процедуры индекса элемента
}
Cyber вне форума Ответить с цитированием
Старый 16.02.2011, 16:12   #3
Cyber
Пользователь
 
Регистрация: 07.05.2008
Сообщений: 18
По умолчанию

Код:
void main()//основная процедура программы
{
	setlocale(0,"Rus");//чтобы русский язык показывался корректно
	
	int deistvie, vibor, indexx=0, size;//определение рабочих переменных
	int i,j;  
	char parametr[50];
	struct  StrComputer *mas; 
	struct  StrConfig  *mas1;
	struct  StrSoft  *mas2;
	
	cout << "Программа учета компьютеров" << endl;	//выведение строки преветствия 
	ifstream infile  ("Computers.txt");	 	//организация потока данных при работе с тексовым файлом хронящим информацию о обонентах 
	inputCheck(infile);
	//size = 0;
	//начальный размер массива хроняшего даннве о обонентах
	size=ПодсчетКоличестваОбъектов();    //определение количества записей(труктура занимает около 40 килобайт)
	j=size;//запоминаем начальное количество объектов
	cout << "Количество записей - " << size << endl;	//выведение строки сообшения о вол - ве данных в файле
	mas =  (struct  StrComputer*) malloc (size * sizeof(struct  StrComputer));    //бьявление массива структурного типа и выделение под него памяти
	for (int i=0;i<size;i++){	//цикл заполнения массива из потока данных
		infile .getline(mas[i].Nomer,10);	 //считывание и запись в массив номера компьютера
		infile .getline(mas[i].User,100);//считывание и запись в массив пользователя
		infile .getline(mas[i].Room,10);//считывание и запись в массив номера кабинета
	}
	infile.close();	//закрытие потока ввода данных
	infile.open ("Config.txt");	//организация потока даннвх при работе с тексовым файлом хронящим информацию о оценках
	inputCheck(infile);//проверки на ошибки открытия потока из файла
	mas1 =  (struct  StrConfig*) malloc (size * sizeof(struct  StrConfig));    //бьявление массива структурного типа и выделение под него памяти
	for (i = 0; i < size; i++){	//цикл заполнения массива из потока данных
		//цикл от 0 элемента по количество элемента
		infile .getline(mas1[i].MB,50);
		infile .getline(mas1[i].CPU,10);
		infile .getline(mas1[i].RAM,50);
		infile .getline(mas1[i].HDD,10);
		infile .getline(mas1[i].VGA,50);
	}
	infile.close();	 //закрытие потока данных
	infile.open ("Soft.txt");	 //организация потока даннвх при работе с тексовым файлом хронящим информацию о оценках
	inputCheck(infile);//проверка на ошибку
	mas2 = (struct StrSoft*) malloc (size * sizeof(struct StrSoft));     //бьявление массива структурного типа и выделение под него памяти
	for (i = 0; i < size; i++){ //цикл заполнения массива из потока данных
		//цикл от 0 элемента по количество элемента
		infile .getline(mas2[i].OS,50);
		infile .getline(mas2[i].Ver,15);
		infile .getline(mas2[i].Date,50);
	}
		infile.close();//закрытие потока данных
	
	for (i = 0; i < size; i++)//цикл прохода по массиву и выведения всех даннвх на дисплэй
	{
		cout << " " << endl;
		cout << "Номер компьютера - " << mas[i].Nomer     << endl;
		cout << "Имя пользователя - " << mas[i].User   << endl;
		cout << "Номер кабинета - " << mas[i].Room << endl;
		cout << "Матреинская плата - " << mas1[i].MB << endl; 
		cout << "Жестки диск - " << mas1[i].HDD << endl;
		cout << "Операционная система - " << mas2[i].OS << endl;
		cout << " " << endl;
	}
	do{ 
	//блок сообщений для работы с консольным пиложением
	cout << " " << endl;
	cout << "****************************************************************************" << endl;
	cout << "Для поиска определенной записи введите 	1"<< endl;
	cout << "Для соззания записи введите 	2"<< endl;
	cout << "Для удаления записи введите	3"<< endl;
	cout << "Для редактирования определенной записи введите	  4"  << endl;
	cout << "Для выхода введите 	0"<<endl;
	cout << "****************************************************************************" << endl;
	cout << " " << endl;
	cin >> deistvie;	//считывание выбранного действия
	cin.sync();//очистка ввода
	switch (deistvie)	//оператор выбора действия призводимого программой
Cyber вне форума Ответить с цитированием
Старый 16.02.2011, 16:15   #4
Cyber
Пользователь
 
Регистрация: 07.05.2008
Сообщений: 18
По умолчанию

Код:
	{
		case 1:			//если выбрано действие 1
			checkingInput("поиска","компьютер","пользователь","кабинет")	;
			cin >> vibor;// запрoс по какому пинципу призводить поиск??
			cin.sync();
			//инициализация поиска
			cout<<"Введите интересующий вас параметр ";			//предложение ввести параметр поиска
			cin.getline(parametr,50,'\n');			//считывание 	
			indexx = poisk(vibor,parametr,size,mas);			//переходна поцедуру поиска
			//индекс найденного элемента на данном этапе ненужен			
		break;			//функция прерывание case
		case 2:			//если выбрано действие 2
				//добавление данных в структуру
			size = size + 1;			//увеличение количества массивов на 1 
            mas  = (struct  StrComputer*)realloc(mas,size* sizeof(struct  StrComputer));//переспределение памяти в массиве содержащем записи о компьютерах
			mas1 = (struct  StrConfig*) realloc (mas1,size * sizeof(struct  StrConfig));//переспределение памяти в массиве содержащем записи конфигурации
			mas2 = (struct  StrSoft*) realloc (mas2,size * sizeof(struct  StrSoft));//переспределение памяти в массиве содержащем записи о ПО
			vvodDannih(size,mas,mas1,mas2);		
		break;// команда досрочного выхода из case
		case 3://если выбрано действие 3
		//процедура удаления
			checkingInput("поиска для удаления","Номеру компьютера","Пользователю","Кабинету");//запрос по какому параметру необходимо найти элемент для удаления
			cin >> vibor;//считывание параметра
			cin.sync();
			cout<<("Введите интересующий Вас параметр ");//инициализация параметра
			cin.getline(parametr,sizeof(parametr));//считвание строки с парметро для поиска
			indexx = poisk(vibor,parametr,size,mas);//переход на функцию поиска с передачей параметров
			if (indexx == 32000)//если ниодной записи не найдено возвращается число 32000
				cout << "По данному параметру не найдено ни одной записи "<< endl;//вцыведенние строки сообшения о том что ненайдено ни 1 го элемента
			else{// в противном случае(если элемент найден)
				for (i = indexx; i < size; i++)//цикл прохода по массиву от индекса найденого элемента по конц массива
				{
					mas[i]  = mas [i + 1];//перприсваение данных в массиве со списком студентов на элемент ранее (-1)
					mas1[i] = mas1[i + 1];
					mas2[i] = mas2[i + 1];
				}
				size = size - 1;//уменьшение на 1 количества элементов
				j = j - 1;
	            mas  = (struct  StrComputer*)realloc(mas,size* sizeof(struct  StrComputer));
     	            mas1 = (struct  StrConfig*) realloc (mas1,size * sizeof(struct  StrConfig));
                    mas2 = (struct  StrSoft*) realloc (mas2,size * sizeof(struct  StrSoft));
			}			
		break;//функция досрочного выхода из цикла
		case 4://если выбрано действие 4
		//редактирование записи
			checkingInput("для редактирования","Номера компьютер","Пользователя","Кабинета");//запрос по какому параметру необходимо найти элемент для редактирования
			cin >> vibor;//считывание параметра
			cin.sync();
			cout<<("Введите интересующий вам параметр ");//инициализация параметра
			cin.getline(parametr,sizeof(parametr),'\n');//считвание строки с парметро для поиска
			indexx = poisk(vibor,parametr,size,mas) ;//переход на функцию поиска с передачей параметров
			if (indexx == 32000)//если ниодной записи не найдено возвращается число 32000
				cout << "По данному параметру не найдено ни одной записи "<< endl;//вцыведенние строки сообшения о том что ненайдено ни 1 го элемента
			else{//в пративном случае:
				vvodDannih(indexx+1,mas,mas1,mas2);	//перезаписывние данных с клавиатуры на элемент  с найденным индексом			
			}//конец else
			break;
		case 0:
			break;
		}
	}
	while(deistvie!=0);
	
	sbrosVFile(size,j,mas,mas1,mas2);

}
Вопрос: почему не работает действие удаление записи (case 3) и редактирование (case 4) в main.
Есть подозрение что в этом виновато ofstream outfile ("Computers.txt", ios::app) и ещё что-то.
Cyber вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактирование текущей записи Dbgrid -=pasha=- Общие вопросы Delphi 9 19.02.2013 03:16
Редактирование записи Access Dmitriy.G БД в Delphi 3 17.09.2010 11:39
Access, редактирование записи byte916 Помощь студентам 1 30.05.2010 01:58
Редактирование записи ado palochka БД в Delphi 7 24.05.2010 10:58
Редактирование выделой записи Droid БД в Delphi 17 06.07.2009 16:32