C++之读写文件

一、文件路径

文件路径的表示可以分为相对路径和绝对路径。

1、相对路径

1.1 向上一级目录指

. / ./ ./表示当前路径
. . / ../ ../表示当前路径的上一级路径
. . / . . / ../../ ../../表示当前路径的上上一级路径
更多指向上级路径的表示以此类推。

1.2 向下一级目录指

. / ./ ./表示当前路径
. / ./ ./xxx表示当前路径的下一级路径
. / ./ ./xxx / / /xxx表示当前路径的下下一级路径
更多向下指向的路径的表示以此类推。

2、绝对路径

G : G: G:\ t e s t test test
G : G: G:\ t e s t test test\ d a t a data data
绝对路径用反斜杠$\$表示,但在c语言中单反斜杠表示转义字符,因此在c语言中用双反斜杠符号
$\\$来表示绝对路径。

二、C++文件流

C++中文件流包括fstream、ifstream以及ofstream,分别表示文件流、输入文件流以及输出文件流。

1、文件打开方式

ios::in--------------供读,文件不存在则创建(ifstream默认的打开方式)
ios::out------------供写,文件不存在则创建,文件存在则清空原内容(ofstream默认打开方式)
ios::ate------------文件打开时,指针指在文件最后,常和in、out联合使用
ios::app------------供写,文件不存在则创建,在原文件内容后写入新的内容,指针位置总在最后
ios::binary---------二进制格式文件

2、写文件操作

seekp(int offset, int mode):设置文件指针的位置,将文件读指针从mode位置处偏移offset个字节,mode有ios::beg、ios::cur以及ios::end三种选项,分别代表文件开始位置、文件当前位置以及文件结尾位置,在文件开始位置offset必须非负,在文件结尾位置offset必须非正。
tellp():返回文件当前指针的位置。

#include <fstream>

int main()
{
	std::ofstream of_path_pos("G:\\Users\\xxx\\Desktop\\测试数据.txt");
	std::vector<Eigen::RowVector3d> pathPoint;
	pathPoint.resize(4);
	pathPoint[0] = Eigen::RowVector3d(8.1472, 9.0579, 1.2699);
	pathPoint[1] = Eigen::RowVector3d(1.3925, 2.7344, 4.7875);
	pathPoint[2] = Eigen::RowVector3d(6.7542, 1.1033, 6.7941);
	pathPoint[3] = Eigen::RowVector3d(2.8715, 1.4561, 2.4008);
	for (int i = 0; i < pathPoint.size(); i++) {
		of_path_pos << pathPoint[i] << std::endl;
	}
	of_path_pos.close();
	return 0;
}

3、读文件操作

getline(istream& file, string& str, char delim):读取流(file)中数据直到遇到字符delim,并将读取的数据转为string类型存入str中,可以读取空格,遇到换行符或者EOF结束,不读取换行符。在不设置字符delim的情况下系统默认该字符为’\n’,也就是回车换行符
注意事项:getline结束后输入流file表示遇到文件结尾,getline函数返回-1,需要使用clear()函数清除输入流file状态才可以继续操作读文件指针指向某一位置
seekg(int offset, int mode):设置文件指针的位置,将文件读指针从mode位置处偏移offset个字节,mode有ios::beg、ios::cur以及ios::end三种选项,分别代表文件开始位置、文件当前位置以及文件结尾位置,在文件开始位置offset必须非负,在文件结尾位置offset必须非正。
tellg():返回文件当前指针的位置。
istringstream(string str):从string对象str中读取字符传入流中。通常配合atof以及atoi使用(atof代表ascii to float, atoi代表atoi:ascii to int)。

#include <Windows.h>
#include <string>
#include <fstream>
#include <iostream>
#include <Eigen/Dense>
using namespace std;

int main()
{
	ifstream TargetSpeedFile("G:\\Users\\xxx\\Desktop\\测试数据.txt");
	string s1, s2;
	Eigen::VectorXf V;
	UINT Num = 0;
	while (getline(TargetSpeedFile, s1))
		Num++;
	cout << TargetSpeedFile.tellg() << endl;//getline结束后输入流TargetSpeedFile表示遇到文件结尾,getline函数返回-1,需要使用clear函数清除输入流TargetSpeedFile状态
	V = Eigen::VectorXf::Zero(Num);
	UINT i = 0;
	TargetSpeedFile.clear(); 
	cout << TargetSpeedFile.tellg() << endl;
	TargetSpeedFile.seekg(0L, ios::beg);
	cout << TargetSpeedFile.tellg() << endl;
	//清除输入流TargetSpeedFile状态后才可以继续操作读文件指针指向某一位置
	while (getline(TargetSpeedFile, s1))
	{
		/*getline ( istream A , string s , char delim );*/
		/*istream A 表示一个输入流,譬如cin;
		string s表示把从输入流读入的字符串存放在这个字符串中(可以自己随便命名,str什么的都可以);
		char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\n',也就是回车换行符(遇到回车停止读入)
		*/
		istringstream fData(s1);
		while (fData >> s2)
		{
			V(i) = atof(s2.data());
			//atof:ascii to float, atoi:ascii to int
			i++;
		}
	}
	cout << V << endl;
	TargetSpeedFile.close();
}
  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值