Премини към съдържанието

Препоръчан отговор


Добър вечер, колеги. Стана 2 дена си блъскам главата, защо на този код, вместо да ми излиза да записвам във файла, ми чете от файла???

Annotation 2018-12-16 162759.jpg

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Дай и другите функции и направи кода годен за копиране.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

#include <iostream>
#include <fstream>  //хедърен файл за работа с файлове
#include <cstdlib>
#include <Windows.h>

using namespace std;

const int N = 20; //Максимален брой футболисти

struct player //структура играч с полета:

    char name[20]; // за първо име
    char lastName[20]; //за фамилия
    char country[20]; //за държава
    int number; //за номер на футболиста
    int goals; //за голове
};

//Прототипи на функциите
void Display(player pl);
void add_player(player group[], int &size);
void search_player_by_number(player group[], int size, int number);
void search_player_by_country(player group[], int size, char country[]);
void update_info(player group[], int size, char country[], char lastName[]);
int read(player group[]);
void write(player group[], int size);

void Display(player pl) //функция, която извежда информация за един играч
                        //и приема параметър променлива от тип player (стуктурата)
{
    SetConsoleTitle(TEXT("Извеждане на футболисти"));
    system("title Извеждане на футболисти"); //Текст в заглавната лента
    cout << "\n Име: " << pl.name << endl;
    cout << "Фамилия: " << pl.lastName << endl;
    cout << "Държава: " << pl.country << endl;
    cout << "Номер: " << pl.number << endl;
    cout << "Голове: " << pl.goals << endl;
}

void add_player(player group[], int &size)  //функция за добавяне на играчи (приема параметри - масив от стуктури
                                            //и размер на масива, който се предава по адрес
{
    SetConsoleTitle(TEXT("Добавяне на играчи"));
    system("Title Добавяне на играчи"); //Текст в заглавната лента
    int numberOfplayers; //текущ брой на играчите
    
    do {
        cout << "Колко играча искате да въведете ? :  ";
        cin >> numberOfplayers;
    } while (numberOfplayers < 0 || numberOfplayers > N); //цикъл за валидация на броя на играчите
    
    //int new_size = size + numberOfplayers; // новия размер на масива = на стария + нововъведения размер
    //if (new_size > N) // проверка, ако сме въвели размер по-голям от максималния
       // new_size = N; //ако да, то той става новия размер
        
    for (int i=size; i < size ; i++) //цикъл за добавяне на играчи
    {
        cin.ignore(); //изчиства входния буфер
        cout << "\nВъведи име на играча: ";
        cin.getline(group.name, 20); //въвеждаме име
        
        cout << "Въведи фамилия на играча: "; //въвеждаме фамилията на играча
        cin.getline(group.lastName, 20);
        
        cout << "Въведи страната на играча: "; //въвеждане държавата
        cin.getline(group.country, 20);
        
        do {
            cout << "Въведи номера на играча: ";
            cin.clear();
            cin >> group.number;
        } while (group.number < 0 || group.number > 99); //валидация за номера на сътветния футболит
                                                               //понеже той трябва да по-голям от 0 но по-малък от 99
        do {
            cin.clear();
            cout << "Въведете брой голове на играча: ";
            cin >> group.goals;
        } while (group.goals < 0 || group.goals > 50); //валидация за головете на съотвения футболист
    }
    
    //size = new_size; //размера на масива се обновява
    
    for (int i = 0; i < size; i++)
    Display(group); //викане на функцията за извеждане на информацията за играчите
    write(group, size); //виакне на функция, която записва във файл целия масив от играчи
}

void search_player_by_number(player group[], int size, int number) //функция, с която се търси футболист по номер
{
    SetConsoleTitle(TEXT("Търсене по номер на футболист"));
    system("Title Търсене по номер на футболист"); //Текст в заглавната лента
    int flag = 0; //флаг за истиност (ако търсения футболист е намерен)
    
    for (int i=0; i<size; i++) //обхождане на масива
        if(number == group.number) //ако има съвпадение
        {
            Display(group); //извежда се футболиста
            flag++; //флага се променя на 1 и става истина
        }
        
        if (!flag) //ако не е намерен такъв номер
        {
            cout << "\nИграчът не е намерен" << endl; //извежда се съобщение, че играча не е намерен
        }
}

