OlgaTroll
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Помогите, пожалуйста с программой по файлам. Задание такое: В магазине составлен список людей, которым выдана карта постоянного покупателя. Каждая запись этого списка содержит номер карточки, ФИО, предоставляемую скидку. Нужно вывести информацию о покупателях, имеющих 10% скидку, упорядочить по не убыванию массив структур по номеру карточки (методы пузырьком и Quicksort) и найти покупателя с заданным номером карточки (линейный и двоичный поиск). Программа работает правильно. Единственный вопрос: почему нельзя прочитать информацию из созданных файлов? Что надо изменить/добавить? Т. е когда вводишь файл с определенным именем, пишет "Ошибка при создании файла". # include <iostream.h> # include <stdio.h> # include <conio.h> # include <stdlib.h> # include <string.h> # include <iomanip.h> # include <windows.h> # include <io.h> FILE *fl; struct sp { char num[6]; char fio [30]; double sk; } *mag, two; char name[20], x[6]; int kol=0; int menu(); // меню void nnf(); // ввести имя файла void newf(); // создать новый файл void spisok(); // ввести данные на экран и в файл void opf(); void resc(); // вывести результат на экран void resf(); // вывести результат в файл void s_puz (sp, int); // сортировка пузырьком void s_qsr(sp, int); // сортировка QuickSort void sort (); // выбрать метод сортировки void resc2(); // вывести отсортированный массив структур void nkar(); // ввести номер карточки покупателя int p_lin (sp, int); // линейный поиск int p_dv (sp, int); // двоичный поиск void resc3 (); // выбрать метод поиска и вывести результат int main () { SetConsoleCP (1251); SetConsoleOutputCP (1251); while (1) { switch (menu()) { case 1: nnf(); break; case 2: newf(); break; case 3: spisok(); break; case 4: opf(); break; case 5: resc(); break; case 6: resf(); break; case 7: resc2(); break; case 8: nkar(); break; case 9: resc3(); break; case 10: if (mag!=NULL) {delete []mag;} return 0; default: "Выберите правильно!"; } puts ("Press any key to continue"); getch (); system ("cls"); } } int menu () // Меню { cout <<"Выберите:"<<endl; cout <<"1.Ввести имя файла"<<endl; cout <<"2.Создать новый файл"<<endl; cout <<"3.Ввести данные"<<endl; cout <<"4.Прочитать информацию из файла"<<endl; cout <<"5.Вывести информацию на экран"<<endl; cout <<"6.Записать информацию в файл"<<endl; cout <<"7.Вывести отсортированный массив структур"<<endl; cout <<"8.Ввести номер карточки покупателя"<<endl; cout <<"9.Вывести фамилию покупателя с заданным номером карточки"<<endl; cout <<"10.Освобождение памяти. Выход"<<endl; int i; cin>>i; return i; } void nnf() // Ввести имя файла { cout <<"Введите имя файла"<<endl; cin >>name; } void newf() // Создать новый файл { if ((fl=fopen(name,"wb"))==NULL) { cout <<"Ошибка при создании файла"<<endl; exit(1); } cout <<"OK"<<endl; fclose(fl); } void spisok() // Ввести список на экран и в файл { if ((fl=fopen(name,"rb+"))==NULL) { cout <<"Ошибка при создании файла"<<endl; exit(1); } cout <<"Введите кол-во покупателей:"<<" "; cin >>kol; mag=new sp[kol]; for (int i=0; i<kol; i++) { cout <<"Введите номер карточки покупателя:"; cin >>mag[i].num; cout <<"Введите ФИО покупателя:"; cin >>mag[i].fio; cout <<"Введите размер скидки, предоставляемой покупателю:"; cin >>mag[i].sk; fwrite (&mag[i], sizeof(sp),1,fl); } fclose (fl); } void opf() // прочитать данные из файла { if ((fl=fopen(name,"rb"))==NULL) { cout <<"Ошибка при открытии файла"<<endl; exit(1); } kol=0; while (1) { int nwrt=fread(&two, sizeof(sp),1,fl); if (nwrt!=1) break; mag[kol]=two; cout <<"№ "<<mag[kol].num<<setw(20)<<mag[kol].fio<<setw(15)<<"Скидка-"<<mag[kol].sk<<"%"<<endl; kol++; } fclose (fl); } void resc() // Вывести результат на экран { cout <<"Информация о покупателях, имеющих 10%-ную скидку:"<<endl; for (int i=0; i<kol; i++) if (mag[i].sk==10) cout <<"№ "<<mag[i].num<<setw(20)<<mag[i].fio<<endl; } void resf() // Вывести результат в файл { char namet[30]; FILE *ft; cout <<"Введите имя файла"<<endl; cin >>namet; if ((ft=fopen(namet,"w"))==NULL) { cout <<"Ошибка при создании файла"<<endl; exit(1); } for (int i=0; i<kol; i++) if (mag[i].sk==10) { fprintf (ft, "№% d %s\n", mag[i].num, mag[i].fio); } fclose (ft); } void s_puz (sp *st, int n) // Сорировка пузырьком по номеру карточки { sp tmp; for (int i=0; i<n-1; i++) for (int j=i; j>=0; j--) if (strcmp(st[j].num,st[j+1].num)==1) { tmp=st[j]; st[j]=st[j+1]; st[j+1]=tmp; } } void s_qsr(sp *st, int n) // Сортировка QuickSort по номеру карточки { struct { int l; int r; } stack [20]; int i,j,left,right,s=0; sp m, tmp; stack[s].l=0; stack[s].r=n-1; while (s!=-1) { left=stack[s].l; right=stack[s].r; s--; while (left<right) { i=left; j=right; m=st[(left+right)/2]; while (i<=j) { while (strcmp(st[i].num,m.num)==-1) i++; while (strcmp(st[j].num,m.num)==1) j--; if (i<=j) { tmp=st[i]; st[i++]=st[j]; st[j--]=tmp; } } if ((j-left)<(right-i)) { if (i<right) { s++; stack[s].l=i; stack[s].r=right; } right=j; } else { if (left<j) { s++; stack[s].l=left; stack[s].r=j; } left=i; } } } } void sort () // Выбрать метод сортировки { int k; cout <<"Выберите метод сортировки: 1-пузырьком, 2-QuickSort:"<<" "; cin >>k; switch (k) { case 1: s_puz (mag, kol); break; case 2: s_qsr (mag, kol); break; default: "Выберите правильно!"; } } void resc2() // Вывести отсортированный массив структур { sort(); for (int i=0; i<kol; i++) cout <<"№ "<<mag[i].num<<setw(20)<<mag[i].fio<<setw(15)<<"Скидка-"<<mag[i].sk<<"%"<<endl; } void nkar() // Ввести номер карточки покупателя { cout <<"Введите номер карточки покупателя, которого надо найти:"<<endl; cin >>x; } int p_lin (sp *st, int n) // Линейный поиск { for (int i=0; i<n; i++) if (strcmp(st[i].num,x)==1) return i; return -1; } int p_dv (sp *st, int n) // Двоичный поиск { s_qsr (mag, kol); int i=0, j=n-1, m; while (i<j) { m=(i+j)/2; if (strcmp(x,st[m].num)==1) i=m+1; else j=m; } if (!strcmp(st[i].num,x)) return i; else return -1; } void resc3 () // Выбрать метод поиска и вывести результат { int p; cout <<"Выберите метод поиска: 1-полный, 2-двоичный:"<<" "; cin >>p; cout <<endl; cout <<"Информация о покупателе, с номером карточки"<<" "<<x<<":"<<endl; switch (p) { case 1: { if (p_lin(mag, kol)==-1) cout <<"Покупатель с номером карточки"<<" "<<x<<" "<<"не найден"<<endl; else cout <<mag[p_lin(mag,kol)].fio<<setw(15)<<"Скидка-"<<mag[p_lin(mag,kol)].sk<<"%"<<endl; break; } case 2: { if (p_dv(mag, kol)==-1) cout <<"Покупатель с номером карточки"<<" "<<x<<" "<<"не найден"<<endl; else cout <<mag[p_dv(mag,kol)].fio<<setw(15)<<"Скидка-"<<mag[p_dv(mag,kol)].sk<<"%"<<endl; break; } default: "Выберите правильно!"; } } |