虽然在开始正式学习编程之前曾经学过半年的C语言,但是所了解的仅限于最基础的变量和结构,更不要说面向对象一类对于那时的我仿佛天书般的词汇了。来到澳洲踏实念书2个月后,终于遇到了自己第一次要完成一个有完整功能的程序。
怎么才能算有完整功能呢?照老师的说法:读取数据,处理数据,存储数据,并且在处理中能够对错误数据作出判断并自动或要求用户手动纠错。
在此之前,所写的程序都不过只诸如{int i; cin>>i;cout<<i*i;}这种层面的存在,因此作为人生第一次独立开发程序,虽然小而简陋,但是依然让我兴奋不已。
但是即便有了心理准备,在写程序时还是很快就让我遇到了下马威。
“从数据文件中读取数据”
简单的一句话让我纠结不已。
先看看最基础的C++的文件读入代码吧
#include <iostream>
#include <fstream>
typedef unsigned int UINT;
using namespace std;
UINT ReadData(bool=false);
int main()
{
//....
UINT Flag;
Flag=ReadData();
switch(Flag)
{
case 1:/* ... */break;
case 0:/* ... */break;
case -1:/* .. */break;
}
system("pause");
return 0;
}
UINT ReadData(bool ErrFlag)
{
fstream fin;
fin.open("Data.txt");
if(fin.fail())
{
cout<<"Unable to open Data.txt"<<endl;
return -1;
}
char TmpChar[20];
while(fin>>TmpChar)
{
cout<<TmpChar<<endl;
}
fin.close();
return 1;
}
虽然只是一段最最原始的读入文件代码,却错误百出的让我郁闷;
在整个过程中,我遇到过如下的错误:
1. fin读入数据后自动跳回文档头部,使得只能读第一行的前20个字符。
2. 成功编译后读入文档即程序崩溃,原因是忘记关闭文档。
3. 一次读入的字符数不足导致TmpChar没有重置数据而出现乱码
等等等……
许多以前想到过的和没想到过的问题纷纷出现了。
而最终,我的读入程序是这样解决:
#include "iostream"
#include "afx.h"
#include "CString"
#include "vector"
typedef unsigned int UINT;
using namespace std;
using std::vector;
wchar_t DataFileName[]="Data.txt";
struct Record
{
CString Number;
CString Name;
CString Status;
CString Subject[4];
};
/* ....Other blocks...Actually, this function is in a class
class REC
{
public:
//
UINT ReadData(bool=false);
};
*/
UINT ReadData(bool ErrFlag)
{
CStdioFile File;
File.Open(DataFileName,CFile::modeRead);
//....Error check, return 0 or -1 here
CString TmpStr;
Record TmpRec;
vector<Record> NewRec;
unsigned short opt=0;
while(File.ReadString(TmpStr))
{
opt++;
switch(opt%8)
{
case 1:TmpRec.Number=TmpStr;break;
case 2:TmpRec.Name=TmpStr;break;
case 3:TmpRec.Status=TmpStr;break;
case 4:TmpRec.Subject[0]=TmpStr;break;
case 5:TmpRec.Subject[1]=TmpStr;break;
case 6:TmpRec.Subject[2]=TmpStr;break;
case 7:TmpRec.Subject[3]=TmpStr;NewRec.push_back(TmpRec);break;
default:opt=0;break;
}
}
return 1;
}
使用switch来调整每次读取后推送数据的方向是CSDN某前辈教我的,非常感谢。
这还仅仅只是一个读取简单数据的地方,在程序实际写的过程中,遇到的问题多多的让我自己都很惊讶。
后面再慢慢写来。