高手都请进,帮我看看代码,小弟看不懂,太深奥了,谢谢!

hongkong000 2007-05-03 04:58:08
从dat文件里读取数据,插入到一个表格里,遇到\t就跳到下一列的表格,遇到\n就跳到下一行的表格.遇到\0读取结束.
下面是程序代码:
BOOL CGridCtrl::Load(LPCTSTR filename)
{
TCHAR *token, *end;
TCHAR buffer[1024];
CStdioFile File;
CFileException ex;

if (!File.Open(filename, CFile::modeRead | CFile::typeText))
{
ex.ReportError();
return FALSE;
}

DeleteAllItems();

TRY {

// Read Header off file
File.ReadString(buffer, 1024);

// Get first token
for (token=buffer, end=buffer;
*end && (*end != _T('\t')) && (*end != _T('\n')); end++);

if ((*end == _T('\0')) && (token == end))
token = NULL;

*end = _T('\0');

while (token)
{
InsertColumn(token);

// Get next token
for (token=++end; *end && (*end != _T('\t')) && (*end != _T('\n'));
end++);
if ((*end == _T('\0')) && (token == end)) token = NULL;
*end = _T('\0');
}

// Read in rest of data
int nItem = 0;
while (File.ReadString(buffer, 1024))
{

// Get first token
for (token=buffer, end=buffer;
*end && (*end != _T('\t')) && (*end != _T('\n')); end++);

if ((*end == _T('\0')) && (token == end)) token = NULL;
*end = _T('\0');

int nSubItem = 0;
while (token)
{

if (!nSubItem)
InsertRow(token);
else
SetItemText(nItem, nSubItem, token);

// Get next token
for (token=++end; *end && (*end != _T('\t')) && (*end != _T('\n'));
end++);
if ((*end == _T('\0')) && (token == end)) token = NULL;
*end = _T('\0');

nSubItem++;
}
nItem++;
}

AutoSizeColumns();
File.Close();
}

CATCH (CFileException, e) {
AfxMessageBox(_T("Unable to load grid data"));
e->Delete();
return FALSE;
}
END_CATCH

return TRUE;
}
谢谢!如过看懂了帮我加写注释1,非常感谢!!!
读取文件如:
FORWARD
1
64
2
1 10000 23.12
2 10000 21.32
2 10000 32.36
....
注:从FORWARD到2照程序里看好像是表头.控制插入列数,行数,但我就看不懂!高手快帮忙啊,不甚感激!
...全文
375 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
charloco 2007-10-13
  • 打赏
  • 举报
回复
读取表头和每一行的基本原理是一样的。
File.ReadString(buffer, 1024)从文件中读取一行,这一行的末尾一定是\n。
下面就是填表头或者是每一列的内容了。
if((*end==_T("\0"))&&(token==end))
token= NULL;
就会跳出while循环,如果是读表头的话,就会继续往下开始读每一行的数据。
就是重新读一行的内容,插入该行的每一列中去的。知道文件读取完毕。
但是看这里:
for (token=++end; *end && (*end != _T( "\t ")) && (*end != _T( "\n "));
end++);
如果我读到了\n字符。处理方式好像是和\t一样的啊,没有单独的拿出来处理。
举个例子:我刚好读到\n字符,之前一直没有读取\0字符,
if((*end==_T("\0"))&&(token==end))
token= NULL;
这个就不会被选择,那么token就不会是NULL,循环继续,会从\n的下一个字符开始读取,(*end==\n),那我下次循环
就会从end+1开始了。因为token=++end;可能会导致缓冲区溢出。
Allen_zhang 2007-10-12
  • 打赏
  • 举报
回复
当token不等于NULL的时候就调InsertColumn(token)插入字符串

为什么它调用的函数是带三个参数的,它只有一个参数怎么调用啊? // 这句什么意思呢?不懂
for(token=buffer, end=buffer; *end && (*end!=_T("\t"))&&(*end!=_T("\n")); end++);
// 上面这一句就将token赋值了。token是指向buffer的指针

if((*end==_T("\0"))&&(token==end)) // 当读到\0的时候将token置空,这样下面的while循环就不会执行了
token= NULL;

*end = _T( "\0 ");

while(token)
{
InsertColumn(token); // 将这个字符串插入,如果你上面指的是这个函数本来要带三个参数
// 这里为什么只带一个参数的话,是因为他有另外的两个参数是有默认值的
……
}


hongkong000 2007-05-12
  • 打赏
  • 举报
回复
这里: while (token)
{
InsertColumn(token);

这里的while(token)是什么意思啊?
还有下面括号里面的token又是什么意思啊/?为什么运行的结果是插入了一串字符,但token是个指针.还有,为什么它调用的函数是带三个参数的,它只有一个参数怎么调用啊?
不想低调 2007-05-03
  • 打赏
  • 举报
回复
建议:你那里看不懂,再问?

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