嵌入式技术论坛
直播中

chunhuahua

9年用户 1422经验值
擅长:接口/总线/驱动
私信 关注
[问答]

fprintf无法输出定位到指定文件有什么问题吗

移植 一个开源软件 现在有个问题,开源软件的日志 用了 fprintf 输出到指定文件中, 我试了以下

stream = fopen("/mnt/snmpd.conf", "a+");
fprintf(stream,"%s","www.dotcpp.com");

操作 无法, 发现无法把内容定位到指定的 文件中, fprintf对低层硬件接口有什么依赖嘛。还是我用法不对

回帖(11)

刘燕

2022-10-13 10:05:21
用法看着没问题,用的什么文件系统
举报

chunhuahua

2022-10-13 10:05:35
elmfat 文件系统, 现在试了下用fflush(stream)是无法把数据缓冲到文件的,但是用fclose是可以把数据缓冲到文件的
举报

刘燕

2022-10-13 10:05:50
由于缓存的原因,内容未写入文件。
1 在 fopen 之后,加句:setbuf(stream, NULL);
2 fprintf 后面加上 fflush(stream);
举报

chunhuahua

2022-10-13 10:06:01
在fprintf 后面我已经加了 fflush(stream),发现没啥效果,但是在fprintf后面加fclose是可以把缓冲中的数据写到文件中去的,我现在是怀疑 rt-thread 平台下 fflush这个函数是不是有问题, fflush是一个标准的C库函数, rt-thread是不是支持不太好了
举报

刘燕

2022-10-13 10:06:22
在 fopen 之后,加句:setbuf(stream, NULL);
这样试过了吗?
举报

刘燕

2022-10-13 10:06:31
按理说 fflush(stream) 会将缓冲区的内容输出到文件的。
举报

刘燕

2022-10-13 10:06:40
另外,你是怎么判断有没有写入成功的?是读了一下吗?如果读的话还要注意文件流指针的位置是不是定位在了合适的位置,写完之后指针定位在了文件结尾,需要用 fseek 指定一下位置。
举报

chunhuahua

2022-10-13 10:06:52
写入的文件 读取状态字节为0,我在终端查看文件字节数也为0
举报

刘燕

2022-10-13 10:07:03
我觉得和你的使用 “a+” 的方式打开有关,追加之后光标在文件末尾,读取的话先把光标定在文件头试试呢。
或者换一个打开方式
举报

chunhuahua

2022-10-13 10:07:14
试了,是可以读取出来的, 但读取的是缓冲中的数据, 文件中是没有保存进去,要保存进去要调用 fsync 同步,但是我现在移植的代码整个日志都用 fsync 去同步写入文件中去的话 那会让整个进程变的很慢的,导致通信不正常, 我以前的理解是就算我直接调用write 写入数据,不用 fsync去同步,理论上文件会周期性的同步到文件中去,只不过不是实时的,但是我测试rt-thread 的elmfat感觉 如果你不调用 fsync 去同步,缓冲中的数据是不会定时主动同步到文件中去的, 我不知道现在是我自己的问题,还是elmfat文件就是这种特性
举报

刘燕

2022-10-13 10:07:25
不应该是这样的,我之前也用elmfs,没有出现类似的情况。
你也可以看看 ulog 日志组件的实现,ulog 也是将日志先写到缓冲区然后一起写入文件。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分