ofstream write("results/users.dat", ios_base::binary | ios_base::out);
if(write == NULL)
{
cout << "Файл недоступен для записи!" << endl;
}
else
{
do
{
cout << "Введите ID пользователя (от 1 до 100, 0 для выхода): ";
cin >> uz.userID;
} while(uz.userID < 0 or uz.userID > 100);
while(uz.userID != 0)
{
cout << "Введите имя пользователя и количество комментариев: \n";
cin >> uz.nickname >> uz.comments;
write.seekp((uz.userID-1) * sizeof uz, ios_base::beg);
write.write((char*)&uz, sizeof uz);
cout << "Введите ID пользователя (от 1 до 100, 0 для выхода): ";
cin >> uz.userID;
}
cout << "Завершение программы." << endl;
write.close();
Проблемы начинаются с момента открытия потока на запись. На первом этапе работы создаётся файл, в который записывается структура. Вторым этапом должна быть запись данных в файл. Так вот, при создании файла всё записывается как надо - 100 строк, забитых нулями. Далее поток закрывается и при получении от пользователя подтверждения на запись данных открывается новый поток ввода, и тут файлу приходит кабздец, в нём остаётся одна строка, плюс к этому последние введённые данные записываются дважды. В принципе, пока писал - понял, как обойти проблему (первый поток записи не закрывается, работа продолжается с ним же), но вопрос остался: как при открытии файла на запись не пролюбить все данные в нём? Вариант с ios::app проблему решает только частично, так как писать нужно в произвольную часть файла.
Хм, да, без параметров открытия работает, но если указывать параметры ios_base::out | ios_base::binary - то опять всё ломается. Хвост файла отсекается, последняя запись дублируется.
Будто что-то плохое ;) Скажи уж тогда, как можно дёрнуть stat из крестов кроме как через system(). Всё что гуглится - именно в таких формах, причём второй вариант не нравится тем, что надо дописывать перенаправление вывода в /dev/null
а потом говорят <...> кресты не нужны.
Ты всё перепутал, Эдик выше отметился ;)
Один лишний символ — и стек идёт по известному месту. Ох уж эти оптимизаторы.
Хрень в том, что при запросе на создание файла иначе не получается, диалог уходит в цикл. В strace:
Будто что-то плохое ;) Скажи уж тогда, как можно дёрнуть stat из крестов кроме как через system(). Всё что гуглится - именно в таких формах, причём второй вариант не нравится тем, что надо дописывать перенаправление вывода в /dev/null
Скоро (в C++17) будет std::filesystem, и stat можно будет оставить сишникам. А пока можно взять boost::filesystem.