-1

下面我的代码有一个小问题。我在课堂上从状态机中调用它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 指的是 write、binary 和 append。因此,我期望不止一条线。

fprintf 语句写入我的数据。它还有一个\n.

 fprintf(d_new_fp, "%s, %d %d\n", this->d_packet, this->d_lqi, this->d_lqi_sample_count);

我根本无法弄清楚为什么我的文件没有增长。

最好的,马吕斯

 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);
            }
        }
    }
4

1 回答 1

1

O_TRUNCman open的说明:

如果文件已经存在并且是常规文件并且打开​​模式允许写入(即 O_RDWR 或 O_WRONLY),它将被截断为长度 0。如果文件是 FIFO 或终端设备文件,则忽略 O_TRUNC 标志。否则,未指定 O_TRUNC 的效果。

该文件在每次调用时打开write_file(),删除之前写入的任何内容。替换O_TRUNCO_APPEND

于 2012-05-30T09:58:09.437 回答