Принудительное чтение на диске с std :: ifstream вместо файлового кэша - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть программа, которая загружает данные из файла с использованием std :: ifstream и сохраняет данные в структуре.После этого я проверяю, были ли нужные мне данные в файле.Если это не так, я прошу пользователя изменить файл и нажать клавишу.Затем я перезагружаю файл.Проблема в том, что даже если пользователь изменил файл, я всегда получаю одни и те же данные в файле, потому что файл, похоже, кешируется в приложении.Я видел, что в Win32 API можно использовать флаг FILE_FLAG_NO_BUFFERING, чтобы избежать использования буферизованной копии при чтении файла, но я хотел бы использовать эту функцию с std :: ifstream.Есть ли способ использовать дескриптор, созданный через Win32 API с ifstream или в любом случае, чтобы заставить его напрямую в std :: ifstream?

Вот «упрощенный» пример кода:

SomeStructure  s = LoadData(fileName);
while(!DataValid(s))
    s = LoadData(fileName);


SomeStructure LoadData(const std::string& fileName)
{
    std::ifstream fileStream;
    while(!OpenFileRead(fileName, fileStream))
    {
        std::cout<<"File not found, please update it";
        fileStream.close();
        //Wait for use input
        std::string dummy;
        std::getline(std::cin, dummy);
    }
    //... Read file, fill structure, and return
    std::string line;   
    while(std::getline(fileStream, line) && line!="")
    {
        //At this point, I can see that line is wrong
        StringArray namedatearray=Utils::String::Split(line, "|");
        assert(namedatearray.size()==2);
        //Add data to my structure ( a map)
     }
     fileStream.close();
     //return structure
}

bool OpenFileRead(const std::string& name, std::fstream& file)
{    
    file.open(name.c_str(), std::ios::in);
    return !file.fail();
}

Спасибо.

Редактировать: Конечно, это была ошибка, потому что у меня было два раза один и тот же файл в двухочень похожий путь.Глядя на дескриптор файла, открытого с помощью проводника процессов (а не относительный путь к файлу, который заставил меня его найти).

1 Ответ

2 голосов
/ 01 ноября 2011

Вместо того, чтобы думать, что это связано с какой-то «буферизацией», я бы сначала поискал очевидные вещи.

  • Вы уверены, что пользователь изменяет тот же файл, который вы читаете?
  • Вы уверены, что перезагрузка данных корректно обновляет вашу структуру данных в памяти?
  • Вы уверены, что DataValid() делает то, что вы хотите?

Тот факт, что ОС использует файловые буферы для увеличения производительности диска, обычно не виден на уровне приложений. Пока вы смотрите на тот же файл, ОС знает, что пользователь обновил файл, и если вы откроете его снова, вы увидите измененные данные. Если у данных даже не было шанса быть записанными на диск, это не повлияет на ваше приложение.

...