1. 读文件准备工作
1.前提,首先读文件需要引入头文件ifsteam或者ofstream。
2.直接创建类对象 如:ifstream ifs;
3.需要提前创建数组或者是字符串变量来存储,ifs对象所读取的文本内容
接着有三种方法来读取文件内容。
- getline(ifs,string ) 有一个全局函数getline,不依赖于类对象的前提,使用时只需要将输入流ifs作为函数参数传入getline中,并且将读取的数据存入事先创建好的数组字符串变量string中。
- ifs<<buf;当创建ifstream对象后,可以像操作cin一样操作这个对象,也就是可以把ifstream的对象当做cin一样进行输入
- ifs.getline(char *buf,sizeof(buf)) ifstream的类对象ifs中含有成员函数getline函数,可以将TXT文件中的内容一行一行的读取,每次读取之后将内容存入buf中。
2. 读取文件的3种方法举例说明
1.getline()全局函数
- 对于全局函数getline的用法,由于该函数默认是一行一行的读取,所以需要while循环来读取txt文本的所以内容,当遇到‘\n’,标志读取该行结束。
当读取不到任何字符的时候就返回false,可用于判断文件是否结束
eg1:
fstream in;
in.open("ELIST_te_sphe.txt", ios::in);//LISTE ELIST_test1.txt ELIST_test_sphere.txt DLIST_tes_sphe
string str;
while(getline(in,str))
{
cout << str<<endl;
}
(结果显示)
2. 流输入方式ifs<<buf存取
- 对于ifs<<buf流输入方式存取,其原则是当碰见空格之后,就结束当前读取,所以想要读取完文本内容,就必须借助while,当没有字符读入时结束文本读取。
eg2:
//代码引入
fstream in;
char buf[1024];
in.open("ELIST_te_sphe.txt", ios::in);
while (in >> buf)
{
cout << buf << endl;
}
(结果显示)
【拓展】该读取方法将以空格作为结束读取标志,若是要读取指定区域的文本内容就需要添加代码操作,进行存取。(注:引入如下代码实现对红色区域存取)
while (in >> buf)
{
//cout << buf << endl;
if ('0' <= buf[0] && buf[0] <= '9')
{
bianhao[i]=atoi(buf);
//cout << atoi(buf) <<" "<< typeid(atoi(buf)).name() << endl;
//cout << bianhao[i] << " "<<i<< endl;
i++;
}
}
for (int j = 0; j < i; j++)
{
if (!(j % 26 <= 5 && j % 26 >= 0))
{
temp[flag] = bianhao[j];
cout << temp[flag] << " ";
flag++;
if (j % 26 == 25)
{
cout << endl;
}
}
}
in.close();
(结果显示)
3.ifs.getline(char *buf,sizeof(buf))
- 对于ifs.getline读取方法,和getline全局函数类似。也是按行读取,并且当遇到‘\n’之后,结束当前行读取。直到没有数据读取就结束当前文本读取。(注:读取的时候也会将空格读入数组,在提取数据的时候,就需要指定关键信息存取)
eg3:
fstream in;
string v, x, y, z;
int i = 0, flag = 0;
MatrixXd temp_zuobiao(1, 4);
MatrixXd node_zuobiao(0, 4);
in.open("NLIST_test_sphe.txt", ios::in);//LISTE ELIST_test1.txt ELIST_test_sphere.txt
while(in.getline(buf, sizeof(buf)))
{
stringstream word(buf);//采用字符流格式将读取的str进行空格分隔,并放入str word中
//word >> zuobiao[flags].bianhao;
word >> v;
if (v <= "9"&& v >= "0")
{
word >> x;
word >> y;
word >> z;
temp_zuobiao(0, 0) = atof(v.c_str());
temp_zuobiao(0, 1) = atof(x.c_str());
temp_zuobiao(0, 2) = atof(y.c_str());
temp_zuobiao(0, 3) = atof(z.c_str());
node_zuobiao = append(node_zuobiao, temp_zuobiao);
//cout << zuobiao[flags].bianhao << " " << zuobiao[flags].U << " " <<
//zuobiao[flags].real << " " << zuobiao[flags].imge << " " << endl;
//flags++;
}
}
cout << "—节点坐标—" << endl << node_zuobiao << endl;
(结果显示)
总之
3种读取方法都只是将内容全部读出来,然后存入数组之中,如果需要对文本的指定区域进行读取就需要,写一系列操作,来实现。
本文给了几种思路可供参考,如果有更好的方法,也请多多指教。
最后如果读者觉得本文有用,还请点个赞哟!