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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2009, 20:43   #1
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию ошибка при чтении файла

есть рабочий код:
Код:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <string.h>

using namespace std;
void Menu();
int c=0;							//Глобальная переменная с - для количества элементов структуры 
int k=0;							//Глобальная переменная к - для номера увольняемого абонента
struct Worker						//Структура для абонента
{
		struct FIO
		{
        char surname[50];			//Фамилия 
        char name[50];				//Имя
        char second_name[50];		//Отчество
		};	
	FIO fio;
	char birth[10];					//Дата рождения
	char sex[30];					//Пол
	int staj;						//Стаж работы по специальности 
	char adress[100];				//Домашний адрес 	
	char berth[50];					//Должность
    int salary;						//Оклад
    };
class Firma							//Создаю свой класс
{
public:
    Firma();						//Конструктор	
	void LoadFile();				//Функция для считывания информации из файла
    void New_worker();				//Функция для добавления экземпляра структуры
	void Remove_base();				//Функция для удаления сотрудника
	void See_Base();				//Функция просмотра базы
    void Naity();					//Функция для поиска по адресу/фамилии
	void Yvolit();					//Функция для увольнения сотрудника
	void SaveFile();				//Функция для записи телефонной книги в файл
	Worker work[40];				//40 экземпляров структуры Worker 
};
Firma fir;							//Экземпляр класса
Firma::Firma()						//Инициализация конструктора
{
}

void Firma::LoadFile()				
{	
	FILE *f = fopen("workers.txt", "r");	//Открываем базу 
	if((f=fopen("workers.txt","r"))==NULL)			
        printf("Cannot open file\n");		//Сообщение, если невозможно открыть файл
	char buff[150],*p;
	int i=0;
	while(!feof(f))							//Цикл продолжается, пока не достигнут конец файла
	{
		fgets (buff, sizeof(buff), f);		//Считывание первой строки файла
		p = strtok (buff," ");				//Указатель на первую строку в файле до первого знака " "
		strcpy (work[i].fio.surname, p);	//Копирование первой строки до " " в массив экземпляра структуры
		p = strtok (NULL, " ");				//Указатель на первую строку в файле до второго знака " "
		strcpy (work[i].fio.name, p);		//Копирование первой строки от " " до " " в массив экземпляра структуры
		p = strtok (NULL, "\n");			//Указатель на первую строку в файле от второго знака " " до конца строки
		strcpy (work[i].fio.second_name, p);//Копирование первой строки от " " до конца строки в массив экземпляра структуры
		fgets (buff, 10, f);				//Считывание второй строки файла
		p = strtok (buff, "\n");			//Указатель на вторую строку в файле
		strcpy (work[i].birth, p);			//Копирование второй строки в массив экземпляра структуры
		fgets(buff, sizeof(buff),f);		//Считывание третьей строки файла
		p = strtok (buff, "\n");			//Указатель на третью строку в файле
		strcpy (work[i].sex, p);			//Копирование третьей строки в массив экземпляра структуры
		fgets(buff, sizeof(buff),f);		//Считывание четвертой строки файла
		work[i].staj = atoi(buff);			//Присваивание переменной экземпляра структуры значения из четвертой строки файла
		fgets(buff, sizeof(buff),f);		//Считывание пятой строки файла
		p = strtok (buff, "\n");			//Указатель на пятую строку в файле
		strcpy (work[i].adress, p);			//Копирование пятой строки в массив экземпляра структуры
		fgets(buff, sizeof(buff),f);		//Считывание шестой строки файла
		p = strtok (buff, "\n");			//Указатель на шестую строку в файле
		strcpy (work[i].berth, p);			//Копирование шестой строки в массив экземпляра структуры
		fgets(buff,sizeof(buff),f);			//Считывание седьмой строки файла
		work[i].salary = atoi(buff);		//Присваивание переменной экземпляра структуры значения из седьмой строки файла
		fgets(buff,sizeof(buff),f);			//Считывание восьмой (пустой) строки файла
		i++;								
	}
	c=i;									//Количество структур в файле			
	fclose(f);								//Закрываем базу
}

void Firma::New_worker()
{
	char buf[150],*p;
	cout<<"Enter telephon subscriber surname, name and second name"<<endl;	//ФИО сотрудника
	_flushall();							//Очищает буфер перед вводом сотрудника
	cin.getline(buf,150,'\n');
	p = strtok(buf, " \n");
	strcpy(work[c].fio.surname, p);
	p = strtok(NULL, " \n");
	strcpy(work[c].fio.name, p);
	p = strtok(NULL, "\n\0");
	strcpy(work[c].fio.second_name, p);
	cout<<"Enter date of birth DD/MM/YY"<<endl;					//Дата рождения сотрудника
	cin.getline(work[c].birth, sizeof(work[c].birth), '\n');			
	cout<<"Enter sex of worker"<<endl;
	cin.getline(work[c].sex, sizeof(work[c].sex), '\n');
	cout<<"Enter experience of worker"<<endl;
	cin>>work[c].staj;
	_flushall();
	cout<<"Enter telephon subscriber adress:"<<endl;			//Адрес сотрудника
    cin.getline(work[c].adress, sizeof(work[c].adress), '\n');
	cout<<"Enter berth of worker"<<endl;						//Должность
	cin.getline(work[c].berth, sizeof(work[c].berth), '\n');
	cout<<"Enter salary, $:"<<endl;								//Оклад
	cin>>work[c].salary;
	c++;									//Добавление 1 экземпляра структуры
}
Alik-Soldier вне форума Ответить с цитированием
Старый 31.05.2009, 20:44   #2
Alik-Soldier
Пользователь
 
