У меня есть программа на C ++, которая создает выходной файл "A" с ofstream.Этот файл затем читается неким устаревшим кодом C, который открывает файл с помощью _iobuf.Затем унаследованный код создает свой собственный выходной файл «B» с помощью _iobuf, и этот файл затем читается программой C ++ с использованием ifstream.Эта последовательность повторяется много раз, с одинаковыми именами файлов для A и B. В каждой итерации.
Иногда программа C ++ не может открыть выходной файл A для записи, и я должен попытаться несколько раз, прежде чем это удастся.Это происходит недетерминированно, и может быть один раз в тысячу итераций.Обратите внимание, что программе на C никогда не нужно ждать, чтобы открыть свой входной или выходной файл, и программе C ++ никогда не приходится ждать, чтобы открыть свой входной файл.Это неформальное наблюдение основано на сотнях тысяч итераций.
Интересно, это как-то связано со смешиванием потоков и _iobuf в одной программе?И код C ++, и код C связаны в одной программе.А унаследованный код C технически является кодом C ++, но был написан в очень C-подобном стиле.Что я могу сделать, чтобы устранить это ожидание, чтобы открыть файл ofstream?Я не хочу менять унаследованный код, если могу избежать его.
Псевдокод (не скомпилирован):
void someObject::someMethod()
{
for (int count = 0; count < someLimit; ++count)
{
newerObject::firstMethod();
olderObject::secondMethod();
newerObject::thirdMethod();
}
}
void newerObject::firstMethod()
{
// do some processing first
// then write the results of the processing to a file
ofstream A;
A.open("A", ofstream::out); // this sometimes must be tried multiple times
// write data to file A
A.close();
}
void olderObject::secondMethod()
{
FILE* f;
f = fopen("A", "rt"); // this always works the first time
// read data from file A
fclose(f);
// do some processing
f = fopen("B", "w");
// write data to file B
fclose(f);
}
void newerObject::thirdMethod()
{
ifstream B;
B.open("B"); // this always works the first time
// read data from file B
B.close();
// do some processing
}
В настоящее время, как обходной путь, я поставил ofstream:: открыть в цикле do-while.Я хотел бы избавиться от этой неловкости.Заранее благодарим за любой совет, который вы можете дать.