流的延迟::打开,可能是由于与_iobuf混合? 我有一个C++程序,它创建一个带有流的输出文件A。然后,该文件由一些遗留C代码读取,该代码使用_iobuf打开该文件。然后,遗留代码使用IIOBUF创建自己的输出文件B,然后使用IFFILE通过C++程序读取该文件。该序列被迭代多次,每次迭代中A和B的文件名相同 有时候,C++程序不能打开输出文件A来写,而且我必须在它成功之前再试几次。这是不确定的,可能是千次迭代中的一次。注意,C程序永远不必等待打开它的输入或输出文件,C++程序也不必等待打开它的输入文件。这种非正式的观察是基于几十万次迭代

流的延迟::打开,可能是由于与_iobuf混合? 我有一个C++程序,它创建一个带有流的输出文件A。然后,该文件由一些遗留C代码读取,该代码使用_iobuf打开该文件。然后,遗留代码使用IIOBUF创建自己的输出文件B,然后使用IFFILE通过C++程序读取该文件。该序列被迭代多次,每次迭代中A和B的文件名相同 有时候,C++程序不能打开输出文件A来写,而且我必须在它成功之前再试几次。这是不确定的,可能是千次迭代中的一次。注意,C程序永远不必等待打开它的输入或输出文件,C++程序也不必等待打开它的输入文件。这种非正式的观察是基于几十万次迭代,c++,file-io,C++,File Io,我想知道这是否和在同一个程序中混合流和iobuf有关?C++代码和C代码都被链接到同一程序中。传统的C代码是技术上的C++代码,但是编写的代码非常类似于C。我能做些什么来消除等待打开ofstream文件的这种情况吗?如果可以避免的话,我不想更改遗留代码 未编译的伪代码: void someObject::someMethod() { for (int count = 0; count < someLimit; ++count) { newerObject::

我想知道这是否和在同一个程序中混合流和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::open放在do-while循环中。我很想摆脱这种尴尬。首先,谢谢您提供的任何建议。

首先,问题几乎肯定不是使用不同的方法访问文件:在引擎盖下,C和C++ I/O函数使用相同的系统I/O设备。您似乎在其他系统上使用Windows文件通常可以同时打开多次,我对该系统了解不多,但我怀疑该文件系统尚未更新,以反映您尝试打开文件时该文件已关闭。这可能与t open标志有关:我不知道这是怎么回事

在Unix上,您可以强制I/O操作等待磁盘上的实际更改完成。像这样的事情可能有助于避免问题,但也会带来巨大的成本,使操作变得异常缓慢。在Unix上,一种方法是在文件成功打开时将文件系统条目吹走,毕竟,此时不再使用文件名:

if (FILE* fp = fopen("file", "r")) {
    remove("file");
    // do processing
}
但是,如果我在Windows上回忆正确,您既不能删除该文件,也不能重命名它。就我个人而言,在解决问题时,我将采取以下行动:

确定在哪些情况下无法打开文件,例如保持文件打开并尝试打开。这主要是为了创建一个可以重现问题的设置,以便您可以在以后验证是否确实找到了解决方案。 一旦我找到了重现问题的方法,我可能会更好地了解实际的根本原因,谷歌搜索可能会有所帮助。无论如何,这是研究根本原因的关键所在。 一旦了解了原因,就很容易想出解决办法。如果没有,那么在它下面多次打开文件是成功的,很可能是正确的解决方案。
去掉c标记后,这个问题与c无关。只是要明确一点:问题前面的fclose是在只读取文件A之后,而不是在写入文件之后。我不认为有任何延迟由于缓冲。是的,这是在Windows下运行。用微软Visual C++ 2010编写的Express。我试图创建一个可复制的测试用例,但从程序的角度来看,它仍然是不确定的。