1.fopen
fopen是常见的一个文件操作函数,用来打开文件:
FILE *fopen( const char *filename, const char *mode );
我们从函数的声明上可以看的出来函数的第一参数是字符串常量的一个文件名字,第二个参数是文件的打开模式,就是我们要以某种方式来访问这个文件。打开文件成功之后,返回一个函数流指针FILE*的这样一个指针类型,如果打开文件失败,返回NULL,关于第二个参数,我们来看一下常见的一些参数:
mode |
access |
"r" |
以只读的方式打开文件,也就是不能修改文件中的内容,文件必须存在,如果不存在,打开失败 |
"w" |
打开一个空文件进行写入,注意,如果文件存在,那么其中的内容就会被清空 |
"a" |
在原文件末尾写入文件内容,如果该文件不存在,那么就会创建这个文件 |
"r+" |
以读写方式打开文件,文件必须存在,如果不存在,打开失败 |
"w+" |
以读写方式打开文件,如果文件中本来有内容,则会被清空 |
"a+" |
可以读取文件以及在文件末尾附加,如果文件不存在,则创建新文件 |
"t" |
以文本方式打开文件 |
"b" |
以二进制形式打开文件 |
代码示例:
FILE* File = NULL;// 文件流指针 初始化为NULL File = fopen("User.txt", "r");//以只读方式打开文件,并且文件必须存在 if (File == NULL) { printf("User数据文件不存在:\n"); return -1; }
2.fread
fopen结束之后,正常情况下我们可以得到一个文件流指针,那么我们需要对这个指针指向的数据进行读操作的时候,就会用到fread函数,这个函数的主要功能就是从一个流中读取数据。
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
我们可以看到四个参数,第一个参数是需要把读出来数据保存到我们的数据缓冲区中去,这个缓冲区我们自己申请内存或者声明字符数组,第二个参数是按照多大来读取,这里设置的是按照1个字节来读取,第三个参数是我们读取的最大数目,比如我们的第二参数是1个字节,第三参数是8次,那就是读8个字节,如果第二参数是2个字节,那就是最大读取16个字节,第四个参数是我们之前获得的文件流指针。返返回值是一个size_t类型的数据,告诉我们读了的次数,可能小于等于第三参数count。看一个使用的举例:
char Signature[8] = { 0 }; fseek(fh, 0, SEEK_SET); int NumberRead = fread(Signature, sizeof(char), 8, fh);
3.fseek
fseek是要将文件指针移动到我们指定的位置上去,因为我们在使用文件指针进行读取操作时候,会造成文件指针的移动,这时候比如我们要去再次读取文件开头的内容,那么文件指针已经移动,我们该如何读取呢,使用fseek将指针移动到我们想让它去到的地方。
int fseek( FILE *stream, long offset, int origin );
这个函数声明我们可以看到第一个参数是文件流指针,第二个参数是起始字节数,也就是说我们要第三参数origin的相对字节偏移,第三个参数是定位到的初始位置。对于第三参数,有以下三种可能:
origin vale |
意义 |
SEEK_CUR |
文件指针的当前位置 |
SEEK_END |
文件末尾 |
SEEK_SET |
文件开始 |
下面来看一个简单的例子:
fseek(File, 0, SEEK_SET);//重置文件指针到初始位置
4.fclose
fclose是用来关闭打开的一个文件流指针,我们对文件操作完毕之后,一定要记得关闭当前的文件流指针,否则可能在后续对该文件再进行操作的时候出现一些错误。
int fclose( FILE *stream );
这个函数看起来很简单的,它就是传入需要关闭的文件流指针,然后关闭成功之后,会返回0。
使用就很简单:
fclose(File);
5.feof
feof这个函数是用来测试一个流指针是否已经到了文件的末尾,我们有时候需要遍历文件中所有内容时候,就可以用这个函数来进行判断:
int feof( FILE *stream );
这个函数的参数和fclose是一样的,都只需要传入一个文件流指针来进行判断就ok了。如果读取操作试图读取超过文件末尾的内容,则feof函数返回一个非零值;否则返回0。
while (!feof(File))//判断是否读到文件结尾 { //做一些操作 }
如果一个文件包含39个字节,而您从文件中读取了39个字节,那么feof将返回0,因为即使文件指针位于文件的末尾,您也没有尝试读取超过末尾的内容。只有当你尝试读取第40个字节时,才会返回一个非零值。
6.fscanf
fscanf和scanf的用法其实是比较相似的,它可以从文件流中把数据读取到我们的buffer缓冲区中来,使用一定的格式限制。
int fscanf( FILE *stream, const char *format [, argument ]... );
比如下面的这个测试就是用一个正则的限制,每遇到一个逗号,就把文件中的内容读到对应的buffer中去
fscanf(File, "%[^,]%*c %[^,]%*c %[^,]%*c %[^,]%*c %[^,]%*c %[^\n]%*c", UserInfo.U_ID, UserInfo.U_Name, UserInfo.U_PassWord, UserInfo.U_PhoneNumber, UserInfo.U_Addr, Money );
fscanf函数从流的当前位置读取数据到参数指定的位置(如果有的话)。每个参数必须是一个指向与格式中类型说明符相对应的类型变量的指针。
7.fprintf
那既然有fscanf,那肯定就得有fprintf啊,不然的话,那不是搞得有点偏心了吗,所以微软也设计了fprintf函数。
int fprintf( FILE *stream, const char *format [, argument ]... );
这个也是和printf差不多,就是把一个buffer缓冲区的数据,以一个规定的格式输入到文件流中去,比如下面这个例子就是把字符串输入到文件流所指之处去!
fprintf(File, "%s", BufferData);
8.fgets
fgets是每次从所给流指针中读取一行数据读到缓冲区中去,声明如下:
_ACRTIMP char* __cdecl fgets( _Out_writes_z_(_MaxCount) char* _Buffer, _In_ int _MaxCount, _Inout_ FILE* _Stream );
总共三个参数,第一个是一个buffer,到时候需要把数据就读取到这里,第二个是最大的读取字节数,第三个是流指针。具体的使用举例如下:
fgets(BufferData, 1024, File)
有关文件操作系列的函数呢,常见的我今天想起来的也就是这些了,如果日后再想起来了,再继续在这里更行这篇文章,好久没更新C/C++专栏了,最近确实是比较忙,有想写个完整项目的兄弟,可以去支持一下:https://download.csdn.net/download/qq_42253797/20416914?spm=1001.2014.3001.5503