一、fopen函数
1.1 使用格式
FILE * fopen(const char * filename,const char * mode);
1.2 函数的功能
打开文件(open file)
打开名称在参数filename中指定的文件,并将其与可在将来操作中通过返回的FILE指针识别的流相关联。
流上允许的操作及其执行方式由mode参数定义。如果已知未引用交互式设备(请参阅setbuf),则默认情况下,返回的流将完全缓冲。 可以通过调用fclose或freopen将返回的指针与文件解除关联。正常程序终止时,所有打开的文件将自动关闭。
1.3 函数参数
文件名(filename)
包含要打开的文件名的C字符串。
其值应遵循运行环境的文件名规范,并且可以包含路径(如果系统支持)。
模式(mode)
模式 | 功能 |
---|---|
“r” | read:打开文件进行输入操作。该文件必须存在。 |
“w” | write:为输出操作创建一个空文件。如果已存在具有相同名称的文件,则会丢弃其内容,并将该文件视为新的空文件。 |
“a” | append:打开文件末尾的输出文件。输出操作总是在文件末尾写入数据,并将其扩展。重新定位操作(fseek,fsetpos,rewind)将被忽略。如果文件不存在,则创建该文件。 |
“r+” | read/update:打开文件进行更新(包括输入和输出)。该文件必须存在。 |
“w+” | write/update:创建一个空文件并打开它进行更新(包括输入和输出)。如果已存在具有相同名称的文件,则会丢弃其内容,并将该文件视为新的空文件。 |
“a+” | append / update:打开一个文件进行更新(包括输入和输出),所有输出操作都在文件末尾写入数据。重新定位操作(fseek,fsetpos,rewind)会影响下一个输入操作,但输出操作会将位置移回文件末尾。如果文件不存在,则创建该文件。 |
1.4 返回值
如果文件成功打开,则该函数返回指向FILE对象的指针,该对象可用于在将来的操作中标识流。
否则,返回空指针。
在大多数库实现中,errno变量也会在失败时设置为特定于系统的错误代码。
1.5 使用案例
/* fopen example */
#include <stdio.h>
int main()
{
FILE * pFile;
pFile = fopen("myfile.txt", "w");
if (pFile != NULL)
{
fputs("fopen example", pFile);
fclose(pFile);
}
return 0;
}
二、fclose函数
2.1 使用格式
int fclose(FILE * stream);
2.2 函数功能
关闭文件(一般与fopen函数配套使用)
关闭与流关联的文件并取消关联。
与流关联的所有内部缓冲区都与其解除关联并刷新:写入任何未写入的输出缓冲区的内容,并丢弃任何未读输入缓冲区的内容。
即使调用失败,作为参数传递的流也将不再与文件及其缓冲区相关联。
2.3 函数参数
stream
指向FILE对象的指针,指定要关闭的流。
2.4 函数返回值
如果成功关闭流,则返回零值。
失败时,返回EOF。
2.5 使用案例
/* fclose example */
#include <stdio.h>
int main()
{
FILE * pFile;
pFile = fopen("myfile.txt", "wt");
fprintf(pFile, "fclose example");
int ret = fclose(pFile);
printf("%d\n", ret);
return 0;
}
三、fputs函数
3.1 使用格式
int fputs(const char * str,FILE * stream);
3.2 函数功能
将字符串写入流
写C字符串被指出STR的数据流。
该函数从指定的地址(str)开始复制,直到到达终止空字符(’\0’)。此终止空字符不会复制到流中。
注:fputs与puts有所不同,因为可以指定目标流,而且fputs不会写入其他字符,而puts会自动在末尾添加换行符。
3.3 函数参数
str
带有要写入流的内容的C字符串。
stream
指向标识输出流的FILE对象的指针。
3.4 函数返回值
成功时,返回非负值。
出错时,该函数返回EOF并设置错误指示符(ferror)。
3.5 使用案例
/* fputs example */
#include <stdio.h>
int main()
{
FILE * pFile;
char sentence[256];
printf("Enter sentence to append: ");
fgets(sentence, 256, stdin);
pFile = fopen("mylog.txt", "a");
fputs(sentence, pFile);
fclose(pFile);
return 0;
}
四、fseek函数
4.1 使用格式
int fseek(FILE * stream,long int offset,int origin);
4.2 函数功能
重新定位流位置指示器
将与流关联的位置指示器设置为新位置。
1、对于以二进制模式打开的流,通过将偏移添加到由origin指定的参考位置来定义新位置。
2、对于在文本模式下打开的流,offset应为零或前一次调用ftell返回的值,而origin必须为SEEK_SET。
4.3 函数参数
stream
指向标识流的FILE对象的指针。
offset
二进制文件:从原点偏移的字节数。
文本文件:零或ftell返回的值。
origin
位置用作偏移的参考。它由中定义的以下常量之一指定,专门用作此函数的参数:
constant | Reference position |
---|---|
SEEK_SET | 文件开头 |
SEEK_CUR | 文件指针的当前位置 |
SEEK_END | 文件结束 |
允许库实现无意义地支持SEEK_END(因此,使用它的代码没有真正的标准可移植性)。
4.4 函数返回值
如果成功,该函数返回零。
否则,它返回非零值。
如果发生读或写错误,则设置错误指示符(ferror)。
4.5 使用案例
/* fseek example */
#include <stdio.h>
int main()
{
FILE * pFile;
pFile = fopen("example.txt", "wb");
fputs("This is an apple.", pFile);
fseek(pFile, 9, SEEK_SET);
fputs(" sam", pFile);
fclose(pFile);
return 0;
}
下面我们来看一个关于fseek函数的题目
解析:int fseek(FILE *stream, long offset, int fromwhere);描 述: 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。返回值: 成功,返回0,否则返回其他值。
第一个参数stream为文件指针。
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移。
第三个参数origin设定从文件的哪里开始偏移
SEEK_SET: 文件开头,
SEEK_CUR: 当前位置,
SEEK_END: 文件结尾。
其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2)
因此,fseek(fp,-20L,2)的含义是把文件指针fp指向文件结尾偏移-20字节处。