void search_player_by_country(player group[], int size, char country[]) // функзия за търсена на футболист по държава
{
    SetConsoleTitle(TEXT("Търсене на футболист по държава"));
    system("Title Търсене на футболист по държава"); //Текст в заглаваната лента
    int flag = 0; //флаг за истинност (ако търсения футболист е намерен)
    
    for (int i = 0;i < size; i++)
       if  (!strcmp(group.country, country))
/*При търсена на съвпадение със С - String е използва функцията strcmp.
  При съвпадение на 2 C - String тя връща 0, т.е. лъжа и затова
  слагаме операцията ! пред нея - за да обърне 0 в 1 (лъжата в истина)
  и да се изпълни if условието.
*/
       {
               Display(group); //извежда се футболиста, ако е намерен
               flag++;
       }       
       
       if (!flag) //ако не е намерен играч с тази държава
       {
               cout << "\nИграчът не е намерен!" << endl; //извежда съобщение, че играчът не е намерен
       }
}

void update_info(player group[], int size, char country[], char lastName[]) //функция, с която ще актуализираме информацията спрямо головете
{
    SetConsoleTitle(TEXT("Актуализация на информацията за отбелязани голове"));
    system("Title Актуализация за информацията за отбелязани голове"); //текст в заглавната лента
    int goals, flag = 0; //флаг за истинност
    
    for (int i = 0; i < size; i++)
        if (!strcmp(group.country, country) && !strcmp(group.lastName, lastName)) //търсене на съвпадение по държава и фамилия
        {
            Display(group); //ако има съвпадение, извеждаме старата информация
            do
            {
                cout << "\n Въведете новите голове на играча: "; //въвеждаме новите голове на играча
                cin >> goals;
            } while (goals < 0 || goals > 50); //валидация
            
            group.goals = goals; //присвояване на съответния футболист новите голове
            flag++;
        }
    if (!flag) //ако не е намерен играч с такава държава и фамилия
      cout << "\n Играчът не е намерен!" <<endl; //извежда съобщения, че играчът не  намерен
    else //в противен случай
      write(group, size); // презаписва нанове целия масив от футболисти с новата информация за головете
}

int read (player group[]) //функция, която чете от файл
{
    SetConsoleTitle(TEXT("Четене на файла"));
    system("title Четене на файла"); //Текст в заглавната лента
    fstream myfile; //файлова променлива
    
    myfile.open("players.dat", ios::binary | ios::in); //отваряне на файл в двойчен режим на четене
    
    if (myfile.fail()) //ако файлът не може да се отвори
    {
        return 0; //връщаме лъжа
    }
    
    int size = 0; //променлива за размера на масива
    
    //размерът на масива ще бъде записан всеки път на първа позиция във файла
    
    if (!myfile.read(reinterpret_cast<char *>(&size), sizeof(size)))
/*reinterpret_cast <тип> - обект (Променя един тип във фундаментално различен тип.
 Използва се за преобразуване на напълно несъвместими указателни типове. Функцията
 взима колкото байта трябва да прочете от файла и ги списвоява по адрес. Ако броя на
 играчите не е на първа позиция - връща 0. */
       return 0;
    if(size > N); //ако размера е по-голям от максималния
       size = N; //то новия размер става максималния
       
    myfile.read((char *)group, sizeof(player)*size); //четене на масива от футболисти от файла
    myfile.close(); //затваряне на файла
    return size; //връща размера на масива от футболисти(броя на играчите)
}

void write(player group[], int size) //функция, която записва във файла
{
    SetConsoleTitle(TEXT("Записване във файла."));
    system("title Записване във файла"); //Текст в заглавната лента
    fstream myfile; //файлова променлива
    myfile.open("players.dat", ios::binary | ios::out); //отваряне на файла в двоичен режим на запис
    
    if (myfile.fail()) //ако файлът не може да се отвори
    {
        cout << "Въведеният файл не може да се отвори" << endl; //извежда се съобщение
        exit(1); //излизане от програмата
    }
    
    myfile.write(reinterpret_cast<char *>(&size), sizeof(size)); //запис на размера на масива във файла
    myfile.write((char *)group, size * sizeof(player)); //запис на масива във файла
    myfile.close(); //затваряне на файла
}

