gpt4 book ai didi

c++ - fwrite 后如何确定数据在磁盘上?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:24 25 4
gpt4 key购买 nike

我有一个程序,其中一个线程写入文件,其他线程读取(同步)。但是写入值和读取值有时并不相等。实际上 reader 读取了正确数量的元素,但值不同。这可能是没有将数据推送到磁盘的问题吗?虽然我写完了就​​调用了fflush,但是我怎么确定是写的,所以我可以拒绝这个版本。操作系统 - 窗口。

FixedSizeQueue::FixedSizeQueue(const std::string& filename, size_t size)
: size_(size)
, head_(0)
, tail_(0)
{
fopen_s(&file_, filename.c_str(), "w+");
InitializeCriticalSection(&critical_section_);
}

void
FixedSizeQueue::push_values(int* values, size_t count)
{
Logger::report("Called push_values");
EnterCriticalSection(&critical_section_);
size_t free_items = (tail_ > head_) ? size_ - tail_ + head_ : size_ - head_ + tail_;
if (count > free_items)
{
Logger::report("Buffer is full, can't push new values.");
exit(1);
}

size_t till_end = (tail_ >= head_) ? size_ - tail_ : head_ - tail_;

if (count < till_end)
{
fseek(file_, tail_ * sizeof(int), SEEK_SET);
int g = fwrite(values, sizeof(int), count, file_);
assert(g == count);

tail_ += count;
}
else
{
fseek(file_, tail_ * sizeof(int), SEEK_SET);
int h = fwrite(values, sizeof(int), till_end, file_);
assert(h == till_end);
fseek(file_, tail_ * sizeof(int), SEEK_SET);
h = fwrite(values + count, sizeof(int), count - till_end, file_);
assert(h == count - till_end);

tail_ = count - till_end;
}
fflush(file_);
LeaveCriticalSection(&critical_section_);
}

size_t
FixedSizeQueue::get_values(int* values)
{
Logger::report("Called get_values");
EnterCriticalSection(&critical_section_);
const size_t item_count = (tail_ >= head_) ? tail_ - head_ : size_ - head_ + tail_;
if (tail_ > head_)
{
fseek(file_, head_ * sizeof(int), SEEK_SET);
fread(values, sizeof(int), item_count, file_);
}
else
{
fseek(file_, (size_ - head_) * sizeof(int), SEEK_SET);
fread(values, sizeof(int), size_ - head_, file_);
fseek(file_, 0, SEEK_SET);
fread(values + size_ - head_, sizeof(int), tail_, file_);
}

head_ = tail_ = 0;

LeaveCriticalSection(&critical_section_);

return item_count;
}

谢谢。

最佳答案

这篇存档的知识库文章帮助我们解决了这个问题:https://jeffpar.github.io/kbarchive/kb/066/Q66052/

当我们最初使用 fopen_s 打开我们的文件时,我们包含了“c”模式选项作为最后一个选项:

fopen_s( path, "wc") // w - write mode, c - allow immediate commit to disk

参见 https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-s-wfopen-s?view=vs-2019

然后,因为它是 Windows,当你想强制刷新到磁盘时,调用

_flushall()

我们在打电话之前打了这个电话

fclose()

我们遇到了您所描述的确切问题,并且这种方法解决了它。

来自上面的知识库文章:

“Microsoft C/C++ 7.0 版为 fopen() 引入了“c”模式选项功能。当应用程序打开文件并指定“c”模式时,运行时库将文件缓冲区的内容写入磁盘应用程序调用 fflush() 或 _flushall() 函数。 "

关于c++ - fwrite 后如何确定数据在磁盘上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33793535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com