C、C++输入输出操作函数

Apr 6,2017   3702 words   14 min

Tags: C/C++

C语言输入输出相关头文件

stdio.h:主要包含与控制台、文件有关的输入输出函数,如printfscanffwritefopenfreadfclose等。
stdlib.h:主要包含系统工具函数等,如内存管理malloccallocsystemfree等。
string.h:主要包含与字符串相关操作的函数,如stelenstrcpy等。
io.h:主要包含与缓冲区相关的读写函数,如writeopen等。
dir.h:主要包含对磁盘文件路径进行操作的函数。
iostream:C++中与输入输出流相关的函数,如cincout等。

文件打开函数fopen

包含在stdio.h中,指定以mode方式打开path为路径的文件。函数原型如下:

FILE * fopen(const char * path,const char * mode)

参数说明:
path:需要打开的文件路径,如E:\file.txt
mode:文件打开模式,枚举值,包含常见的r——只读模式、rb——只读模式打开二进制文件、rt——只读模式打开文本文件等。
返回值:
文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。

文件读取函数fread

包含在stdio.h中,从一个文件流中读数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回0。函数原型如下:

size_t * fread(void * buffer,size_t size,size_t count,FILE * stream)

参数说明:
buffer:用于接受数据的内存地址,如数组名等。
size:每次读取的数据项的字节数,单位是bit。
count:要读count个数据项,每个数据项size个字节。
stream:文件类型的输入流,fopen的返回值可作为本参数。
返回值:
返回真实写入的项数,若大于count则意味着产生了错误。另外,产生错误后,文件位置指示器是无法确定的。若其他stream或buffer为空指针,或在unicode模式中写入的字节数为奇数,此函数设置errno为EINVAL以及返回0。

文件写入函数fwrite

包含在stdio.h中,用于向文件写入一个数据块。原型为:

size_t fwrite(const void * buffer,size_t size,size_t count,FILE * stream)

参数说明:
buffer:一个指针,也即要获取数据的地址。
size:要写入内容的字节数。
count:要进行写入size字节的数据项的个数。
stream:目标文件指针。
返回值:
返回实际写入的数据项个数count。写入到文件的哪里? 这个与文件的打开模式有关,如果是w+,则是从file pointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;如果是a+,则从文件的末尾开始添加,文件长度加大。

文件关闭函数fclose

包含在stdio.h中,用于关闭已经打开的文件。原型为:

int fclose(FILE * fp)

参数说明:
fp:FILE类型的文件指针。
返回值:
如果流成功关闭,fclose 返回 0,否则返回EOF(-1)。(如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF。)

字符串拼接函数sprintf

包含在stdio.h中,字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。原型是:

int sprintf(char * buffer,const char * format,[argument]...)

参数说明:
buffer:char类型的指针,指向将要写入的字符串的缓冲区,如char类型的数组名。
format:格式化字符串表达。
argument:可选参数,可以是任何类型的数据。
返回值:
返回写入buffer的字节数,出错返回-1,结束字符\0不计入内。若buffer或format是空指针,则不出错,但返回-1,并且errno被设置为EINVAL。

文件属性结构体_finddata_t

位于io.h中,是一个结构体,用于存储文件各种信息。定义代码如下:

struct _finddata64i32_t {
	unsigned    attrib;
	__time64_t  time_create;    /* -1 for FAT file systems */
	__time64_t  time_access;    /* -1 for FAT file systems */
	__time64_t  time_write;
	_fsize_t    size;
	char        name[260];
};

attrib:文件属性的存储位置。主要有如下:_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。
time_create:文件创建时间。
time _access:文件最后一次被访问的时间。
time_write:文件最后一次被修改的时间。
size:文件的大小。
name:文件的文件名。这里的_MAX_FNAME是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。

查找文件_findfirst

包含在io.h中,用于查找指定名称的文件。函数原型为:

long _findfirst(char * filespec, struct _finddata_t * fileinfo)

参数说明:
filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。
fileinfo:这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体中。
返回值:
如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。

查找下一个文件_findnext

包含在io.h中,搜索与_findfirst函数提供的文件名称匹配的下一个实例,若成功则返回0,否则返回-1。原型:

int _findnext(long handle,struct _finddata_t * fileinfo)

参数说明:
handle:即由_findfirst函数返回回来的句柄。
fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。

关闭文件查找_findclose

包含在io.h中,用于关闭当前查找文件。原型为:

int _findclose(long handle)

参数说明:
handle:_findfirst函数返回回来的句柄。
返回值:
成功返回0,失败返回-1。

遍历文件夹中的文件

先用_findfirst查找第一个文件,若成功则用返回的句柄调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。下面这段代码演示了遍历文件的过程。

#include<io.h>
#include<stdlib.h>
#include<stdio.h>

void main()
{
	//遍历Music下面所有.mp3文件
	//需要注意的是,反斜杠需要转义,“\\”才能表示“\”,否则文件路径识别错误。
	char cSearch[1024];
	sprintf(cSearch, "E:\\Music\\*.mp3");
	//文件信息的结构体 
	_finddata_t fileInfo;
	//用于查找的句柄
	//第一次查找
	long handle = _findfirst(cSearch, &fileInfo);
	if (handle == -1L)
	{
		printf("Failed to find files!\n");
		return;
		system("pause");
	}
	//循环查找其它符合的文件,直到找不到其它的为止 
	do
	{
		printf("%s\n", fileInfo.name);
	} while (_findnext(handle, &fileInfo) == 0);
	//别忘了关闭句柄
	_findclose(handle);
	system("pause");
}

运行的结果如下图所示,可以看到完整遍历出了mp3文件。
result

本文作者原创,未经许可不得转载,谢谢配合

返回顶部