- C语言输入输出相关头文件
- 文件打开函数fopen
- 文件读取函数fread
- 文件写入函数fwrite
- 文件关闭函数fclose
- 字符串拼接函数sprintf
- 文件属性结构体_finddata_t
- 查找文件_findfirst
- 查找下一个文件_findnext
- 关闭文件查找_findclose
- 遍历文件夹中的文件
C语言输入输出相关头文件
stdio.h
:主要包含与控制台、文件有关的输入输出函数,如printf
、scanf
、fwrite
、fopen
、fread
、fclose
等。
stdlib.h
:主要包含系统工具函数等,如内存管理malloc
、calloc
、system
、free
等。
string.h
:主要包含与字符串相关操作的函数,如stelen
、strcpy
等。
io.h
:主要包含与缓冲区相关的读写函数,如write
、open
等。
dir.h
:主要包含对磁盘文件路径进行操作的函数。
iostream
:C++中与输入输出流相关的函数,如cin
、cout
等。
文件打开函数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文件。
本文作者原创,未经许可不得转载,谢谢配合