假设文件17.txt中按顺序存放了数个int 数据,数据的个数求知,只知道该int数据的最后一个的值为0。编写程序,统计17.txt文件中数据的个数,并求出这些数的总和和平均值。(其中我在E盘建立了一个txt文件"17.txt")编写以下代码,编译时能看到生成的exe文件,但就停在exe界面了,看不到最终结果。不知什么原因,请高手帮忙!void CMy002View::OnDraw(CDC* pDC)
{
CMy002Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CFile MyFile;
int iData;
int iSum=0;
int nCount=0;
if(MyFile.Open ("E:\\17.txt", CFile::modeRead)==FALSE)
{
 MessageBox("File not open!");
 return;
}
do
{
MyFile.Read ((void*)&iData,sizeof(int));
iSum+=iData;
nCount++;
}while(iData!=0);
         MyFile.Close ();
CString strOutput;
strOutput.Format ("%f %d %d",(float)iSum/nCount,iSum,nCount);
pDC->TextOut (0,0,strOutput);
}

解决方案 »

  1.   

    你不要用数值来判断文件是否读完,而应该用Read返回值是否是零判断
    while(MyFile.Read ((void*)&iData,sizeof(int))!=0)
    {
             iSum+=iData;
    nCount++;
    }
    你一步一步跟踪一下会找到问题的
      

  2.   

    手工建立的文本文件?只怕不能这样读,必须是二制进文件。
    应该是while(iData!=0)这个终止条件永远不成立导致死循环
      

  3.   

    改成:
      while(MyFile.Read ((void*)&iData,sizeof(int))!=0)
    {
             iSum+=iData;
    nCount++;
    }
    后还是不对呀,麻烦你们亲自试一下,这个问题已经几天没解决了,多谢了!
      

  4.   

    如果是文本文件的话你应该读出根据结束条件(比如回车或空格)字符串而不是数字,然后再通过atoi转换成数字
    char ch;
    string str=""
    while(MyFile.Read ((void*)&ch,sizeof(char))!=0)
    {
    if(ch==''||ch==0x0d||ch==0x0a)
    {
    nCount++;
    iSum+=atoi((LPCTSTR)str);
    str=="";
    }else
    {
    str+=ch;
    }
    }
      

  5.   

    刚才代码可能会有问题
    char ch;
    string str=""
    while(MyFile.Read ((void*)&ch,sizeof(char))!=0)
    {
    if(ch==' '||ch==0x0d||ch==0x0a)
    {
    if(str!="")
    {
    nCount++;
    iSum+=atoi((LPCTSTR)str);
    str=="";
    }
    }else
    {
    str+=ch;
    }
    }
      

  6.   

    赫赫,还有string str=""
    改成
    CString str="";
      

  7.   

    这样读文件陷入死循环,应该读入字符串,然后转化成int:atoi()
      

  8.   

    在你的17.txt中,文件接受是怎么样的,只有你用循环把一个个int型的数写入文件才能用循环这样读出来,如果是你手工添加的当然读不出来了。
      

  9.   

    在你的17.txt中,文件接受是怎么样的,只有你用循环把一个个int型的数写入文件才能用循环这样读出来,如果是你手工添加的当然读不出来了。
      

  10.   

    谢谢大家:
       前几天我将它做了出来。CFile MyFile;
    CString strOutput;
    char ch=0;
    int iSum=0;
    int nCount=0; MyFile.Open ("17.txt",CFile::modeRead);
    while(MyFile.Read((void*)&ch,1)!=0)
    {
    if(ch!=0x0d)
    {
    if(ch!=32)
    {
    strOutput+=ch;
    }
    else if(ch==32)
    {  
    if(atoi(strOutput)!=0)
    {
    iSum+=atoi(strOutput);
        nCount++;
        strOutput=" ";
    }
    }
       
    }
    else
    {
       if(strOutput!=" ")
       {
       iSum+=atoi(strOutput);
       nCount++;
       strOutput=" ";
       }
       MyFile.Read ((void*)&ch,1); 
       if(ch!=0x0a)
       {
       MessageBox("文件格式错误!");
       MyFile.Close();
       return;
       }   
    }
    }
    MyFile.Close ();
    strOutput.Format ("ly=%d f=%f s=%d n=%d",nCount*17,(float)iSum/nCount,iSum,nCount);
    pDC->TextOut (0,0,strOutput);真的好感谢!