第一次写程序

虽然在开始正式学习编程之前曾经学过半年的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某前辈教我的,非常感谢。

 

这还仅仅只是一个读取简单数据的地方,在程序实际写的过程中,遇到的问题多多的让我自己都很惊讶。

 

后面再慢慢写来。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值