1

Тема: трабл з редагуванням файлів fstream

Предісторія:

Мене вже забембало шукати чергового в групі (я заступник, а староста мразь) і я вирішив написати прогу для того аби знаходити чергового системою поїнтів(почергував - +поїнт, шукає чергового з найменшою к-стю поінтів).

Проблема:

Цю фунцію я викликаю коли студент почергував і вона повинна в файлі добавити йому поінт. Але якогось нечистого вона цього не робить.

void AddPoints(int position)
{
    char students[20];
    int points, pos=1;
    fstream file;
    file.open("students.dat", ios::in | ios::out | ios::ate);
    if (file.is_open())
    {
        file.seekp(0, ios::beg);
        while (file >> students >> points)
        {
            if (pos == position)
            {
                cout << students <<' ' <<points;//прізвище початкове_значення виводить в консоль правильно
                points++;
                file << students << ' ' << points;
                cout << students << ' ' << points;//прізвище початкове_значення++ тут також виводить правильно
            }                                                     
            pos++;                                          
        }
    }
    else
    {
        
        cout << "u gay" << endl;
        system("pause");
    }
    file.close();
}

але коли я дивлюся в файл або виводжу в консоль список то черговий з попередньою к-стю поінтів

P.S. так, я знаю вказівник стоїть після чергового, але воно навіть наступного не змінює

P.S.S. не кидайтесь тапочками за говно-код

Подякували: Fox1

2 Востаннє редагувалося koala (17.06.2018 19:16:56)

Re: трабл з редагуванням файлів fstream

Концепція файлових потоків бере початок з магнітних стрічок. Бачили такі? Бобіна обертається, стрічка тягнеться, на неї поступово пишеться інформація (чи читається) магнітною голівкою.
Ну так от, тут імітується те саме: ви відкриваєте файл (ставите бобіну), переходите на початок (відмотуєте її), читаєте по одному запису і, подекуди, пишете новий запис. Бачите вже, в чому проблема? По-перше, ви не відмотуєте на початок запису, а перезаписуєте наступний. По-друге, ніхто не гарантує, що записи у вас однакової довжини (стрічки char[] пишуться до символа '\0', числа в текстовому форматі займають стільки байт, скільки там цифр), і запис не накладеться на інший.
Що робити? Або зробити всі записи в файлі гарантовано однакової довжини і перед записом відмотувати на його початок; або читати весь файл у структуру в пам'яті, там її редагувати і записувати повністю назад. Раджу для невеликих файлів другий спосіб - менше мороки.

Подякували: dwanford, leofun012