【问题标题】:Write to an already open filestream and get rid of the rest写入已经打开的文件流并摆脱其余部分
【发布时间】:2017-02-20 08:32:34
【问题描述】:

我目前正在使用std::fstream 并有以下课程: (请注意,文件是在构造函数上打开的,并且应该在所有读/写操作期间保持打开状态,只有在被破坏时才会关闭)。

MyFileClass
{
public:
   MyFileClass( const std::string& file_name ) { m_file.open( file_name ) };
   ~MyFileClass() { m_file.close() };
   bool read( std::string& content );
   bool write( std::string& data );
private:
   std::fstream m_file;
}

现在我有一些示例代码:

MyFileClass sample_file;
sample_file.write("123456");
sample_file.write("abc");

结果将是“abc456”,因为当流打开并且我们使用截断模式写入时,它总是会在当前的内容之上写入。

我想要的是每次在我们写之前都要清理一下,所以最后我只会有最新的东西,在这种情况下是“abc”。

当前的设计是如果文件不存在,它只会在写入时创建,而不是在读取时创建(如果文件不存在,读取将返回错误代码)。

我的写函数是:

bool
MyFileClass::write( const std::string& data )
{   
    m_file.seekg( 0 );
    if ( !m_file.fail( ) )
    {
        m_file << data << std::flush;
    }

    return m_file.fail( ) ? true : false;
}

有什么方法可以在刷新数据之前清除文件的当前内容?

【问题讨论】:

标签: c++ file-io iostream fstream


【解决方案1】:

为了能够写入文件末尾,请改用标志 ios::app。

你的代码充满了错误:

1-您还尝试将类字符串写入不正确的文件。如果您想这样做,请使用序列化。在您的情况下,只需将其转换为常量字符串。

2- 您的写入和读取函数定义为引用字符串,但您按值传递! (传递“12345”和“abc”)

3- 你为什么要寻找输入指针? (寻求)?只要你想写??!! 你的意思可能是 seekp() 寻找输出指针;即使在这种情况下,为什么要这样做?如果要将文本附加到末尾,请在打开文件中使用 ios::app 。 如果您想在任何写入操作中清除内容,那么您应该有两个文件流,一个用于读取,另一个用于写入,因此用于写入的一个使用标志 ios::out | IOS::截断。因为 ios::trunc 在读/写模式下什么都不做。

4- 如果你真的想通过引用传递,那么你必须在 main 中声明字符串对象传递给它们的值(“abc”和“12345”每个)然后传递这些字符串来写入和读取而不是值。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

class MyFileClass
{
public:
    MyFileClass(  std::string file_name );
   ~MyFileClass() { m_file.close(); }
   bool read ( std::string content );
   bool write( std::string data );
private:
   std::fstream m_file;
};

MyFileClass::MyFileClass( std::string file_name )
{
    m_file.open( file_name.c_str(), ios::out | ios::in | ios::app);
    if(!m_file)
        cout << "Failed to open file!" << endl;
}

bool MyFileClass::write( const std::string data )
{   
    if ( !m_file.fail( ) )
    {
        m_file << data.c_str() << std::flush;
    }

    return m_file.fail( ) ? true : false;
}

int main()
{

    std::string sFile = "data.dat";

    MyFileClass sample_file(sFile);

    sample_file.write("123456");
    sample_file.write("abc");

    return 0;
}

【讨论】:

  • 您好,感谢您的评论。这是我对所有 const 和东西的错误,但它只是小样本,与主要问题完全无关。
  • 不小心按回车。简而言之,我得到的答案是我无法截断并且已经打开文件。两个流建议不是一个选项(
  • Again....好吧,你的观点 1,2,4 都是我的错误,这不是我想问的(只是一个演示这个想法的例子,代码不需要运行或编译)。第 3 点-我已经打开了 1 个文件,它将保持打开状态,这是要求。另一个流或再次打开它以重新分配新模式不是一种选择。 Barmar 的链接很好地描述了问题和当前的限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 2017-08-26
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多