int main() 
{
    SetConsoleOutputCP(1251); //за текст на кирилица
    system("cls"); //изчистване на екрана
    system("title Програма, която реализира малка информационна система за футболисти от отбор."); //Текст в заглавната лента
    system("color 4F"); //задаване на цвят на фона и на шрифта
    
    //Описателен начален тескт за програмата
    char text[] = {
        "\n\t      Програма, която реализира малка информационна система "
        "\n\t              за футболисти от отбори.\n   "
        "\n\t      Тя предоставя меню с възможност да се добавят играчи, "
        "\n\t           да се търсят по футболен номер и по държава,"
        "\n\t      както и да се актуализира информацията спрямо головете.\n "
        "\n\t           Информацията за всеки един футболист се записва "
        "\n\t                   във файл с име players.dat \n  "
        "\n\t      Диалога с потребителя е реализиран на български език.  "
        };
        
        for (int c = 0; c < strlen(text); c++) //цикъл за анимация на текста
        {
            cout << text[c];
            Sleep(20);  //закъснение - 20 милисекунди
        }
        Sleep(1000);  //закъснение - 1 секунда
        system("cls"); //изчистване на екрана
        
        int choice, goals, number, size;
        char country[20], lastName[20];
        
        player group[N]; // масив от футболисти
        
        size = read(group); //най-напред четем размера на масива от файла, който е винаги на първа позиция
        
        do
        {
            system("title Медю"); //Текст в заглавната лента
            system("color 1F"); //цвят на фона и тескта
            cout << endl;
            cout << "Меню" << endl; //меню
            cout << "1.Добавяне на играч" << endl;
            cout << "2.Търсене на играч с номера му" << endl;
            cout << "3.Търсене на играч с държавата му" << endl;
            cout << "4.Обновяване на информацията относно головете на играчите" << endl;
            cout << "5.Покажи всички играчи" << endl;
            cout << "6.Край" << endl;
            
            cout << "\n Въведете Вашия избор: ";
            cin >> choice;
            
            switch (choice)
            {
                case 1: add_player(group, size); break; //викане на функцията за добавяне на играч
                case 2:
                    {
                        cout << "Въведете число: ";
                        cin >> number; //въвеждане на търсения номер
                        search_player_by_number(group, size, number); //викане на функцията за търсене на играч по номер
                    }
                break;
                case 3:
                {
                    char choice;
                    while (true) //безкраен цикъл
                    {
                        cout << "Въведете държава: ";
                        cin.ignore();
                        cin.getline(country, sizeof(country)); //въвеждане на търсената държава
                        search_player_by_country(group, size, country); //викане на функция за търсена по държава
                        
                        do
                        {
                            cout << "\n Искате ли да търсите отново? (Да/Не): "; //цикъл за повторно търсене
                            cin.clear();
                            cin >> choice; //въвеждане на избора
                        } while (choice !='Да' && choice !='да' && choice != 'Не' && choice != 'не'); //докато не се натиснат символите
                    if (choice == 'Не' || choice == 'не') //ако са вписани тези дуни
                    break; //цикълът спира
                    }
                }
                break;
                case 4:
                    {
                        cin.ignore();
                        cout << "Въведете държава: ";
                        cin.getline(country, sizeof(country)); // въвеждане на държавата
                        cout << "Въведете фамилия: ";
                        cin.getline(lastName, sizeof(lastName)); //въвеждане на фамилия
                        
                        update_info(group, size, country, lastName); //актуализация на информацията
                        
                    }
                    break;
                    
                case 5:
                    for (int i=0; i<size; i++)
                    Display(group);
                break;
                
                default:;
                break;
            }
            
        } while (choice != 6); //край на цикъла
        
        system("cls");
        system("color 15");
        cout << "\n Автор на програмата: Недю Кондев, спец. СИТ, група 3б, фак.номер 18621823";
        
        Sleep(3000); //закъснение - 3 секунти за прчитането на текста
    
    return 0;
}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване