使用C ++指向fstream的问题

时间:2015-12-14 20:29:18

标签: c++ file pointers fstream

我的代码有问题下面我试图使用指向文件流的指针将一些文本写入文件,但下面的代码没有写入文件,我试过没有指向{{1}的指针哪个工作正常,但使用指针我看不到我的文本文件中的任何更改,但代码编译成功。

fstream

3 个答案:

答案 0 :(得分:4)

Streams缓冲输出。如果流未被刷新,则永远不会写入输出。由于写入的字符串很小,它将被缓冲。流的析构函数将刷新流,就像填充缓冲区一样。如上所述,指针被泄漏,流不会被破坏,因此不会被刷新。

您的问题的解决方案按优先顺序排列:

  1. 不要使用指针。
  2. 使用智能指针,例如std::unique_ptr<std::ofstream>来保存信息流。
  3. delete程序结束时的流对象(这很容易忘记,使用自动销毁更为可取)。
  4. 至少close()使用io->close()的流。不delete流将是资源泄漏。
  5. 使用*io << std::flush刷新流仍应写入缓冲区。这种方法会像先前的方法那样泄漏内存,但也会泄漏文件描述符。
  6. 就个人而言,会采用方法1.如果我绝对不得不使用从未发生在我身上的指针,我会使用2.其他所有技术都可以工作但很可能会导致资源泄漏。

答案 1 :(得分:0)

您需要关闭该文件: io->close(); 如果您不关闭该文件,它将不会刷新磁盘上的数据。 当你在堆栈上fstream对象时,当对象超出范围时,它会关闭文件(在析构函数中)。

答案 2 :(得分:0)

这可能只是缓冲区的问题:您需要刷新流以确保所有内容都写入文件中。以下代码段工作正常:

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

int main()
{
  ofstream* f = new ofstream("out.dat");

  if(! f->is_open())
  {
    cerr << "Impossible to open the file" << endl;
    exit(-1);
  }

  *f << "Hello, world!" << flush;

  f->close();

  delete f;

  return 0;
}

不要忘记每newdelete都应该关注!