提问人:mappa 提问时间:10/12/2016 最后编辑:codeInnovationmappa 更新时间:10/12/2016 访问量:238
写入已打开的文件流并删除其余部分
Write to an already open filestream and get rid of the rest
问:
我目前正在使用并拥有以下类:
(请注意,该文件在构造函数上打开,并且应在所有读/写操作期间保持打开状态,仅在被破坏时关闭)。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;
}
在刷新数据之前,有没有办法清除文件的当前内容?
答:
为了能够写入文件末尾,请改用标记 ios::app。
你的代码充满了错误:
1- 您还尝试将类字符串写入文件,这是不正确的。如果要执行此操作,请使用序列化。在您的情况下,只需将其转换为常量字符串即可。
2- 你的写入和读取函数被定义为对字符串的引用,但你按值传递!(通过“12345”和“ABC”)
3- 为什么要寻找输入指针?(寻求)?只要你想写??!! 您可能是指 seekp() 寻求输出指针;即使在这种情况下,出于什么原因这样做?如果要将文本附加到最后,请在打开的文件中使用 ios::app。 如果要在任何写入操作中清除内容,则应该有两个文件流,一个用于读取,另一个用于写入,因此用于写入的文件流使用标记 ios::out |ios::trunc。因为 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;
}
评论