- 主题:怎样快速刷新文件内容
有一个实时的json数据(1k字符以内), 会不断刷新. 要保存最后一次刷新的数据到文件里.
刷新频率, 不快也不慢吧, 0.1s一次.
觉得重复打开关闭文件会浪费资源(系统不忙的时候看速度其实也很快),所以不想每次刷新都打开关闭文件.
bool WriteLatestJsonToFile(const Json::Value &jsonValue, const std::string& strFileName)
{
static std::ofstream ofs(strFileName);
if (! ofs.is_open()) {
return false;
}
ofs.seekp(0, std::ios_base::beg);
ofs << jsonValue.toStyledString();
ofs.flush();
return true;
}
发现会导致文件内容有一些错误, json 的格式有时候会坏掉, 文件内容最后有时候会多出一个或者几个右花括号.
然后怀疑每次json内容长度会有区别, 是不是后面写的内容没有原来的长,尾巴就留下了, 网上胡乱搜,想着是不是可以把文件流的内容清空,再写
bool WriteLatestJsonToFile(const Json::Value &jsonValue, const std::string& strFileName)
{
static std::ofstream ofs(strFileName);
static char buff[1024] = {0};
static bool first_call = true;
if (! ofs.is_open()) {
return false;
}
if (first_call) {
first_call = false;
ofs.rdbuf()->pubsetbuf(buff, 1024);
}
memset(buff, 0, 1024);
ofs.seekp(0, std::ios_base::beg);
ofs << jsonValue.toStyledString();
ofs.flush();
return true;
}
还是一样的毛病...
这个需求应该怎么做的?
--
FROM 113.98.204.*
static有线程同步问题吧,如果多线程访问
文件不需要这么频繁刷新,xx秒刷一次就行了吧
如果是因为别的东西要实时读取这个被写入的文件,所以才这么频繁写入,那最好换一种交换数据的方式
--
FROM 221.218.160.*
linux 下 有 inotify 可以监控一个文件有没有被修改。
win 下也有类似的 API
【 在 confinement 的大作中提到: 】
: 有一个实时的json数据(1k字符以内), 会不断刷新. 要保存最后一次刷新的数据到文件里.
: 刷新频率, 不快也不慢吧, 0.1s一次.
: 觉得重复打开关闭文件会浪费资源(系统不忙的时候看速度其实也很快),所以不想每次刷新都打开关闭文件.
: ...................
--
FROM 124.126.138.*
我就是想记录一个实时数据的最后一包数据, 程序可能会因为一些事情终止, 想知道最后的某个状态数据就可以了
【 在 dormouseBHU 的大作中提到: 】
: linux 下 有 inotify 可以监控一个文件有没有被修改。
: win 下也有类似的 API
:
--
FROM 113.98.204.*
说得也是, 还是想办法缓存起来最后再写比较好
【 在 z16166 的大作中提到: 】
: static有线程同步问题吧,如果多线程访问
: 文件不需要这么频繁刷新,xx秒刷一次就行了吧
: 如果是因为别的东西要实时读取这个被写入的文件,所以才这么频繁写入,那最好换一种交换数据的方式
--
FROM 113.98.204.*
但是假使就要按原来的需求去做,要怎样实现比较好,前面的代码为什么不行,我还是没搞懂~
【 在 z16166 的大作中提到: 】
: static有线程同步问题吧,如果多线程访问
: 文件不需要这么频繁刷新,xx秒刷一次就行了吧
: 如果是因为别的东西要实时读取这个被写入的文件,所以才这么频繁写入,那最好换一种交换数据的方式
--
FROM 113.98.204.*
每次写入之前要显式截断/清空原来的文件
【 在 confinement 的大作中提到: 】
: 但是假使就要按原来的需求去做,要怎样实现比较好,前面的代码为什么不行,我还是没搞懂~
:
--
修改:z16166 FROM 221.218.160.*
FROM 221.218.160.*
【 在 z16166 的大作中提到: 】
: 每次写入之前要显式截断/清空原来的文件
:
c++的文件流好没有提供相应的函数,只能重新打开关闭么? 网上没搜出来,只搜到一些C的,比如 ftrucate, trucate 这些,这种感觉还不如直接重新打开/关闭文件了
--
FROM 113.98.204.*
oftsream没这种机制,OS API可能有,类似Windows的SetEndOfFile()/SetFileValidData()之类的,但是特定于OS了。
【 在 confinement 的大作中提到: 】
:
: c++的文件流好没有提供相应的函数,只能重新打开关闭么? 网上没搜出来,只搜到一些C的,比如 ftrucate, trucate 这些,这种感觉还不如直接重新打开/关闭文件了
--
FROM 221.218.160.*
我怀疑利用文件流里面那一堆东西可以做到不用重新打开,但是我要干相关业务的活,我的主力工作也不算是软件,所以懒得自己研究就想问一下捡个便宜就算了
【 在 z16166 的大作中提到: 】
: oftsream没这种机制,OS API可能有,类似Windows的SetEndOfFile()/SetFileValidData()之类的,但是特定于OS了。
:
--
FROM 113.98.204.*