今天主要看看文件练习相关的函数
简单的看了一下C的文件操作函数:
1.打开文件
FILE *fopen(const char *filename,const char *mode)
解释:这是c提供的一个文件操作函数,若打开成功,则返回一个指向该文件的指针(注意不是句柄,从这也可看出指针跟句柄的区别),mode常用取值列表如下
文件打开方式 | 含义 |
"w"(只写) | 为输出打开一个文本文件 |
"r"(只读) | 为输入打开一个文本文件 |
"a"(追加) | 追加内容 |
"w+"(读/写) | 为读/写建立一个新文本文件 |
"r+"(读/写) | 为读/写打开一个文本文件 |
"a+"(读/写) | 为读/写打开一个文本文件 |
2。关闭文件
int fclose(FILOE *fp);
3.读文件
int fgetc(FILE *fp) //从打开的文件中读取一个字符,指针后移一位
size_t fread(VOID *buffer,size_t size,size_t count,FILE *fp)
解释:buffer是指向数据存放缓冲区的指针,size是单个字符的字节数,count是一次读取多少个size的数据.若函数执行成功,则返回实际读取的字符数。
4.写文件
int fputc(FILE *fp);
size_t fwrite(VOID *buffer,size_t size,size_t count,FILE *fp) ;//跟读文件是一样的,这里就不记了。
另外有一个非常常用的函数,fprintf函数,其原型是
int fprintf(FILE *fp,const char *format[,argument].....);
在这里举个实例便于理解:
char buffer[]="world"; //定义并赋值一个字符串
FILE fp; //定义一个文件指针
if(fp=fopen("c:\test.txt","a")==NULL) //打开文件test.txt,并判断操作是否成功
exit(0); //若失败,则退出
fprintf(fp,"hello %s",buffer); //把hello和字符串buffer中的内容追加入文件test.txt
5.指针定位
由于这类函数用的比较少,这里只简单记一下函数名及其功能
void rewind(FILE *fp);//指针返回文件开始
int fseek(FILE *fp,long offset,int origin);//指针定位到指定位置
long ftell(FILE *fp);//返回文件指针相对于文件开头的位置
以上介绍的都是c提供的对文件的操作函数,其实windows提供了一些功能更强大的API函数供开发人员使用,虽说微软推荐使用API函数来处理文件,但个人还是不太习惯,主要是参数过多,很多功能用不到,所谓杀鸡焉用宰牛刀,所以只有在迫不得已的时候才使用API,下面介绍几个常用的:
BOOL DeleteFile(LPCTSTR lpFileName); //删除文件,lpFileName为完整文件名
创建目录函数CreateDirectory;其原型如下,第二个参数为目录的安全性设置,通常为NULL
BOOL CreateDirectory(
LPCTSTR lpPathName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
);
文件的复制和重命名可以用CopyFile()函数实现,其源代码如下:
BOOL CopyFile(
LPCTSTR SrcFileName, //完整源文件名
LPCTSTR DesFileName, //完整目标文件名
BOOL bFailIfExits;
)
文件和目录的移动都可以用RemoveFlie()实现,并且当移动目录时会强制移动目录下的所有文件和子目录,
BOOL MoveFile(
LPCTSTR SrcFileName, //源路径
LPCTSTR DesFileName, //目标路径
)
最后介绍两个有关文件属性相关的函数
DWORD GetFileAttributes(LPCTSTR lpFileName);
该函数若执行成功,则返回文件的属性,否则返回0xFFFFFFFF.
BOOL SetFileAttributes(
LPCTSTR lpFileName,
DWORD dwFileAttributes
);
该函数设置文件属性,第二个参数取值范围如下:
dwFileAttributes取值 | 含义解释 |
FILE_ATTRIBUTES_ARCHIVE | 存档文件 |
FILE_ATTRIBUTES_COMPRESSED | 压缩文件 |
FILE_ATTRIBUTES_DERECTORY | 文件夹 |
FILE_ATTRIBUTES_ENCRYPTED | 加密文件 |
FILE_ATTRIBUTES_HIDDEN | 隐藏文件 |
FILE_ATTRIBUTES_NORMAL | 正常 |
FILE_ATTRIBUTES_OFFLINE | 脱机文件 |
FILE_ATTRIBUTES_READONLY | 只读文件 |
FILE_ATTRIBUTES_SYSTEM | 系统属性 |
FILE_ATTRIBUTES_TEMPORARY | 临时属性 |
至此,对于文件的操作已经都不是问题了,现在尝试编写一个小应用,实现批量重命名功能.
步骤:1. 用GetModuleFile()函数获取程序所在目录filepath
2 . .获取目录下所有符合条件的文件名,并将这些文件名存在一个集合(set)中,涉及到的函数有_FindFrist(), _FindNext(); _FindClose(),这些函数都包含在<io.h>头文件中。后面会详细介绍一下这些函数
3.循环实现文件重命名,CopyFile();
4.很重要的一步,CopyFile()函数之后记得删除原来的文件DeleteFile();
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
返回值:如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。
参数:
filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。
fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体中。
int _findnext( long handle, struct _finddata_t *fileinfo );
返回值:若成功返回0,否则返回-1。
参数:
handle:即由_findfirst函数返回回来的句柄。
fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。
int _findclose( long handle );
返回值:成功返回0,失败返回-1。
参数:
handle :_findfirst函数返回回来的句柄。
_finddata_t结构体定义如下::
struct _finddata_t {
};
time_t,其实就是long
而_fsize_t,就是unsigned long
现在来解释一下结构体的数据成员吧。
attrib,就是所查找文件的属性:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
time_create、time_access和time_write分别是创建文件的时间、最后一次访问文件的时间和文件最后被修改的时间。
size:文件大小
name:文件名。