我的代码在下面有一个小问题。我在状态机this->write_file(this->d_filename);
内的课堂上调用它。循环中的情况会被触发几次,但是我想要生成的CSV文件中只有一行条目。
我不确定为什么会这样。我在写函数中用this->open(filename)
打开文件。它返回文件描述符。该文件使用O_TRUNK和if ((d_new_fp = fdopen(fd, d_is_binary ? "wba" : "w")) == NULL)
打开。而aba指的是写,二进制和追加。因此,我希望不止一行。
fprintf语句写入我的数据。它还有一个\n
。
fprintf(d_new_fp, "%s, %d %d\n", this->d_packet, this->d_lqi, this->d_lqi_sample_count);
我根本无法弄清楚为什么我的文件不会增长。
最佳, 的Marius
inline bool
cogra_ieee_802_15_4_sink::open(const char *filename)
{
gruel::scoped_lock guard(d_mutex); // hold mutex for duration of this function
// we use the open system call to get access to the O_LARGEFILE flag.
int fd;
if ((fd = ::open(filename, O_WRONLY | O_CREAT | O_TRUNC | OUR_O_LARGEFILE,
0664)) < 0)
{
perror(filename);
return false;
}
if (d_new_fp)
{ // if we've already got a new one open, close it
fclose(d_new_fp);
d_new_fp = 0;
}
if ((d_new_fp = fdopen(fd, d_is_binary ? "wba" : "w")) == NULL)
{
perror(filename);
::close(fd);
}
d_updated = true;
return d_new_fp != 0;
}
inline void
cogra_ieee_802_15_4_sink::close()
{
gruel::scoped_lock guard(d_mutex); // hold mutex for duration of this function
if (d_new_fp)
{
fclose(d_new_fp);
d_new_fp = 0;
}
d_updated = true;
}
inline void
cogra_ieee_802_15_4_sink::write_file(const char* filename)
{
if (this->open(filename))
{
fprintf(d_new_fp, "%s, %d %d\n", this->d_packet, this->d_lqi,
this->d_lqi_sample_count);
if (true)
{
fprintf(stderr, "Writing file %x\n", this->d_packet);
}
}
}
答案 0 :(得分:1)
来自man open的O_TRUNC
的说明:
如果文件已经存在并且是常规文件且开放模式允许写入(即,是O_RDWR或O_WRONLY),则它将被截断为长度0.如果文件是FIFO或终端设备文件,则O_TRUNC标志为忽略。否则,O_TRUNC的效果未指定。
每次调用write_file()
时都会打开该文件,删除以前写过的所有内容。将O_TRUNC
替换为O_APPEND
。