在上一个企业管理程序里面我使用了txt作为文件数据存储的一种方式,然而,让我最苦恼的其实并不是如何存储和读取数据,而是怎么读?躺床上想了一个多小时,才想到一种也许并不是很完美的算法,在此与大家分享。现在,我们来把代码重现,首先,是我们的存取代码,没有什么高深的地方。随便看看:
ofile.open("data.txt",ofstream::out| ofstream::app);
ofile<<number<<'$';
ofile<<name<<'$';
ofile<<sex<<'$';
ofile<<age<<'$';
ofile<<post<<'$';
ofile<<weage<<'$';
ofile.close();
}
我每次都在文件尾部插入一个个的数据,然而在数据中间,我插入了一个个$字符来进行区分,这个$字符有什么用,我们待会再来看。现在我们来看这段整个程序中最重要,也是最最核心的一个代码段:
while(chose==2)
{
intcount=0;
vector<manager>bowl;//用来存放数据
ifstreaminfile("data.txt"); //绑定文件
stringa[10000]; //静态数组存放数据
stringstr; //string字符串用来进行临时中转
infile>>str; //将文件中的数据存入str
inttempcount=0; //置0
intix=0; //ix为静态数组下标
string::iteratorp=str.begin();
while(*p!=NULL)
{
a[ix]=*p;
//cout<<a[ix]<<endl;
++ix;
++p;
if(*p=='$')
{
++p; //用以屏蔽$字符
++tempcount;//人员的内容项目计数器+1,根据$字符来判断当前数据属于类中的什么部分。
for(inti=1;i<ix;i++)
{
a[0]+=a[i];
}
if(tempcount==1)
{
bowl[count].number_Input(a[0]); //此处的算法用途为将文件中的数据按照一定算法放入容器内部,以供冒泡排序之用。
}
elseif(tempcount==2)
{
bowl.push_back(item);
bowl[count].name_Input(a[0]);
}
elseif(tempcount==3)
{
bowl.push_back(item);
bowl[count].sex_Input(a[0]);
}
elseif(tempcount==4)
{
bowl.push_back(item);
bowl[count].age_Input(a[0]);
}
elseif(tempcount==5)
{
bowl.push_back(item);
bowl[count].post_input(a[0]);
}
elseif(tempcount==6)
{
bowl.push_back(item);
doublemoney;
money=atof(a[0].c_str()); //字符数组的转化
bowl[count].weage_Input(money);
++count; //人员计数器加一
tempcount=0; //由于到了最后,所以要重新置为0
}
ix=0; //数组重置
}
}
}
我们首先来想想,我们需要干什么,我们需要先把每个人的每个属性值按照一定的方法读取到每个容器中的每个类的每个属性部分(自己思考一下,我也不知道怎么用文字表达)。所以我们定义一个vector容器,这个容器是类manger类型的,那么我们是不能直接从文件按照一定方法读取的(至少我没想到),我们现在就定义一个string字符串str。这个string可以存储长达20亿个字符!然后我们把文件中所有的数据全部读取到了这个str变量中,我们使用一个指针p指向str变量。好,这些理解完了,我们来解决一个问题,怎么把这些数据按照我们所想要的,读进容器中每个类的对应对象,首先,我们在一开始就在每个人员的每个属性之间用$符号隔开了,我们是否可以从$符号的个数来区别当前所指的数据是什么属性?
我们先来定义一个while循环,这个循环的结束条件是指针p所指向的数据不为NULL,
首先,我们定义一个string a[]数组,这个数组就用来存放我们一个个的属性值,每存完一个属性值,就插到我们容器当中对应类的对应属性。我们定义一个ix,这个ix初始化为0,指向a数组的第一个元素,我们让a数组的对应元素等于*p当前所指的元素,然后*p往下跳一个数据,我们的ix也相应的跳一个数据,这样就能一一对应的把数据存到a[ix]数组当中去,那么什么时候停呢?我们当*p等于我们的标记符号$的时候,我们说明已经读完了一个属性,那么我们就先把这个属性插入进我们的对应的容器当中某个元素的某个属性。那么怎么才能知道,这个属性是什么,插在哪里呢?我们就定义一个tempcount来记录当前$符号的个数,比如说,我读到了第一个$字符,那么表示前面的这一串数据就是表示职工号的。然后我们就把tempcount计数器跳1,然后也许你会不理解一个地方就是为什么我们要让p也加1?p当前指向$字符,我们总不能把$字符加进容器当中吧?我们就+1,屏蔽掉这个字符,然后我们知道,我们的数组是string,我们需要把这一个个字符连起来。变成一个字符串,然后再通过name_Input函数把数据送到容器对应的属性当中去,这里我们还有一个count计数器,这个计数器是做什么用的呢,我们知道,vector容器和数组一样,是顺序存储的一种数据结构,当我们的tempcount计数器到达6的时候,就说明一个人员的属性已经全部输入完毕了,我们将count计数器跳一,这样我们的数组就自动往下跳一个,在最后的一个钱的计算中,我们将字符串型数据重新转换成整型数据,使用atof函数。在for循环的最后,我们要将ix置为0,因为一个属性结束,我们把a数组置为0的,重新进行一遍又一遍的输入,整个算法就是这样,嘿嘿。
文件字符读入算法分析
最新推荐文章于 2018-08-28 17:18:39 发布