您的位置:首页 > 编程语言 > C语言/C++

C++外部文件读取相关操作

2016-07-28 21:48 781 查看
 今天我们首先要解决的问题是使用C++进行外部文件夹的读取。

 我们在实现这些算法的过程中,用到的图的存储结构(目前)只是涉及到两种 邻接链表存储结构和邻接矩阵存储结构。其中用到较多的还是邻接链表的形式。

 在我们进行图的各种操作之前,我们必须先要创建一个图。因为后期我们小组要对每个人实现的算法进行比较,我们决定使用统一的图(具有相同的结点个数和相同的边),因此引出了我遇到的第一个问题:如何将txt文件里面的数据读取出来。

 首先我们先来分析txt文档里面存储的数据结构:

6506
0 1
0 34
0 678
...


txt文档的第一行数字为图中结点的个数,此后每一行体表一条边,第一个int数字为边的起点,后一个数字为边的终点。我们可以发现,数据的存储结构相对于之前写IL算法时的数据集结构要简单的多,所以相应的操作也就少了,拿uniprot150m.txt数据集来说整个文件有293MB的大小,我们使用getline()方法就可以完成,时间消耗个人感觉比较多,读入文件且创建图的部分代码如下:

void Graph::creat_Linklist_Direction(){
ifstream read("E:/uniprot150m.txt");
string tem;
getline(read,tem);
istringstream iss(tem);//利用istream 读取string类型并转为int
iss >> vex_num;
cout<<"结点的个数:"<<vex_num<<endl;
createVertexArry();
int start,end;
int weight=0;
while(!read.eof()){
getline(read,tem);
if (tem=="#")
{
continue;
}
if (tem!="")
{//对读入每行的内容进行分割
int pos=tem.find(" ",0);
istringstream st(tem.substr(0,pos));
st>>start;
//cout<<start<<endl;
istringstream stt(tem.substr(pos,tem.length()));
stt>>end;
//cout<<end<<endl;
addedge_direction(start,end,weight);//调用外部函数完成添边的操作
}
}
read.close();
cout<<"有向图链表存储完成!"<<endl;
}


 以上代码就可以完成我们读取txt文件并且创建一个图的过程,当然这种读取的方法是要慢一点,还有一种是利用fscanf()函数来完成的,时间相对直接使用getline()方法有部分提高,后来又发现另一种方法,还是直接上代码来理解,如下:

ifstream re;
int tem;
re.open("E:\\Share\\Sort_data\\1.txt");
if (re.bad())
{
cout<<"can not open the file!"<<endl;
}
while(!re.eof()){
re>>tem;//取出的直接就是int类型的;//也可以用 re>>tem1>>tem2,可以将一行的两个元素读取
cout<<tem<<endl;//真正用的时候我们直接换成创建数组的过程;
}
re.close();


目前为止一直使用这种方法读取,简单易操作,而且速度也不慢,暂时没有发现更好的读取方法,现将代码链接粘上点击下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++