Какая -то фигня. Ошибок при компиляции не выдает, но не работает. Я при записи создаю счетчик ch++ что бы знать количество записей сохраненных в файле. Для того, что бы построить цикл вывода всех записей на консоль.
for(int i=0;i>ch;i++)
Цель: создать функцию добавления сколько угодно записей в файл. И функцию просмотра всех записей. Как узнать сколько записей выводить на экран. Если в фале уже есть 2 записи и мы добавим еще 5. И задаюсь вопросом как устроить циклы для сортировки. и вообще с остальными циклами. Помогите разобраться.
struct rabotniki
{
char fio[20];
int number;
char pol[1];
int godrozhd;
int godpost;
}rab[9];
rabotniki temp;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
FILE * file;
rabotniki rab[9];
rabotniki temp;
int n, ch = 0;
file = fopen("file.bin", "wr");
cout << "Введите количество работников : ";
cin >> n;
for (int i = 0; i < n; i++)
{
cout << "Введите ФИО " << i + 1 << " рабочего : ";
gets_s(rab[i].fio);
cout << "Введите пол: ";
gets_s(rab[i].pol);
cout << "Год рождения : ";
cin >> rab[i].godrozhd;
cout << "Год поступления на работу : ";
cin >> rab[i].godpost;
ch++;
fwrite(&rab[i], sizeof(rab[i]), 1, file);
}
fclose(file);
file = fopen("file.bin", "rb");
cout << "Счетчик:" << ch;
for (int i = 0; i < ch; i++)
{
fread(&rab[i], sizeof(rab[i]), 1, file);
for (int i = 0; i < n; i++)
for (int j = 0; j < n - 1; j++)
if (rab[j].godrozhd < rab[j + 1].godrozhd)
{
temp = rab[j];
rab[j] = rab[j + 1];
rab[j + 1] = temp;
}
printf("-----------------------------------------------------------\n");
printf("| ФИО | Пол | Год рождения | Год поступления |\n");
printf("-----------------------------------------------------------\n");
}
for (int i = 0; i < ch; i++)
cout << rab[i].fio << "\t" << rab[i].pol << "\t" << rab[i].godrozhd << "\t" << rab[i].godpost << "\t" << "\n-----------------------------------------------------------" << endl;
cout << endl << endl;
fclose(file);
return 0;
}
И по моему я тут напортачил что-то с файлом. Исправьте, пожалуйста.
В курсовой работе я делал у себя так, и это работает у меня. Я думаю вы сможете под себя переделать, я оставил ссылку на курсач, может там что интересного для себя найдете. Делал в среде Code::Blocks 16.01, и кстати в проекте есть сортировка, поиск и фильтрация данных.
//Запись в файл
void RabotaAccount::wrt()
{
vector <person>::iterator iter1;
ofstream file;
file.open("GROUP.DAT", ios::trunc);
int n = 0;
iter1 = persVector.begin();
while(iter1 != persVector.end())
{
cout << (*iter1);
file.write( reinterpret_cast<char*>(&(*iter1)), sizeof((*iter1)) );
*iter1++;
n++;
}
cout << n <<endl;
persVector.clear();
file.close();
}
И вывод данных
//вывод данных в память
void RabotaAccount::readPolz()
{
person pers;
fstream file;
persVector.clear();
file.open("GROUP.DAT", ios::app | ios::out |
ios::in);
file.seekg(0); //reset to start of file
//read first person
file.read( reinterpret_cast<char*>(&pers), sizeof(pers) );
while( !file.eof() ) //quit on EOF
{
//display person
persVector.push_back(pers);
//read another person
file.read( reinterpret_cast<char*>(&pers), sizeof(pers) );
}
file.close();
}
Курсач, логин: admin, пароль: 123
Пример сортировки у меня, через вектор
void Taksopark::sortAvto()
{
vector <AvtoTaksopark>::iterator iter1;
readPolz();
char ch;
char c;
do
{
do
{
system("cls");
cout << "-------------Сортировка по названию-------------\n";
cout << "Выберите вид сортировки (>/<): ";
cin >> ch;
if(ch == '>')
{
sort(avtoVector.begin(), avtoVector.end(), SortNazvanie());
}
else if (ch == '<')
{
sort(avtoVector.begin(), avtoVector.end(), SortNazvanie2());
}
else
{
cout << "Не правильный ввод";
break;
}
iter1 = avtoVector.begin();
while(iter1 != avtoVector.end())
{(*iter1++).getAvtoStoimost();
cout << "\n\n";
}
}
while(ch == '>' && ch == '<');
char a;
cout << "Записать в файл? (y/n): ";
cin >> a;
if(a == 'y')
{
cout << "Данные файла перезаписаны\n";
write();
}
cout << "Для прололжения нажмите (y/n): ";
cin >> c;
}
while(c == 'y');
}
и классы предикаты для этого
class SortNazvanie
{
public:
bool operator()(AvtoTaksopark &avto1, AvtoTaksopark &avto2) const
{
return (strcmp(avto1.getAvtoBase().getAvto(),avto2.getAvtoBase().getAvto()) == 1) ? true : false;
}
};
class SortNazvanie2
{
public:
bool operator()(AvtoTaksopark &avto1, AvtoTaksopark &avto2) const
{
return (strcmp(avto1.getAvtoBase().getAvto(),avto2.getAvtoBase().getAvto()) == -1) ? true : false;
}
};
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости