花了很长时间关闭fstream

时间:2013-06-05 00:54:56

标签: c++ fstream

为什么我的fstream在将数据写入文件后需要30秒以上才能关闭?我写的越多,关闭所需的时间就越长。

fstream *writeReadStream = new fstream("/media/username/KODAK/file.bin", fstream::in | fstream::out | fstream::binary);
writeReadStream->seekg(0x100000);
char randomData[0x100000];

for (int i = 0; i < 0x270; i++)
    writeReadStream->write(randomData, 0x100000);

writeReadStream->close();
delete writeReadStream;

调试时,我看到应用程序挂起close电话。即使在printf来电之前和之后未调试并呼叫close,也需要很长时间才能达到第二个printf。再一次,我写的越多,花费的时间越长。知道为什么吗?

这似乎只发生在闪存驱动器/ SD卡上。

3 个答案:

答案 0 :(得分:0)

写入可能是缓冲的。关闭导致它刷新,因此您必须先等待它写入​​磁盘。尝试在for循环中放入一个刷新,然后查看关闭是否需要很长时间。

fstream *writeReadStream = new fstream("/home/username/Desktop/file.bin", fstream::in | fstream::out | fstream::binary);
writeReadStream->seekg(0x100000);
char randomData[0x100000];

for (int i = 0; i < 0x270; i++)
{
    writeReadStream->write(randomData, 0x100000);
    writeReadStream->flush();
}

writeReadStream->close();
delete writeReadStream;

答案 1 :(得分:0)

您正在撰写大量数据。您的问题可能是由于缓冲。如果我是你,我会尝试无缓冲的C api:

FILE *fd = std::fopen("/home/username/Desktop/file.bin", "w");
if (!fd) {
   // handle error
}
std::setvbuf(fd, NULL, _IONBF, 0);

if (0 != std::fseek(fd, 0x100000, SEEK_SET)) {
    // handle error
}
for (int i = 0; i < 0x270; i++) {
    if (1 != std::fwrite(randomData, 0x100000, 1, fd)) {
         // handle error
    }
}

close(fd);

看看它是否更快

答案 2 :(得分:0)

我遇到了同样的问题,发现在每次循环迭代中打开 - 追加/写/关闭文件比在循环之后打开一次和关闭一次更快。不知何故,每个关闭执行我们期望的刷新,但flush()不会。