Как работает sync?

187
14 июля 2018, 07:40

Не могу понять как он работает. Есть пример:

#include <iostream>
#include <fstream>
void file_abc()
{
    std::ofstream f("test.txt");
    f << "abc\n";
}
void file_123()
{
    std::ofstream f("test.txt");
    f << "123\n";
}
int main()
{
    file_abc(); // file now contains "abc"
    std::ifstream f("test.txt");
    std::cout << "Reading from the file\n";
    char c;
    f >> c; std::cout << c;
    file_123(); // file now contains "123"
    f >> c; std::cout << c;
    f >> c; std::cout << c << '\n';
    f.close();
    file_abc(); // file now contains "abc"
    f.open("test.txt");
    std::cout << "Reading from the file, with sync()\n";
    f >> c; std::cout << c;
    file_123(); // file now contains "123"
    std::cout << f.sync() << std::endl;
    f >> c; std::cout << c;
    f >> c; std::cout << c << '\n';
}

и вывод должен быть вроде как :

Reading from the file
abc
Reading from the file, with sync()
a23

Но у меня получается

Reading from the file
abc
Reading from the file
abc

При этом f.sync() выдает 0. Как все таки это работает?

Answer 1

В вашем примере параллельного чтения и записи в один файл функция sync не спасёт, так как операционка не будет блокировать и синхронизировать бесконечный поток открытия файлов. После открытия файла на чтение все клиенты будут читать одно и то-же из буфера. При изменении файла следующие клиенты будут читать файл из буфера второго и тоже удивляться, что бабка Рая говорила другое. Результат чтения исходников и переводов. Функция sync обновляет буфер чтения до упора памяти. Если буфер заполнен полностью и ничего не добавилось всё остаётся точно так-же. Если файл изменился, то заново буфер обновлятся не будет. Если у вас было желание обновить содержимое буфера, то этот буфер нужно обнулить. Это можно достичь с помощью f.seekg(f.tellg());. Более красивого способа не нашёл.

READ ALSO
Потомок от std::set с лямбда функцией сравнения

Потомок от std::set с лямбда функцией сравнения

Подскажите где прописать код лямбда функции сравнения, например, такой:

198
Трёхмерный массив с пропусками (C++, map)

Трёхмерный массив с пропусками (C++, map)

У меня есть трёхмерный массив с вот таким объявлением:

240
Конструкторы классов

Конструкторы классов

Дословно вопрос звучит так "Define the constructor for class Z"Помогите разобраться что именно надо реализовать? Ну тип конструктор у класса Z уже есть, чего...

152
Интерфейсы и их реализация

Интерфейсы и их реализация

Не могу никак разобраться с интерфейсами и их реализациейОбьясните пожалуйста как их правильно реализовывать и как это хотя-бы примерно...

191