C语言和mfc按格式读取文件数据

fscanf()函数的功能是从文件中按格式读取一个或多个数据;

例如文件中有一行数据,

22 3.34 hello

则使用 fscanf(fp, "%d%f%s", &a, &f, str) 可一次读取整型、浮点、字符串三个数据;

此函数位于C标准库头文件<stdio.h>中;

示例;

测试文件如下;

代码;

cpp 复制代码
void CFiletest1View::OnDraw(CDC* pDC)
{
	CFiletest1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	int a = 0;
	float f = 0;
	char str[100] = "";
	CString str1;
	int d=0;
	float f2=0;
 
	FILE* fp = fopen("test1.txt", "r");
	for(int i=0; i<3; i++)
	{
        fscanf(fp, "%d%f%s", &a, &f, str);
		str1.Format("%d,%f,%s", a, f, str);
		pDC->TextOut(50, 50 + i*20, str1);
		d += a;    
		f2 += f;
    }
	str1.Format("整数和:%d", d);
	pDC->TextOut(50, 115, str1);
	str1.Format("浮点数和:%f", f2);
	pDC->TextOut(50, 135, str1);
	fclose(fp);
}

运行如下;

在MFC中常常使用的是CStdioFile类;能否仍然可以使用fscanf()函数呢?

首先看一下,使用CStdioFile类打开文件后,返回的是BOOL类型,而fscanf需要一个FILE*类型;如果用C标准库函数fopen打开文件,返回的就是FILE*类型;

查一下MFC文档;

CStdioFile类有一个成员m_pStream,

CStdioFile::m_pStream

m_pStream数据成员是指向一个打开文件的指针,该文件是由C运行时函数fopen返回的。如果文件从来没有被打开过或者已经被关闭了,则它是NULL。

从文档说明这个m_pStream就是C标准库函数fopen打开文件后的返回值;

那么改为如下的代码看一下;

cpp 复制代码
void CFiletest1View::OnDraw(CDC* pDC)
{
	CFiletest1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	int a = 0;
	float f = 0;
	char str[100] = "";
	CString str1;
	int d=0;
	float f2=0;
 
	CStdioFile file;
	file.Open("test1.txt", CFile::modeRead);

	for(int i=0; i<3; i++)
	{
      
      //根据字符类型读取txt文件中的数据
		fscanf(file.m_pStream, "%d%f%s", &a, &f, str);
		str1.Format("%d,%f,%s", a, f, str);
		pDC->TextOut(50, 50 + i*20, str1);
		d += a;    
		f2 += f;
    }
	str1.Format("整数和:%d", d);
	pDC->TextOut(50, 115, str1);
	str1.Format("浮点数和:%f", f2);
	pDC->TextOut(50, 135, str1);
	file.Close();
}

运行一下;没有问题,一样的;

相关推荐
码不停蹄的玄黓19 小时前
JDK 自带四大命令行工具:jstat、jstack、jmap、jhat 详解
java·开发语言
ch.ju19 小时前
Java程序设计(第3版)第四章——set方法为属性赋值
java·开发语言
创业之路&下一个五年19 小时前
JS编程范式 \& 面向对象范式
开发语言·前端·javascript
代码中介商19 小时前
C++11移动语义:右值引用与高效资源转移
开发语言·c++
悠仁さん19 小时前
list 链式表基本功能模拟实现(双向有头指针循环链表)
c语言·数据结构·链表·list
Hello:CodeWorld19 小时前
深入浅出 C++:静态多态与动态多态的业务应用场景与源码级实战
开发语言·c++·架构
星恒随风19 小时前
C++入门(一):第一个 C++ 程序、命名空间、输入输出和缺省参数
开发语言·c++·笔记·学习
AI人工智能+电脑小能手19 小时前
【大白话说Java面试题 第94题】【Mysql篇】第24题:什么是单路排序?什么是双路排序??
java·开发语言·数据库·mysql·面试·排序算法
于先生吖19 小时前
Java分账体系设计,网约车行程计费与到店线下结账一体化后端开发实战
java·开发语言
Cloud_Shy61819 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第三章 Item 17 - 20)
开发语言·笔记·python