目录
2.对一些有规范格式文件的读取,可使用标准库stdio.h下的fscanf_s函数。
- 在C程序中:
与程序代码外的数据(文件)打交道,我们使用到流(stream)这个概念,实现进程的虚拟内存与文件之间的数据交换。
——文件流:C标准库提供了FILE(之所以命名为FILE,因为linux将所有机制都视为文件) ,FILE对象是一个包含了管理流所需的所有信息的结构,包括缓冲区信息、各种标记(如文件结束标记和错误标记)以及用于实际I/O的文 件描述符等。
——输入流,输入流:数据从文件传送到内存的叫输入流,数据从内存传送到文件的叫输出流。
——打开文件:FILE对象通过调用fopen函数创建的。如: FILE *fp, fp=fopen("filename","r"), 表示以只读的方式建立与filename相关的文件流;filename为当前目录下的相对路径名,r代表可读(打开文件的模式)。
1.这里采用fopen_s()函数打开文件。
函数结构:
errno_t fopen_s(
FILE** pFile,
const char *filename,
const char *mode
);
参数:
-
[out] pFile
A pointer to the file pointer that will receive the pointer to the opened file——指向文件指针的指针,文件指针将接收指向已打开文件的指针。 -
[in] filename
Filename—— 文件名 -
[in] mode
Type of access permitted——允许的访问类型
2.对一些有规范格式文件的读取,可使用标准库stdio.h下的fscanf_s函数。
函数原型为:
int fscanf_s(
FILE *stream,
const char *format [,
argument ]...
);
参数:
-
stream
Pointer to FILE structure——指向文件结构的指针。 -
format
Format-control string——窗体控件字符串。 -
argument
Optional arguments——可选参数。 -
locale
The locale to use——要使用的区域设置。
3.如读取文件data.txt(数据格式相对规范)
0.211487 1.22498 2.211 3.21899 4.21051 5.21576 6.21826 7.21802 8.21777 9.26147
代码实现读取:
#include <stdio.h>
#include "GlobalVarDefine.h"
FILE *stream;
void readJiaoDu()
{
int i;
float Jiaodu, AziumJiaoDu[10];
//1:创建文件流,返回值=fopen_s(指向文件指针的指针,文件名,使用文件方式)打开失败则返回NULL;
errno_t err;
err = fopen_s(&stream, "H:\\data.txt", "r"); //以data.txt文件为例
//2:检测文件是否打开成功;
if (err != 0) { //文件读取成功,则返回0
printf("文件打开失败!\n");
}
else {
printf("文件打开成功!\n");
}
//3
//抽象理解:
//理解文件位置含义:其表示已打开文件当前可读写字符的位置,其表示为一个到文件头的整数;
//fscanf在读取数据时可以这样理解:文件被打开后,它就成了一个无序字节流(水流),其会通过一个管道,流向被读取的一端;
//了解fscanf后知道,其遇到空格字符(空格,制表符),换行符,就会停止,这里的停止我们可以理解为:
//停下来为文件中两个不相关的数据块做一个分隔的操作,刚好适应了我们一般将空字符(包括换行符)作为两个数据之间的分隔的行为;
//我们只需理解管道的两端
//流进管道的一端的位置,就是文件的位置,表示已被读到的位置。
//流出管道一端,就是进程用来读取数据的一端,其可以对管道中已经做区分的数据进行读取。
//4:读取:
for (i = 0; i < 10; i++) {
fscanf_s(stream, "%f", &Jiaodu); //fscanf_s对流的格式化读取。
AziumJiaoDu[i] = Jiaodu;
}
printf("%f\n", AziumJiaoDu[0]); // Output data read:
// Close stream if it is not NULL
if (stream)
{
err = fclose(stream);
if (err == 0)
{
printf("The file was closed\n");
}
else
{
printf("The file was not closed\n");
}
}
// All other files are closed:
int numclosed = _fcloseall();
printf("Number of files closed by _fcloseall: %u\n", numclosed);
}
程序运行结果:
文件打开成功!
0.211487
The file was closed
Number of files closed by _fcloseall: 0
出现上述结果,则表明数据读取成功!