Регистрация: 01.05.2009
Сообщений: 38
По умолчанию

и вот продолжение:
Код:
void Firma::Yvolit()
{
	char sname[50], nm[50], snm[50];
	bool Yv = false;						//Флажок для поиска и удаления абонента
	cout<<"Enter worker surname, name and second name, who you want to discharge"<<endl;//Уволить
	_flushall();					
	cin.getline(sname, sizeof(sname), 32);
	cin.getline(nm, sizeof(nm), 32);
	cin.getline(snm, sizeof(snm));
	for(int i=0; i<c; i++)
	{
		char s = strcmp (sname, work[i].fio.surname);
		char n = strcmp	(nm, work[i].fio.name);
		char sn = strcmp (snm, work[i].fio.second_name);
		if (s==0 && n==0 && sn==0)
		{
			k=i;
			Yv = true;
			cout<<"worker is discharged"<<endl;
		}
	}
	if(Yv==true)
	{
		--c;
		for(int j=k; j<c; j++)
			work[j]=work[j+1];
	}
	else
		cout<<"There is no such worker"<<endl;
}
void Firma::Naity()
{
	bool find=false;					//Флажок для поиска абонента
	char berth[50];
	_flushall();
	cout<<"Enter worker berth"<<endl;	//Должность
	cin.getline(berth,50,'\n');
	for(int i=0; i<c; i++)
	{
		char fnd = strcmp(berth, work[i].berth);
			if(fnd==0)
			{
				find=true;
				printf("%s %s %s\n", work[i].fio.surname, work[i].fio.name, work[i].fio.second_name);
				printf("\n");
			}
	}
	if(find==false)
		cout<<" Telephon subscriber isn't find"<<endl;
}
void Firma::Remove_base()
{ 
	c=0;				//Количество экземпляров структуры, которое было в файле, приравниваем к 0
	cout<<"Base is removed"<<endl;
}
int main()
{
	fir.LoadFile();
	Menu(); 
	fir.SaveFile();
	return 0;
}
void Menu()
{
	int control;							//Переменная для реакции на клавиатуру
	cout<<"Choose menu position"<<endl;		//Выбрать позицию из меню
    cout<<"\nMENU:\n1. New worker \n2. Discharge worker \n3. Find workers \n4. See base \n5. Remove base \n6. Exit\n"<<endl;
    cin>>control;
    for(;;)
    {
        if(control==1)
			fir.New_worker();
		else
		if(control==2)
			fir.Yvolit();
		else
		if(control==3)
			fir.Naity();
		if(control==4)
			fir.See_Base();
		else
		if(control==5)
			fir.Remove_base();
        if (control==6)break;
		else
		if(control==0 || control>6)
			cout<<"You press incorrect button. Please repeat"<<endl;	//Нажата неверная клавиша, повторить
		cout<<"Choose menu position"<<endl;
        cin>>control;
	}
}
void Firma::See_Base()
{
	_flushall();
	bool se = false;
	char fam[50];
	cout<<"Enter surname worker"<<endl;
	cin.getline(fam, sizeof(fam), '\n');
	for(int i=0; i<c; i++)
	{
		if(strcmp(fam, work[i].fio.surname)==0)
		{
			printf("%s %s %s\n",work[i].fio.surname,work[i].fio.name,work[i].fio.second_name);
			printf("%s\n",work[i].birth);
			printf("%s\n",work[i].sex);
			printf("%d\n",work[i].staj);
			printf("%s\n",work[i].adress);
			printf("%s\n",work[i].berth);
			printf("%d\n",work[i].salary);
			printf("\n");
			se = true;
		}
	}
	if(se = false)
		cout<<"There is no such worker"<<endl;
}
void Firma::SaveFile()
{
	FILE *f;						
	f = fopen("workers.txt", "w");			//Открытие базы
	for(int i=0; i<c; i++)					//Цикл для записи сотрудников в базу
	{
		fprintf(f,"%s %s %s\n",work[i].fio.surname,work[i].fio.name,work[i].fio.second_name);
		fprintf(f,"%s\n",work[i].birth);
		fprintf(f,"%s\n",work[i].sex);
		fprintf(f,"%d\n",work[i].staj);
		fprintf(f,"%s\n",work[i].adress);
		fprintf(f,"%s\n",work[i].berth);
		fprintf(f,"%d\n",work[i].salary);
		if(i<c-1) fprintf(f,"\n");
	}
	fclose(f);								//Закрытие базы
}
Но есть одна проблема: если файл workers.txt пустой, то при запуске программы ошибка появляется...Как исправить данную ошибку?
Прилагаю файл:
http://slil.ru/27711657
Alik-Soldier вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод изобржения на экран при чтении из bmp <iostream> Общие вопросы C/C++ 1 12.02.2009 19:08
Проблема при чтении из файла Satorin Общие вопросы Delphi 2 17.12.2008 11:32
Ошибка при чтении БД из файла!! sting БД в Delphi 4 14.12.2008 22:23
C++: ошибка при открытии файла Retiz Помощь студентам 2 30.08.2008 22:12
Ошибка при загрузке файла html Ign Microsoft Office Excel 1 11.11.2007 13:55