一、文件路径
文件路径的表示可以分为相对路径和绝对路径。
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();
}