Просмотр и сортировка данных из файла
Пишу "навороченный" :) телефонный справочник на с++:
#include<fstream.h>
int menu();
baza();
prosmotr();
sortirovka();
udalenie();
int main()
{
bool exit=false;
for(;;)
{
int choice=menu();
switch(choice)
{
case (1):
baza();
break;
case (2):
prosmotr();
break;
case (3):
sortirovka();
break;
case (4):
udalenie();
break;
case (5):
exit=true;
break;
default:
cout<<"Please select again!"<<endl;
break;
}
if(exit==true)
break;
}
return 0;
}
int menu()
{
int choice;
cout<<"Telephone book\n";
cout<<" Menu \n";
cout<<"(1)New BD\n";
cout<<"(2)Veiw\n";
cout<<"(3)Sort\n";
cout<<"(4)Delete\n";
cout<<"(5)Exit\n";
cout<<": ";
cin>>choice;
return choice;
}
baza()
{
char fileName[80];
char name[255];
char adres[255];
int nomer;
char otvet;
cout<<"\n";
cout<<"\n";
cout<<"\n";
cout<<"Please enter the file name: ";
cin>>fileName;
ofstream fout(fileName, ios::app);
if(!fout)
{
cout<<"Unable to open "<<fileName<<" for writing.\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
return(1);
}
do
{
cout<<"Enter a name: ";
cin>>name;
cout<<"Address: ";
cin>>adres;
cout<<"Numder of phone: ";
cin>>nomer;
cout<<"Continue (y/n)?";
cin>>otvet;
cout<<"\n";
cout<<"\n";
cout<<"\n";
fout<<endl;
fout<<name<<" "<<adres<<" "<<nomer<<endl;
}
while(otvet=='Y'||otvet=='y'||otvet=='Д'||otvet=='д');
fout.close();
return 0;
}
prosmotr()
{
char fileName[80];
char name[255];
char adres[255];
int nomer[5];
cout<<"\n";
cout<<"\n";
cout<<"\n";
cout<<"Please enter the file name: ";
cin>>fileName;
ifstream fin(fileName);
char ch;
if(!fin)
{
cout<<"Unable to open "<<fileName<<" for reading.\n";
return(1);
}
cout<<"Telephone book\n";
cout<<".__________________________________.\n";
cout<<"|Name | Address |Number |\n";
cout<<"|____________|___________|_________|\n";
while(fin.get(ch))
cout<<ch;
cout<<"|",name," |",adres," |",nomer,"|\n" ;
cout<<"|__________________________________|\n";
cout<<"Press any key for continuation\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
fin.close();
return 0;
}
sortirovka()
{
return 0;
}
udalenie()
{
int result;
result = remove ("data");
if (result == -1)
{
cout<<"Unable to delete file data.\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
}
else
{
cout<<"File data was removed.\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
}
return 0;
}
Не могу понять, как осуществить простую сортировку данных (name, adres, nomer), которые хранятся в файле - базе или поиск. Чего-нибудь одного хватит.
И не получается сделать нормальный (красивый) вывод данных на экран, т.е. чтобы получилось:
|Name | Address |Number |
|____________|___________|_________|
|",name," |",adres," |",nomer,"|
|__________________________________|
Подскажите, пожалуйста, как осуществить задуманное? Или ткните носом в примеры (желательно подробные :)), из которых можно было бы понять суть.
Создаешь структуру:
{
char name[255];
char adres[255];
int nomer;
};
И работаешь уже с ней.
К примеру считывание из файла и вывод:
Zapis zapis;
cout << ".__________________________________.\n";
while (!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
{
cout << zapis.name << "\t" << zapis.adres << "\t" << zapis.nomer << "\n";
}
Или запись в файл:
ofstream ofile("NoteBook.txt", ios::binary);
...
ofile.write((char*)&zapis, sizeof(Zapis));
...
Если надо сортировать, осуществлять поиск - считываешь нужное количество записей в массив структур, и поехали..Методов сортировки куча..
В поисках более подробной информации в поиск:)
Например сюда:
http://www.yandex.ru/yandsearch?rpt=rad&text=ios%3A%3Abinary
Переписал код с использованием структуры:
#include<fstream.h>
#include<stdio.h>
struct Zapis
{
char name[255];
char adres[255];
int nomer;
};
baza();
prosmotr();
sortirovka();
udalenie();
int menu();
int main()
{
bool exit=false;
for(;;)
{
int choice=menu();
switch(choice)
{
case (1):
baza();
break;
case (2):
prosmotr();
break;
case (3):
sortirovka();
break;
case (4):
udalenie();
break;
case (5):
exit=true;
break;
default:
cout<<"Please select again!"<<endl;
break;
}
if(exit==true)
break;
}
return 0;
}
int menu()
{
int choice;
cout<<"Telephone book\n";
cout<<" Menu \n";
cout<<"(1)New BD\n";
cout<<"(2)Veiw\n";
cout<<"(3)Sort\n";
cout<<"(4)Delete\n";
cout<<"(5)Exit\n";
cout<<": ";
cin>>choice;
return choice;
}
baza()
{
struct Zapis zapis;
char otvet;
cout<<"\n";
cout<<"\n";
cout<<"\n";
ofstream ofile("data.txt", ios::binary);
if(!ofile)
{
cout<<"Unable to open data.txt for writing.\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
return(1);
}
do
{
ofile.write((char*)&zapis, sizeof(Zapis));
cout<<"Enter a name: ";
cin>>zapis.name;
cout<<"Address: ";
cin>>zapis.adres;
cout<<"Numder of phone: ";
cin>>zapis.nomer;
cout<<"Continue (y/n)?";
cin>>otvet;
cout<<"\n";
cout<<"\n";
cout<<"\n";
}
while(otvet=='Y'||otvet=='y'||otvet=='Ä'||otvet=='ä');
ofile.close();
return 0;
}
prosmotr()
{
cout<<"\n";
cout<<"\n";
cout<<"\n";
struct Zapis zapis;
ifstream ifile("data.txt", ios::binary);
{
cout<<"Unable to open data.txt for reading.\n";
return(1);
}
cout << ".__________________________________.\n";
cout<<"Telephone book\n";
cout<<".__________________________________.\n";
cout<<"|Name | Address |Number |\n";
cout<<"|____________|___________|_________|\n";
while (!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
{
cout<<"|%-12s|%-11|%-9|\n", zapis.name, zapis.adres, zapis.nomer;
}
cout<<"|__________________________________|\n";
cout<<"Press any key for continuation\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
ifile.close();
return 0;
}
sortirovka()
{
return 0;
}
udalenie()
{
int result;
ofstream ofile("data.txt", ios::binary);
if(!ofile)
{
cout<<"Unable to open data.txt for writing.\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
return(1);
}
result = remove ("data.txt");
if (result == -1)
{
cout<<"Unable to delete file data.txt.\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
}
else
{
cout<<"File data.txt was removed.\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
}
return 0;
}
Теперь файл-база - data.txt ни записывается, ни открывается, ни читается. Что-то я напутал.. :-(
Жирным выделил изменённые части кода.
Lerkin
В том-то всё и дело, что надо без использования БД.
Тем более это курсовой проект, первый курс... Какие БД? :-)
{
ofile.write((char*)&zapis, sizeof(Zapis));
cout<<"Enter a name: ";
cin>>zapis.name;
cout<<"Address: ";
cin>>zapis.adres;
cout<<"Numder of phone: ";
cin>>zapis.nomer;
cout<<"Continue (y/n)?";
cin>>otvet;
cout<<"\n";
cout<<"\n";
cout<<"\n";
}
while(otvet=='Y'||otvet=='y'||otvet=='Ä'||otvet=='ä');
Нужно же сначала заполнить поля структуры, а только потом записывать!!
Что такое:
Может я чо-то путаю, конечно, но нужно просто:
Какое-то у тя странное удаление происходит!! Зачем весь файл-то сносить - удалять-то ты должен только записи, а твоя импровизированная БД должна оставаться целой и невредимой!!
В твоем случае, имхо, лучше использовать произвольный доступ к файлу.
Объявляешь глобальную переменную типа:
В main'e до for открываешь файл:
А после for закрываешь:
И что значит 'файл не открывается'? В чем это проявляется по твоему?
Используй отладчик и посмотри, что он у тя делает!!
1. Только для просмотра базы в текущем сеансе работы программы?
2. Нужно перезаписать отсортированную базу обратно в файл?
В C++ в объявлении функции ВСЕГДА указывается возвращаемый тип.
Программировать станет значительно проще, если ты начнешь использовать ООП. Логично будет определить класс для базы данных и для запсиси в этой базе данных (начало у тебя уже положено - структура Zapis).
Имена методам лучше давать начинающиеся с глагола.
Чем проще формат базы данных тем лучше, поэтому нет смысла создавать бинарный файл, как советовали выше. Пусть это будет обычный текстовый файл: каждая запись в базе - это новая строка, а поля разделены знаком табуляции. Такой файл ты сможешь открыть хоть в блокноте, хоть в Exel и отредактированть/проверить правильность.
Использование в С++ массивов фиксированной длины в большинстве случаев неактуально. Поэтому вместо char name[255] и т.п. используй string.
Эта строка вообще не понятна:
cout<<"|%-12s|%-11|%-9|\n", zapis.name, zapis.adres, zapis.nomer;
Для форматирования вывода в поток существуют манипуляторы (setw, setfill, hex и т.п.)
Разноси функциональность связанную с операциями с данными (сортировка, удаление, добавление) и операции связанные с выводом на экран.
Например функция baza, которую пиравильнее назвать fillDataBase (начинается с глагола) могла бы выглядеть так:
{
string name;
string adres;
string nomer;
};
Record requestRecord()
{
Record record;
cout << "Enter a name: ";
cin >> record.name;
cout << "Address: ";
cin >> record.adres;
cout << "Numder of phone: ";
cin >> record.nomer;
return record;
}
bool fillDataBase()
{
DataBase db;
db.create("data.txt");
if( !db ) {
cerr << "Unable to open data.txt for writing.\n";
return false;
}
do
{
db.add( requestRecord() );
cout << "Continue (y/n)?";
cin >> otvet;
}
while(otvet=='Y'||otvet=='y'||otvet=='Ä'||otvet=='ä');
db.close();
return true;
}
Здесь DataBase - это класс, который тебе надо реализовать.
Данные БД можно хранить в контейнере (std::vector, std::list и т.п.). Для сортировки по конкретному из полей тебе надо будет написать предикат и использовать функцию std::sort для контейнера.
=) Незнакомый оператор.
Исправил, struct тоже убрал. Исправил, теперь файл читается, открывается. И каким-то непонятным образом удаляет содержание файла data.txt, а не сам файл.
Что это даёт? Может, без него как-нибудь?
:) Удаление осуществлено в силу своих знаний.
Не могу, т.к. не умею, а нормальной литературы по отладчику не нашел. :-(
1. Только для просмотра базы в текущем сеансе работы программы?
2. Нужно перезаписать отсортированную базу обратно в файл?
1. Да.
2. Нет. Всего лишь вывести на экран.
О. Спасибо, нам говорили, что функция просто должна возвращать значение.
Начну конечно, только за "21 день" трудно многое усвоить.
Эх. Если б знал, как.
Вроде бы то, что нужно.
Данные БД можно хранить в контейнере (std::vector, std::list и т.п.). Для сортировки по конкретному из полей тебе надо будет написать предикат и использовать функцию std::sort для контейнера.
На данном этапе это для меня трудноосуществимо из-за нехватки времени. Да и не нужно в этой программе всё усложнять. Простой она должна быть.
В общем, задача состоит в том, чтобы с минимальными знаниями написать нечто простое программоподобное.
using namespace std; // а можно и using std::string;
или просто
хотя первое более корректно
Пробовал так, всё равно компилятор ругается.
При использовании using namespace std; // а можно и using std::string; компилятор начинает ругаться на ofstream. :-)
Есть продвижение! Получилось красиво (хотя и через ж) выводить данные базы на экран:
{
cout<<"\n";
cout<<"\n";
cout<<"\n";
Zapis zapis;
ifstream ifile("data.txt", ios::binary);
if(!ifile)
{
cout<<"Unable to open data.txt for reading.\n";
return(1);
}
cout.width(48);
cout.fill('_');
cout<<"\n";
cout<<"|";
cout.width(15);
cout.fill(' ');
cout<<"Name";
cout<<" |";
cout.width(15);
cout<<"Address";
cout<<" |";
cout.width(10);
cout<<"Number";
cout<<" |";
cout<<"\n";
cout<<"|";
cout.width(46);
cout.fill('_');
cout<<"|";
cout<<"\n";
while (!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
{
cout<<"|";
cout.width(15);
cout.fill(' ');
cout<<zapis.name;
cout<<" |";
cout.width(15);
cout<<zapis.adres;
cout<<" |";
cout.width(10);
cout<<zapis.nomer;
cout<<" |";
cout<<"\n";
}
cout<<"|";
cout.width(46);
cout.fill('_');
cout<<"|";
cout<<"\n";
cout<<"\n";
cout<<"Press any key for continuation\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
ifile.close();
return 0;
}
Конечно, создаётся проблема, если переменные больше пределов указанной ширины width, но будем надеяться.
Готов сделать 2 варианта:
1. "Я его слепила из того, что было" :D
2. "Я тут книжку умную почитал и как то сразу разобрался с классами и списками" :rolleyes:
Готов сделать 2 варианта:
1. "Я его слепила из того, что было" :D
2. "Я тут книжку умную почитал и как то сразу разобрался с классами и списками" :rolleyes:
Ну зачем медвежьи услуги оказывать? Может быть человек сам разобраться хочет...
#include <string>
#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string file_name;
cin>>file_name;
ofstream of(file_name.c_str());
return 0;
}
Ни на что не ругается:)
Спасибо за предложение, но тут писать уже нечего, осталась только сортировка или поиск. Что первое в понятном виде найдётся.
Хочу. Но тороплюсь. :-)
m_Valery
Теперь ругается только на TCHAR*. Вроде бы пишет, что она не объявлена.
Да нет. Он здесь вообще не используется, просто в общеобразовательных целях. В общем понятно, tmain - название функции, а TCHAR - тип переменной.
Интересует, можно ли реализовать поиск таким образом.
Открываем файл базы для чтения, читаем из него переменные, оператором if сравниваем искомое слово с переменной, например, zapis.name и затем выводим результат на экран?
Попробуй как - нибудь так для записи .
if(!ofile)
{
cerr<<"Unable to open data.txt for writing.\n";
cout<<"\n\n\n";
}
string word;
while(cin >> word&&word != "0"){
ofile << word << ' ';
}...
Так записывает строки пока не введешь 0.
А потом для чтения так(когда выбираеш 2 пункт меню)
if(!ifile){
cerr<<"Unable to open data.txt for reading.\n";
}
cout << ".__________________________________.\n";
cout<<"Telephone book\n";
cout<<".__________________________________.\n";
cout<<"|Name | Address |Number |\n";
cout<<"|____________|___________|_________|\n";
string text;
while(getline(ifile,text,' ')){
cout<<text<<' ';
}
cout<<endl;...
Я вот попробовал - нормально работает.Подправь только чтоб не просто строки вводить/выводить а поля структуры и отформатируй правильно,
пробелы , табуляция и т.д.Все остальное вроде работает.Типы возвращаемго значения для ф-ий указывай,а бинарные файлы не нужны , обычные текстовые(как тебе уже говорил выше Green)
Судя по тому коду, что в первом посте, намёками и обрывками кода студенту сложно помочь за такое короткое время. Здесь эффективнее будет показать полный код с использованием тех функций, которые обычно успевают осилить на первом курсе и сдобрить всё это хозяйство комментариями.
А если человек захочет дальше вникать, то можно дать ещё и более продвинутый вариант :)
C этим уже справился, правда по другому:
#include<fstream.h>
#include<stdio.h>
#include<string.h>
struct Zapis
{
char name[255];
char adres[255];
int nomer;
};
baza();
prosmotr();
sortirovka();
udalenie();
int menu();
int main()
{
bool exit=false;
for(;;)
{
int choice=menu();
switch(choice)
{
case (1):
baza();
break;
case (2):
prosmotr();
break;
case (3):
sortirovka();
break;
case (4):
udalenie();
break;
case (5):
exit=true;
break;
default:
cout<<"Please select again!"<<endl;
break;
}
if(exit==true)
break;
}
return 0;
}
int menu()
{
int choice;
cout<<"<< Telephone book >>\n";
cout<<"\n";
cout<<" Menu \n";
cout<<"(1)New BD\n";
cout<<"(2)Veiw\n";
cout<<"(3)Sort\n";
cout<<"(4)Delete\n";
cout<<"(5)Exit\n";
cout<<": ";
cin>>choice;
return choice;
}
baza()
{
Zapis zapis;
char otvet;
cout<<"\n";
cout<<"\n";
cout<<"\n";
ofstream ofile("data.txt", ios::binary, ios::app);
if(!ofile)
{
cout<<"Unable to open data.txt for writing.\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
return(1);
}
do
{
cout<<"<< Telephone book >>\n";
cout<<"\n";
cout<<"Entering data\n";
cout<<"\n";
cout<<"Enter a name: ";
cin>>zapis.name;
cout<<"Address: ";
cin>>zapis.adres;
cout<<"Numder of phone: ";
cin>>zapis.nomer;
ofile.write((char*)&zapis, sizeof(Zapis));
cout<<"\n";
cout<<"Continue (y/n)?";
cin>>otvet;
cout<<"\n";
cout<<"\n";
cout<<"\n";
}
while(otvet=='Y'||otvet=='y'||otvet=='Ä'||otvet=='ä');
ofile.close();
return 0;
}
prosmotr()
{
cout<<"\n";
cout<<"\n";
cout<<"\n";
Zapis zapis;
ifstream ifile("data.txt", ios::binary);
if(!ifile)
{
cout<<"Unable to open data.txt for reading.\n";
return(1);
}
cout<<"<< Telephone book >>\n";
cout<<"\n";
cout.width(48);
cout.fill('_');
cout<<"\n";
cout<<"|";
cout.width(15);
cout.fill(' ');
cout<<"Name";
cout<<" |";
cout.width(15);
cout<<"Address";
cout<<" |";
cout.width(10);
cout<<"Number";
cout<<" |";
cout<<"\n";
cout<<"|";
cout.width(46);
cout.fill('_');
cout<<"|";
cout<<"\n";
while (!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
{
cout<<"|";
cout.width(15);
cout.fill(' ');
cout<<zapis.name;
cout<<" |";
cout.width(15);
cout<<zapis.adres;
cout<<" |";
cout.width(10);
cout<<zapis.nomer;
cout<<" |";
cout<<"\n";
}
cout<<"|";
cout.width(46);
cout.fill('_');
cout<<"|";
cout<<"\n";
cout<<"\n";
cout<<"Press any key for continuation\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
ifile.close();
return 0;
}
sortirovka()
{
return 0;
}
udalenie()
{
int result;
result = remove ("data.txt");
if (result == -1)
{
cout<<"Unable to delete data.txt.\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
}
else
{
cout<<"File data.txt was removed.\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
}
return 0;
}
Сейчас пытаюсь сделать сортировку или поиск... Можно ли реализовать поиск с помощью функции stricmp?
А если человек захочет дальше вникать, то можно дать ещё и более продвинутый вариант :)
Всё. Сдавать уже затвтра. Приехали. :-)
Можно ли к приведённому выше коду прикрутить поиск? Кстати, что проще поиск или сортировка?
вообще все просто, если умеешь.
вообще все просто, если умеешь.
в большинстве случаев(не говорю во всех тк не доказываю) поиск проще
в самом лучшем случае у нас будет количество сравнений при сортировке ~nlogn и при этом я молчу про сложность на перестановки
если данные в структуре никак не упорядочены то неминуемо в худшем случае придется сравнивать искомую величину со всеми
если вас не волнует скорость то никаких проблем нет
и как правило чем быстрее поиск тем дольше(сложнее) вставка новых элементов
если данные в структуре никак не упорядочены то неминуемо в худшем случае придется сравнивать искомую величину со всеми
Есть пример? Какие функции для этого используются?
Скорость не важна.
Интересно, это счиатется сортировкой:
{
cout<<"\n";
cout<<"\n";
cout<<"\n";
Zapis zapis;
int ch[20];
int k,i,razm,pr,min,m;
ifstream ifile("data.txt", ios::binary);
if(!ifile)
{
cout<<"Unable to open data.txt for reading.\n";
return(1);
}
for(k=0, i=0;k<20;k++)
if(!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
{
ch[k]=zapis.nomer;
razm=k+1;
}
else
break;
for(i=0;i<razm;i++)
{
min=ch;
pr=i;
for(m=i+1;m<razm;m++)
if(ch[m]<min)
{
min=ch[m];
pr=m;
}
ch[pr]=ch;
ch=min;
}
cout<<"<< Telephone book >>\n";
cout<<"\n";
cout.width(48);
cout.fill('_');
cout<<"\n";
cout<<"|";
cout.width(15);
cout.fill(' ');
cout<<"Name";
cout<<" |";
cout.width(15);
cout<<"Address";
cout<<" |";
cout.width(10);
cout<<"Number";
cout<<" |";
cout<<"\n";
cout<<"|";
cout.width(46);
cout.fill('_');
cout<<"|";
cout<<"\n";
for(i=0;i<razm;i++)
{
if(!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
break;
if(ch==zapis.nomer)
{
cout<<"|";
cout.width(15);
cout.fill(' ');
cout<<zapis.name;
cout<<" |";
cout.width(15);
cout<<zapis.adres;
cout<<" |";
cout.width(10);
cout<<zapis.nomer;
cout<<" |";
cout<<"\n";
}
cout<<"|";
cout.width(46);
cout.fill('_');
cout<<"|";
cout<<"\n";
cout<<"\n";
cout<<"Press any key for continuation\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
ifile.close();
}
return 0;
}
Хотя что-то с циклом не так: низ импровизированной таблицы (выделено жирным) печатается два раза.
{
cout<<"\n";
cout<<"\n";
cout<<"\n";
Zapis zapis;
int ch[20];
int k,i,razm,pr,min,m;
ifstream ifile("data.txt", ios::binary);
if(!ifile)
{
cout<<"Unable to open data.txt for reading.\n";
return(1);
}
for(k=0, i=0;k<20;k++)
if(!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
{
ch[k]=zapis.nomer;
razm=k+1;
}
else
break;
for(i=0;i<razm;i++)
{
min=ch;
pr=i;
for(m=i+1;m<razm;m++)
if(ch[m]<min)
{
min=ch[m];
pr=m;
}
ch[pr]=ch;
ch=min;
}
cout<<"<< Telephone book >>\n";
cout<<"\n";
cout.width(48);
cout.fill('_');
cout<<"\n";
cout<<"|";
cout.width(15);
cout.fill(' ');
cout<<"Name";
cout<<" |";
cout.width(15);
cout<<"Address";
cout<<" |";
cout.width(10);
cout<<"Number";
cout<<" |";
cout<<"\n";
cout<<"|";
cout.width(46);
cout.fill('_');
cout<<"|";
cout<<"\n";
for(i=0;i<razm;i++)
{
if(!ifile.read((char*)&zapis, sizeof(Zapis)).eof())
break;
if(ch==zapis.nomer)
{
cout<<"|";
cout.width(15);
cout.fill(' ');
cout<<zapis.name;
cout<<" |";
cout.width(15);
cout<<zapis.adres;
cout<<" |";
cout.width(10);
cout<<zapis.nomer;
cout<<" |";
cout<<"\n";
cout<<"|";
cout.width(46);
cout.fill('_');
cout<<"|";
cout<<"\n";
cout<<"\n";
cout<<"Press any key for continuation\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
}
ifile.close();
}
return 0;
}
Отчего это может происходить?
А для того примера, что есть, на данный момент, у автора темы, для сортировки понадобится создать динамический массив или список структур, отсортировать его и потом, либо заново переписать в файл, либо менять функцию вывода, чтобы она получала в качестве аргумента массив или список структур, а не запрашивала бы имя файла базы данных.
Ты специально пишешь такой запутанный код и не используешь С++?
А сортировка то... пузырек рулит? :)
Почему бы не использовать стандартные контейнеры, методы сортировки, строковые классы? Почему бы не отвязать бизнес-логику от вывода на экран? Почему бы не разбить длинные методы на более короткие логически законченные функции?
ну тут он написал то что аффтар просил )
не важна скорость
или нужно было например естественным слиянием делать ) яро заявив что нас не волнует память но скорость прежде всего
Так библиотеку или хидер? Или и то, и то?
Что за "хидер"? 0_о
Библиотеки определённо нужна, так как её нет.
И ёщё нужна stdafx.h.
#include <dir.h> можно убрать, просто вместо MAXPATH нужно прописать, к примеру, 1024
Библиотеки определённо нужна, так как её нет.
И ёщё нужна stdafx.h.
Ёлы-палы! :mad:
dir.h - заголовочный (header) файл, а не библиотека. Слово header - читается как "хидер".
stdafx.h - хидер, используемый при прекопиляции в среде MS Visual C++. Для МАЛЕНЬКИХ проектов - нафиг не нужен (изменяется в настройках)!
не важна скорость
или нужно было например естественным слиянием делать ) яро заявив что нас не волнует память но скорость прежде всего
Ну так а почему бы не использовать стандартную?
Не пришлось бы велосипедов городить.
Ты специально пишешь такой запутанный код и не используешь С++?
А сортировка то... пузырек рулит? :)
Почему бы не использовать стандартные контейнеры, методы сортировки, строковые классы? Почему бы не отвязать бизнес-логику от вывода на экран? Почему бы не разбить длинные методы на более короткие логически законченные функции?
Пузырёк прикрутил на скорую руку, да и с ним автору темы проще было бы разобраться :)
ИМХО в теме для студентов контейнеры не уместны.
Отвязать бизнес-логику от вывода на экран не успел. Думал, посижу на выходных спокойно, "а тут бац, и вторая смена" (с) :D
Особо длинных методов вроде бы и не было :rolleyes: