CFile类的read函数怎么读一个文本文件?(fscanf可以)请看示例,帮小弟分析一下!!

金豆豆老爹 2001-11-27 01:48:27
我自己建了一个文本文件jcy.txt,里面是数据如下:
12 34 56 78 0
但下面这个程序运行是死循环,不知道为啥?
我用debug调试,根本没有把12那些数读进去?
如果说CFile类的read 不能读文本文件,那还有个屁用?
大家都用fopen,fscanf不就得了!!!
void CJcy4View::OnDraw(CDC* pDC)
{
CJcy4Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CFile JcyFile;
int iData;
int isum=0;
int ncount=0;
if(JcyFile.Open("c:\\jcy.txt",CFile::modeRead) ==FALSE)
{
MessageBox("打开文件出错.");
return;
}
do
{
JcyFile.Read((int*)&iData,sizeof(int));
isum+=iData;
ncount++;
}while(iData !=0);
JcyFile.Close();
CString strOutput;
strOutput.Format("%f %d %d",(float)isum/ncount,isum,ncount);
pDC->TextOut(20,20,strOutput);



// TODO: add draw code for native data here
}
...全文
351 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
金豆豆老爹 2001-11-28
  • 打赏
  • 举报
回复
新问题再向大家请教:我随便建了一个项目jcy4.
再CJcy4View的构造函数中添加了如下代码,其实就是把c:\jcy.txt中的整型数据按每行3个
写到c:\jcy1.txt中。
CJcy4View::CJcy4View()
{
ifstream ipfile("c:\\jcy.txt");
int iTemp[100];
int iData;
int ncount=0;
if(!ipfile)
{
cout<<"打开文件出错"<<endl;
return;
}
while(ipfile>>iData)
{
iTemp[ncount]=iData;
ncount++;
}
ofstream opfile("c:\\jcy1.txt");
if(!opfile)
{
cout<<"文件打开出错"<<endl;
}
for(int k=0;k<ncount;k++)
{
opfile<<iTemp[k]<<' ';
if(((k+1)%3==0)&&(k!=(ncount-1)))
opfile<<endl;
}
}


然后在CJcy4View的OnDraw函数中把文件jcy1.txt输出。
void CJcy4View::OnDraw(CDC* pDC)
{
CJcy4Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
FILE* infile=fopen("c:\\jcy1.txt","r");
int iData;
int isum=0;
int ncount=0;
int nrow=0;
CString strOutput;
if(!infile)
{
MessageBox("打开文件出错.");
return;
}
while(!feof(infile))
{
fscanf(infile,"%d",&iData);
isum+=iData;
strOutput.Format("%d %s",iData," ");
pDC->TextOut(50*(ncount % 3),nrow*16,strOutput);
ncount++;if(ncount%3==0) nrow++;
}

fclose(infile);
strOutput=" ";
strOutput.Format("%f %d %d",(float)isum/ncount,isum,ncount);
pDC->TextOut(0,(nrow+1)*16,strOutput);
}

比如说我的jcy.txt中的数据是这样的:
1 3 4 5 6 8
在c:盘生成的jcy1.txt里的数据是对的:
1 3 4
5 6 8
但是把jcy1.txt里的数据输出时却发现是这样的
1 3 4
5 6 8
8
5.00000 35 7
怎么会这样呢?各位大侠可以帮我看看,帮我试试!!!好么?
我调试过,好象问题在哪个while(!feof(infile))上,但它输出jcy.txt却是好的,真不知道为什么?
daphnis 2001-11-27
  • 打赏
  • 举报
回复
你不能指望CFile::Read能从一串二进制文件中识别出数值来,要自己把读进来的缓冲区的内容转换成数值。
xddjd 2001-11-27
  • 打赏
  • 举报
回复
我感觉你这里不能用fread(),因为每次它读进来的长度是一定的,假如你的文件是这样的,你怎么读?比如说是1 23 4456 23我感觉一般fread是用在读二进制文件时比较有效.用我的一个很笨的方法来作你这个问题,程序如下:


#include <iostream>
#include <fstream>

using namespace std;

void main(void)
{

int getint;

ifstream in_file("c:\\abc.txt");
if(!in_file)
{
cerr << " can not find this file\n";
return;
}



int sum = 0;//总值
int beforesum=0;//存一个读进来的整数值
while( !in_file.eof() && !in_file.fail() )
{


getint = in_file.get();

if(getint == 48)//为0就结束循环
break;

//为空格就结束一个整数的读,这里还可以加其他条件,比如说判断
//不为空格就一直读字节
if(getint != 32)

{

getint -= 48;//将字符转换为整数
beforesum = beforesum * 10 +getint;

}
else if(getint == 32)
{
cout << "beforesum: " << beforesum <<endl;
sum += beforesum;
beforesum = 0;

}

}

in_file.close();

cout << "total num is : "<<sum << endl;
}
金豆豆老爹 2001-11-27
  • 打赏
  • 举报
回复
大哥我是读文件,不是读是字符串!!!!!!!!!!!
bfbd 2001-11-27
  • 打赏
  • 举报
回复
char *buffer= new char[100];
JcyFile.Read(buffer,99);
atoi(...)
delete buffer


金豆豆老爹 2001-11-27
  • 打赏
  • 举报
回复
刚才小弟又用ifstream试了一下,也可以,看来就只有CFile类的Read不行了!!!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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