使用fstream在C++工程中读取文件到二维数组

首先为类CCalculateCenterDlg定义一个较大的二维数组成员m_DataArry[100][100],实际读取数据中存放在该数组中,但是肯定用不完该数组的所有空间,实际使用的数组长度和宽度被保存在该类的成员变量m_iHeight 和 m_iWidth中。

例如:其思路可如下描述

定义了较大的二维数组10行9列,但是实际使用时可能只使用了6行3列,到时候引用时只要使用实际的行列数6和3而不是数组本身的行列数10和9就可以了,如下图1所示


图1 使用的二维数组


具体实现过程为:

1、修改项目的工程为多字节字符集

如图2红色框部分,该图为VS2005项目修改字符集的位置。【注意修改成多字节字符集之后,工程中的CString,char等字符转换时就不能使用中文了】



图2、修改文件的工程为多字节字符集


2、定义文件流对象

文件名字存储在对象CString csFileName中,每读取一行将进行解析并将改行数据存入数组中,的然后将数组的行数加1;

bool CCalculateCenterDlg::GetDataFromFile(CString csFileName)
{
fstream file(csFileName.GetBuffer());//注意输入文件名字及其路径中不能有汉字
if (!file)
return false;
char LineBuf[LINE_LENGTH];
m_iHeight = m_iWidth = 0;
bool bFindNewCol = false;
int iWidPos =0;
string sLineContent;
while(file.getline(LineBuf,LINE_LENGTH))
{
sLineContent = LineBuf;
ParseInputData(sLineContent);
++m_iHeight;
}
file.close();
return true;

}

注意:

(1)输入文件名字及其路径中不能有汉字

(2)二维数组m_DataArry[100][100]是CCalculateCenterDlg的成员变量:int m_DataArry[100][100];

(3)变量m_iHeight 和 m_iWidth 是CCalculateCenterDlg的成员变量;用于标识已经使用的数组长度和宽度

(4)CCalculateCenterDlg的成员函数ParseInputData主要用于处理读取的每一行数据,定义形式为:

bool ParseInputData(string sLineInfo);

3、解析每一行读取的数据到数组中:


voidCCalculateCenterDlg::ParseInputData(string sLineInfo)
{
int iWidth =0, iCurPos = 0, iInsertPos =0;
char DataUnit[8], curChar;
bool bFindData = false;
memset(DataUnit,0,8);
while(iCurPos<sLineInfo.length())
{
curChar = sLineInfo[iCurPos];
if (curChar != ' ' && curChar != ''&& curChar != '\n')
{
bFindData = true;
DataUnit[iInsertPos++] = curChar;
}
if (bFindData && (curChar == ' ' || curChar == '' || curChar == '\n'))
{
bFindData = false;
m_DataArry[m_iHeight][iWidth++] = atoi(DataUnit);
iInsertPos =0;
memset(DataUnit,0,8);
}
++iCurPos;
}
if (iWidth>m_iWidth)
{
m_iWidth = iWidth;
}

}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值