一个文本文件的内容如下:////////
//若干文字,都是用来说明的文字
//////// 4, 500, 10 0,5,7,13,17,20,23,26,32,35,
40,45,47,50,53,57,61,65,67,72,
75,78,82,85,88,92,96,100,104,106,
110,112,116,120,123,125,129,132,136,140,
142,145,150,153,157,160,162,165,167,173,
175,177,179,183,187,190,193,196,198,200,
203,205,207,209,212,215,217,219,221,223,
225,227,229,231,233,235,237,239,241,243,
246,248,250,252,254,256,258,260,262,264,
266,268,269,270,272,273,274,275,276,277,
278,279,280,281,282,283,284,285,286,287,
288,289,290,291,292,293,294,295,296,297,下面还有很多数字.......
..........
..........现在需要读取这个文件里的数字并存到数组里,文件开头的//号还有后面说明的文字要过滤掉,中间的空格也要过滤掉,还有逗号也不要,只要数字,应该怎么做??
然后再问个问题,怎么看我还剩多少分??!!
//若干文字,都是用来说明的文字
//////// 4, 500, 10 0,5,7,13,17,20,23,26,32,35,
40,45,47,50,53,57,61,65,67,72,
75,78,82,85,88,92,96,100,104,106,
110,112,116,120,123,125,129,132,136,140,
142,145,150,153,157,160,162,165,167,173,
175,177,179,183,187,190,193,196,198,200,
203,205,207,209,212,215,217,219,221,223,
225,227,229,231,233,235,237,239,241,243,
246,248,250,252,254,256,258,260,262,264,
266,268,269,270,272,273,274,275,276,277,
278,279,280,281,282,283,284,285,286,287,
288,289,290,291,292,293,294,295,296,297,下面还有很多数字.......
..........
..........现在需要读取这个文件里的数字并存到数组里,文件开头的//号还有后面说明的文字要过滤掉,中间的空格也要过滤掉,还有逗号也不要,只要数字,应该怎么做??
然后再问个问题,怎么看我还剩多少分??!!
解决方案 »
- 各位虾哥虾姐们,救命啊,我的CWnd运行一段时间后移离屏幕位置了?为什么?
- 为什么以下Java代码比C++代码快?
- 求出极大、极小值
- 属性页的重绘问题,请帮忙!
- happyparrot(快乐鹦鹉)( )请入
- 关于listview的控制,,,?????????????
- 如何实现TOOLBAR的显示和不显示的控制?
- 我的程序是多视图型的,如何让程序开始运行时只打开主窗口,而子窗口只有在点击新建后,才打开?
- 再问打印问题
- bcgcb5.84 今天发布了,谁有它的下载地址和序列号?100分交换,给第一个提供回答正确的大侠
- C++类库的问题!什么函数可以实现在列表框中添加一个选项?
- 如何用setup factory打包时将数据库配置好?
char chTemp[100];memset( chTemp, '\0', sizeof(chTemp) );//clear chTempif( (m_pf = fopen( filename(包括路径和后缀名), "r" ) ) )//以读的形式打开文件
{
while( fgets( chTemp, 64, m_pf ) )//获取一行的字符并保存到chTemp里,
//再执行一次就能获取下一行所有的字符
//如果fgets()的结果是空的,则会跳出
{
//然后在这里面对chTemp进行处理,
//逐个判断里面这些字符是否是数字或逗号(可以利用AscII码值进行判断),
//如果是数字则保存起来。 memset( chTemp, '\0', sizeof(chTemp) );//clear chTemp
}
}
添加一动态申请内容方法
void CXXX::ProcessMemory(int iSize)
{ if(m_aNumber == NULL)
{
m_aNumber = new int[iSize];
m_iMaxCount = iSize;
}
else
{
int *lpTmp = new int[m_iMaxCount + iSize];
memcpy(lpTmp, m_aNumber, m_iMaxCount*sizeof(int));
delete []m_aNumber;
m_aNumber = lpTmp;
m_iMaxCount = m_iMaxCount + iSize;
}
}
在调用如下代码即可: m_aNumber = NULL;
m_iCount = 0;
m_iMaxCount = 0;
CString strRet = "";
CStdioFile pFile("C:\\test.txt", CFile::modeRead);
BOOL bContinue = TRUE;
while(bContinue)
{
CString strContent = "";
bContinue = pFile.ReadString(strContent);
char *lpStr = strContent.GetBuffer(0);
while(*lpStr != NULL)
{
int iTemp = 0;
if( (*lpStr >= '0') && (*lpStr <='9' ) )
{
sscanf(lpStr, "%d", &iTemp);
if(m_iCount + 1 >= m_iMaxCount)
ProcessMemory(10);
m_aNumber[m_iCount] = iTemp;
//TRACE("%d, ", m_aNumber[m_iCount]);
m_iCount++;
} CString strTmp = "";
strTmp.Format("%d", iTemp);
int iLen = strTmp.GetLength();
lpStr += iLen;
}
}
for(int ii = 0; ii < m_iCount; ii++)
TRACE("%d,", m_aNumber[ii]);所有的数据保存在m_aNumber里
最后记录delete []m_aNumber;
按行从文件中读出文本,然后用下面的类分解(注意初始化时设置,为分隔符)/////////////////////////////////////////////////////////////////////////////
/**
* 文件名 :SplitStr.h
* 版本号 : V1.0
* 项目名称:
* 版权声明: Copyright 2005 Luowei. All Rights Reserved.
* 模块简单描述:分解字符串
*======================================================
* 版本变更记录:
*
* 2005-3-15 v1.0 罗伟
*/
/////////////////////////////////////////////////////////////////////////////#ifndef _SPLITSTR_H
#define _SPLITSTR_H#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#include "UniString.h"
const int MAX_SPLITNUM = 100; //最大可分解的子字符串数量class CSplitStr
{
public:
CSplitStr();
CSplitStr( const LPWSTR Value );
CSplitStr( const LPCSTR Value );
CSplitStr( const CUniString & Value );
~CSplitStr(); //函数
void SetSeparator(LPCTSTR sValue);
void SetString(LPCTSTR sValue, LPCTSTR splitstr="|"); void Split();
int GetStrLen();
int GetSplitStrLen(int index);
int GetSplitCount();
long GetSplitStr(int index, LPTSTR & splitStr,long bufLen = 2056);
CString GetSplitStr(int index);
bool GetSplitInt(int index, int &splitInt, long bufLen = 2056);
INT GetSplitInt(int index);
bool GetSplitLong(int index, long &splitLong, long bufLen = 2056);
LONG GetSplitLong(int index);
bool GetSplitDouble(int index, double &splitDouble, long bufLen = 2056);
DOUBLE GetSplitDouble(int index);protected:
CUniString m_str; //传入类中的要进行分解的字符串
CUniString m_Separator; //分隔符
void Init();private:
int m_strCount; //分解的字符串的总数 typedef struct TABSPLITSTR
{
int index; //(0到MAX_SPLITNUM)= 顺序号
CUniString SplitString; //字符串的内容
LPCTSTR bufStr; //同SplitString内容,不过为缓冲区中的非Uni类型
}; TABSPLITSTR m_tagSplitStr[MAX_SPLITNUM];};#endif
/**
* 文件名 :SplitStr.cpp
* 版本号 : V1.0
* 项目名称:
* 版权声明: Copyright 2005 Luowei. All Rights Reserved.
* 模块简单描述:分解字符串
*======================================================
* 版本变更记录:
*
* 2005-3-15 v1.0 罗伟
*/
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "../include/SplitStr.h"
CSplitStr::CSplitStr()
{
Init();
}CSplitStr::CSplitStr( const LPWSTR Value )
{
Init();
m_str = CUniString(Value);
}
CSplitStr::CSplitStr( const LPCSTR Value )
{
Init();
m_str = CUniString(Value);
}CSplitStr::CSplitStr( const CUniString & Value)
{
Init();
m_str = CUniString(Value);
}
CSplitStr::~CSplitStr()
{}
void CSplitStr::Init()
{
m_str = "";
m_Separator = CUniString("|");
m_strCount = 0;
for(int i = 0; i < MAX_SPLITNUM; i++)
{
m_tagSplitStr[i].index = i;
m_tagSplitStr[i].SplitString = "";
}
}
///////////////////////////////////////////////////////////
//设置分隔符
void CSplitStr::SetSeparator(LPCTSTR sValue)
{
if(strlen(sValue) > 0)
m_Separator = sValue;
}//设置字符串内容
void CSplitStr::SetString(LPCTSTR sValue, LPCTSTR splitstr/*="|"*/)
{
Init();
SetSeparator(splitstr);
m_str = sValue;
}//得到m_str字符串的长度
int CSplitStr::GetStrLen()
{
return m_str.GetLength();
}//得到指定分解项的字符串长度
int CSplitStr::GetSplitStrLen(int index)
{
if(index>=0 && index < MAX_SPLITNUM)
return m_tagSplitStr[index].SplitString.GetLength();
else
return 0;}
//分隔字符串
void CSplitStr::Split()
{
int firstPos = 0;
int endPos = 0;
int prePos = 0;
int pos = -1;
int slen = 0;
int index = 0; slen = GetStrLen(); //当前字符串内容为空
if(slen <= 0)
{
m_strCount = 0;
return; } //在非空字符串中无指定分隔符,将些字符串内容赋给数组0
if(m_str.Find(0,slen -1,m_Separator) == -1)
{
m_tagSplitStr[0].index = 0;
m_tagSplitStr[0].SplitString = m_str;
m_strCount = 1;
} //有若开个分隔符
else
{
m_strCount = 0;
while(prePos < slen)
{
pos = m_str.Find(prePos,slen -1,m_Separator);
if(pos != -1)
{
firstPos = prePos;
endPos = pos -1;
m_tagSplitStr[index].index = index;
m_tagSplitStr[index].SplitString = m_str.Mid(firstPos, endPos - firstPos+1);
m_strCount++;
index++;
prePos = pos + 1;
}
//在最后一个分隔符后应存在有内容或至少为一空内容
else
{
m_tagSplitStr[index].index = index;
m_tagSplitStr[index].SplitString = m_str.Mid(endPos + 2, m_str.GetLength() - endPos);
m_strCount++;
break;
} }
}}//得到分解后的总数
int CSplitStr::GetSplitCount()
{
return m_strCount;
}//得到指定项的分解后的字符串内容,返回值为内存中所占用的缓冲区实际长度(汉字占用两个字节)
long CSplitStr::GetSplitStr(int index, LPTSTR & splitStr,long bufLen/* = 2056*/)
{
long sLen = 0;
if(GetSplitCount() >0)
{
sLen = m_tagSplitStr[index].SplitString.GetBufferStr(splitStr,bufLen);
// sLen = m_tagSplitStr[index].SplitString.GetLength();
} return sLen;}CString CSplitStr::GetSplitStr(int index)
{
CString s = "";
if(GetSplitCount() >0)
{
s = m_tagSplitStr[index].SplitString.m_pchDebugData;
} return s;
}//得到指定项的分解后的字符串内容并转换为整数,无法转换时,返回FALSE
bool CSplitStr::GetSplitInt(int index, int &splitInt, long bufLen/* = 2056*/)
{
bool b = true;
int NoNull = 0;
bool getNoNull = false;
LPTSTR pStr = new CHAR[bufLen]; if(GetSplitStr(index, pStr,bufLen) > 0)
{
int count = strlen(pStr);
for(int i = 0; i < count; i++)
{
if(*(pStr + i) != 32 && !getNoNull)
{
NoNull = i;
getNoNull = true;
} // 数字1-9
if(isdigit(*(pStr + i)) == 0)
{ //负号
if(*(pStr + NoNull) != 45)
{
b = false;
break;
}
} }
//全为数字
if(b)
{
splitInt = atol(pStr);
}
}
delete pStr;
return b;
}
INT CSplitStr::GetSplitInt(int index)
{
bool b = true;
LONG splitInt = 0;
int NoNull = 0;
bool getNoNull = false;
LPTSTR pStr = new CHAR[2056]; if(GetSplitStr(index, pStr,2056) > 0)
{
int count = strlen(pStr);
for(int i = 0; i < count; i++)
{
if(*(pStr + i) != 32 && !getNoNull)
{
NoNull = i;
getNoNull = true;
} // 数字1-9
if(isdigit(*(pStr + i)) == 0)
{ //负号
if(*(pStr + NoNull) != 45)
{
b = false;
break;
}
} }
//全为数字
if(b)
{
splitInt = atol(pStr);
}
}
delete pStr;
return splitInt;
}//得到指定项的分解后的字符串内容并转换为长整数无法转换时,返回FALSE
bool CSplitStr::GetSplitLong(int index, long &splitLong, long bufLen/* = 2056*/)
{
bool b = true;
int NoNull = 0;
bool getNoNull = false;
LPTSTR pStr = new CHAR[bufLen]; if(GetSplitStr(index, pStr,bufLen) > 0)
{
int count = strlen(pStr);
for(int i = 0; i < count; i++)
{
if(*(pStr + i) != 32 && !getNoNull)
{
NoNull = i;
getNoNull = true;
} // 数字1-9
if(isdigit(*(pStr + i)) == 0)
{ //负号
if(*(pStr + NoNull) != 45)
{
b = false;
break;
}
} }
//全为数字
if(b)
{
splitLong = atol(pStr);
}
}
delete pStr;
return b;
}//得到指定项的分解后的字符串内容并转换为长整数无法转换时,返回FALSE
LONG CSplitStr::GetSplitLong(int index)
{
bool b = true;
LONG splitLong = 0;
int NoNull = 0;
bool getNoNull = false;
LPTSTR pStr = new CHAR[2056]; if(GetSplitStr(index, pStr,2056) > 0)
{
int count = strlen(pStr);
for(int i = 0; i < count; i++)
{
if(*(pStr + i) != 32 && !getNoNull)
{
NoNull = i;
getNoNull = true;
} // 数字1-9
if(isdigit(*(pStr + i)) == 0)
{ //负号
if(*(pStr + NoNull) != 45)
{
b = false;
break;
}
} }
//全为数字
if(b)
{
splitLong = atol(pStr);
}
}
delete pStr;
return splitLong;
}
//得到指定项的分解后的字符串内容并转换为浮点数 无法转换时,返回FALSE
bool CSplitStr::GetSplitDouble(int index, double &splitDouble, long bufLen/* = 2056*/)
{ bool b = true;
int NoNull = 0;
bool getNoNull = false;
LPTSTR pStr = new CHAR[bufLen]; if(GetSplitStr(index, pStr,bufLen) > 0)
{
int count = strlen(pStr);
for(int i = 0; i < count; i++)
{
if(*(pStr + i) != 32 && !getNoNull)
{
NoNull = i;
getNoNull = true;
} // 数字1-9
if(isdigit(*(pStr + i)) == 0)
{ //负号 点号
if(*(pStr + NoNull) != 45 && *(pStr + i) != 46 )
{
b = false;
break;
}
} }
//全为数字
if(b)
{
splitDouble = atof(pStr);
}
}
delete pStr;
return b; }
//得到指定项的分解后的字符串内容并转换为浮点数 无法转换时,返回FALSE
DOUBLE CSplitStr::GetSplitDouble(int index)
{
bool b = true;
int NoNull = 0;
bool getNoNull = false;
DOUBLE splitDouble = 0;
LPTSTR pStr = new CHAR[2056]; if(GetSplitStr(index, pStr,2056) > 0)
{
int count = strlen(pStr);
for(int i = 0; i < count; i++)
{
if(*(pStr + i) != 32 && !getNoNull)
{
NoNull = i;
getNoNull = true;
} // 数字1-9
if(isdigit(*(pStr + i)) == 0)
{ //负号 点号
if(*(pStr + NoNull) != 45 && *(pStr + i) != 46 )
{
b = false;
break;
}
} }
//全为数字
if(b)
{
splitDouble = atof(pStr);
}
}
delete pStr;
return splitDouble;
}//////////////