【C++容器】std::fstream读写文件错误【2023.03.03】

std::fstream使用细节

1.文件不存不支持时打开文件模式不得有ios::in

• 如果文件不存在且打开时包括了ios::in模式则打开文件会失败。

fstream m_f;

m_f.open("d://123.csv", ios::in | ios::out | ios::binary);//文件不存在则会打开失败

• 我这边尝试行得通的做法是先判断文件是否存在

		char* ch = "d://123.csv";
		if (0 == _access(ch, 0))//文件存在
		{
			m_f.open(ch, ios::in | ios::out | ios::binary);//打开文件用于读写文件
		}
		else
		{
			m_f.open(ch,  ios::out | ios::binary);//打开文件用于写文件
		}

		if (!m_f.good())
		{
			long err = errno;//获取系统错误码
		}

2.“>>”与“<<”读写文件

• 调用<<往文件写数据时并不会自动进行分割。

// 写数据到文件
m_f << int64_t(1000);
m_f << int64_t(2000);
// 从文件读数据
int64_t data = 0;
m_f >> data;//data的结果是10002000,也就是底层存的只是字符串,连续存两个数都连到一起了。

• 尝试了很多,存有换行分隔符的字符串数据使用<<还挺方便的,读数据的话还是getline吧。

// 写文件
string strMsg("有好的使用方法,欢迎来交流哈!");
m_f << strMsg;

// 读文件
string strLine;
while( getline(m_f, strLine) )
{
	//处理strLine
}

3.读完之后写不进去了

iostate value (成员常量)标志检查这些标记的函数
good()eof()fail()bad()rdstate()
goodbit无错误truefalsefalsefalsegoodbit
eofbit输入操作时到达文件尾falsetruefalsefalseeofbit
failbitio操作发生逻辑错误falsefalsetruefalsefailbit
badbitio操作发生读写错误falsefalsetruetruebadbit

• 先读文件,从头读到尾,会使得eofbit被置位,这时再往文件里面写数据是写不进去的,需要调用clear清空标记位。

#include <iostream>     // std::cout
#include <fstream>      // std::fstream

int main () {
  char buffer [80];
  std::fstream myfile;

  myfile.open ("test.txt",std::fstream::in|std::fstream::out);

  // 读文件
  string strLine;
  while( getline(myfile, strLine) )
  {
      //处理strLine
  }

  //写数据到文件
  myfile << "test"; //写不进去,因为上一步的读触发了end of file 即eof错误标记。需要读之后写一句“myfile.clear()”;
	
  myfile.close();

  return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值