hur.cn - 华软网

 热门搜索

如何读取TXT一行数据?急急

  作者:未知    来源:网络    更新时间:2011/9/16
现在有个txt文件里面有5行数据,第一行数字用来确定行列数,数据的每行列数不一定,我想把它读写到MSFlexGrid相应的单元格里面去,请问如何操作,谢谢!


举个例子,比如test.txt文件如下:
4 5
1 32 33
8 22
3 12 44
2 11 33 33 33

--------------------------------------------------------
这是我原来的代码,发现读进去格式跟txt文档原来格式不一致。

FilePathName = dlg.GetPathName();
//对文件进行读操作 
char buffer[256];

ifstream ReadFile (FilePathName);
if (ReadFile.is_open())
{
   long numRows ,numCols;
ReadFile>>buffer;
numRows =atol(buffer)+1;//行数
ReadFile>>buffer;
numCols =atol(buffer);//列数

m_MyGrid.SetRows(numRows);
m_MyGrid.SetCols(numCols);

long i = 1, j;
while(i<numRows)
{
j = 0;
while(j<numCols)
{
ReadFile>>buffer;
m_MyGrid.SetTextMatrix(i,j,buffer);
j++;
}
i++;
};
ReadFile.close();

我不会修改,请高手门帮忙修改一下,谢谢!!
---华软 网友回答---
CStdioFile file;
file.Open(...,...);
CString strLine(_T(""));
CString strText(_T(""));
while(file.ReadString(strLine))
{
在这里对strLine进行分解。

}
---华软网友回复---
具体怎么分解呢?也就是说 读取一行了,然后把它每一列的数据分解开?
---华软网友回复---
具体分解就是你的事了,因为你的列数不是固定,你要根据空格符确定当前行有几个列
你用ifstream的getline方法也可以实现的
你想方便的话,直接将一行读到一个stringstream里,然后再通过stringstream读取到每个字符串
---华软网友回复---
这个应该在写的时候就要订好的规则吧
---华软网友回复---
引用 2 楼 qiuyoyo 的回复:
具体怎么分解呢?也就是说 读取一行了,然后把它每一列的数据分解开?

查找空格符把数据一个个断开就是了
---华软网友回复---
读出一行数据后,以空格为分隔符,用strtok读取每个字串就行了。

C++">
do
{
  p = strtok(strline," ");
  //然后把P写入你的控件
  
}while(p=strtok(NULL," ") != NULL)


---华软网友回复---
C++">CStdioFile 

C++">// crt_strtok.c
/* In this program, a loop uses strtok
 * to print all the tokens (separated by commas
 * or blanks) in the string named "string".
 */

#include <string.h>
#include <stdio.h>

char string[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[]   = " ,\t\n";
char *token;

int main( void )
{
   printf( "Tokens:\n" );
   /* Establish string and get the first token: */
   token = strtok( string, seps );
   while( token != NULL )
   {
      /* While there are tokens in "string" */
      printf( " %s\n", token );
      /* Get next token: */
      token = strtok( NULL, seps );
   }
}

---华软网友回复---
fgets行读进来。

---华软网友回复---
引用 8 楼 jennyvenus 的回复:
fgets行读进来。


fgets是可以直接读取一行的,其实我建议你写入的时候自动在数据间添加一个分隔符
例如:1|32|56
这样读出来分割的时候就容易的多!
---华软网友回复---
我一般都是这么读,先读每行,再读每行中的每一个数据
void CDataHandleFileView::OnReadData()
{
//建立打开文件对话框并获得文件路径
CString szFilePathName;
        CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrFilter =  _T("文本文件 (*.txt)\0*.txt\0");
if (fileDlg.DoModal() == IDOK)
szFilePathName=fileDlg.GetPathName();

//读取数据
CFile fp;
CFileException fe;
    CString szBuffer = _T("");
CString szSplitFlag = _T(" ");
 
    if(!szFilePathName.GetLength())  return;
if(!fp.Open(szFilePathName,CFile::modeRead,&fe))  return;
CArchive arLoad(&fp,CArchive::load);
try //异常处理
{
// 清空操作
if(m_PointArray.GetCount() > 0)
m_PointArray.RemoveAll();

while(arLoad.ReadString(szBuffer)!=NULL) // 处理数据
{
//对szBuffer进行处理
szBuffer = szBuffer.Trim(_T(" "));
m_fPoint = new CXYPoint;
CString str;
strArray.RemoveAll();
for(int i=0;i<=strArray.GetUpperBound();i++)
{
m_fPoint->m_xicolumn[i]=atof(strArray.GetAt(i));
m_fPoint->fNum[i]=atof(strArray.GetAt(i));
}

m_PointArray.Add(* m_fPoint);
    delete m_fPoint;
}

}
catch (CFileException ex) 
{
TCHAR szError[1024];
ex.GetErrorMessage(szError, 1024);
_tprintf(_T("不能打开文本文件: %1024s"), szError);
}
fp.Close();
Invalidate();

}
---华软网友回复---
读一行,按空格分解;
或者你写文件的时候就在每个数据后面加个逗号,那逗号就是你的标志,按标志去数据
---华软网友回复---
用1楼的方法就行了的,楼主的TXT文件第1行就不要了,关键是要根据你定义的分隔符来执行填充就完成了。
---华软网友回复---
置于分割你可以用Find()
例如:
int IPos = 0;//记录上一次|出现的位置
CString strResult;
for (int i = 0;i < str.GetLength();i++)
{
int iIndex = str.Find("|",i);
if (iIndex != -1)
{
strResult = str.Left(iIndex);
strResult = strResult.Mid(i);
IPos = iIndex;
i = iIndex;
}
}
str是你读取出来的字符串。
---华软网友回复---
fscanf()
---华软网友回复---
读取一行出来后,放到CString里 根据空格自己切割出每一列,很容易的。就是FIND、LEFT 、RIGHT这几个方法
---华软网友回复---
CStdioFile::ReadString
说明:
此成员函数用来从与CStdioFile对象关联的文件中将文本数据读入一个缓冲区,读取的字符数不超过nMax-1。在碰到第一个换行符时停止读取。在这种情况下,如果读取的字符数小于nMax-1,则将一个换行符保存在缓冲区中。在任何情况下,都在最后添加一个空字符(“0”)。
对于文本方式的输入,CFile::Read也是可用的,但它不会在一个回车换行符处停止。

---华软网友回复---
1.使用CStdioFile来读文件,
ReadString(strline)读取文件一行//读取的一行存在strline中
2.网上找段字符串分割函数
将strline以“ ”分割得到strArry//strArray为分割后的字符串数组
3.strArray.GetSize()得到数组长度,直接使用strArray[i]操作数组元素
4.over



---华软网友回复---
http://topic.csdn.net/u/20090705/12/c5d3e1d5-40d6-4969-8933-f0e635021122.html中有分割字符串的方法
---华软网友回复---
引用 3 楼 sky101010ws 的回复:
具体分解就是你的事了,因为你的列数不是固定,你要根据空格符确定当前行有几个列
你用ifstream的getline方法也可以实现的
你想方便的话,直接将一行读到一个stringstream里,然后再通过stringstream读取到每个字符串

如果你是MFC程序的话 可以使用CStdioFile的Readstring也能实现      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。