У меня есть программа, которая загружает данные из файла с использованием 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();
}
Спасибо.
Редактировать: Конечно, это была ошибка, потому что у меня было два раза один и тот же файл в двухочень похожий путь.Глядя на дескриптор файла, открытого с помощью проводника процессов (а не относительный путь к файлу, который заставил меня его найти).