- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个程序,其中一个线程写入文件,其他线程读取(同步)。但是写入值和读取值有时并不相等。实际上 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/
我遇到一些 fwrite 问题,它以我不明白的方式失败。 在这段代码中,fwrite 都失败并给出 tmp = 0。 if ((file = fopen(filenameout, "wb")) !
好吧,事情是这样的……我记得上周创建了一个程序,要求我以二进制模式打开一个文件并向其中写入数据。首先,我尝试使用fopen函数,检查结果是否正确,然后尝试写入数据。我记得第一次尝试时,fwrite 操
早上好, 我正在尝试将以下结构的内容写入文件(更具体地说是 BMP 文件),并且想知道为什么 fwrite 的二进制输出ing 整个结构和 fwrite结构体的各个项目是不同的。这就是C的工作方式吗?
我在某个地方遇到了这个。 正在写入一个文件,然后rewind(fileptr) 完成,然后写入应该写入文件开头的内容。但是写在开头,不会覆盖文件的内容吗?请指教。 最佳答案 技术上,是 是的,文件将被
fwrite 一个整数取决于字节序,但是有没有一种方法可以将一个整数 0x00000004 写入一个文件,这样无论它运行在什么机器上,它都可以始终被读取为 0x00000004。 一个想法是始终按照特
我在 php 中编写一个函数,在客户端我有一个 Canvas 图像,我使用 toDataUrl() 和一个文件名将图像保存在服务器上。这是代码: 关键是这段代码有效。对于我在其上使用的三分之二的页面
当我运行这个小代码并在控制台上输入 3 个整数时,由于 fwrite 语句,它没有按应有的方式打印出来。只有在我连续按回车键一段时间后,它才会打印出来。帮助?P.S:学习速度比 scanf 和 pri
我的网站在 /var/www/html/hs/ ,我有我的更新.php .它应该写到/var/www/html/hs/json/myFile.json ,但事实并非如此。当我尝试写入 的同一目录时更新
这个函数应该获取一个参数作为文件的指针并将所有文件放入struct anagram ,然后将其写入另一个文件。现在每个数据之间都有很大的空间。 charCompare 工作正常,因为我制作了一个测试文
这是在我的网站上上传带有“var$”内容的“file.txt”的 URL: http://www.mywebsite.com/fwrite.php?stringData=var$&myFile=fil
如果字符串包含 ~,我似乎无法将其打印到标准输出。 > A = "/.git". > io:fwrite(A). /.gitok > B = "~/.git". > io:fwrite(B). **
我发现当我尝试写入一些大数据时 fwrite 失败,如下面的代码所示。 #include #include int main(int argc, char* argv[]) { int s
我正在写这个: $fh = fopen('public/newsletter.txt', 'w'); foreach($entries as $row) { fwrite($fh,
我又来了,这次有一个 PHP 问题...我正忙于制作某种管理面板(非常基本),但是当我试图像我的 slider 或其他东西一样进行更改时,fwrite 会覆盖所有内容。这是我的 PHP 代码: 0)
根据fwrite的手册页: fread() and fwrite() return the number of items successfully read or written (i.e., no
我只是想对一组数字进行排序(虽然我发布的代码不是我要使用的方法,但我确实需要将代码中的输出写入二进制文件). 一切正常,除了“ordenar”的最后一次迭代:当我在订购后再次打印回数字时,除了最后一行
我想使用 data.table::fwrite 以文本日志的形式快速存储和检索状态。这些是通过移动应用程序更新的,该应用程序使用管道工 API 调用到 R 端点。移动应用程序每秒可能会触发许多 API
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我正在尝试使用“fwrite”并制作 snd 文件。我想做 IIR 滤波器。我制作了一个 FIR 滤波器,并使用 IIR 滤波器的代码。(当然,改变系数)但我认为“fwrite”不起作用。因为IIR滤
我正在尝试将 wchar 数组写入 C 中的文件,但是存在某种损坏和不相关的数据,例如这样的变量和路径 c.:.\.p.r.o.g.r.a.m. .f.i.l.e.s.\.m.i.c.r.o.s.o.
我是一名优秀的程序员,十分优秀!