头文件
函数
章节结构:
函数原型
// 函数原型
功能
参数
参数1 | 说明 |
返回值
实例
// 实例代码
文件操作
remove
函数原型
int remove ( const char * filename );
功能
删除路径为 filename 的文件
参数
filename | C 字符串,包含了要被删除的文件名称(路径) |
返回值
如果成功返回 0 如果失败返回非 0 值,同时 errno 变量会被设置
实例
#include <stdio.h>
int main ()
{
if( remove( "myfile.txt" ) != 0 )
perror( "Error deleting file" );
else
puts( "File successfully deleted" );
return 0;
}
rename
函数原型
int rename ( const char * oldname, const char * newname );
功能 将 oldname 指定的文件或目录的名称更改为 newname
如果 oldname 和 newname 指定的路径不同且系统支持,则文件将被移动到新的位置
如果 newname 命名一个现有文件,该函数可能会失败或覆盖现有文件,这取决于特定的系统和库实现
参数
oldname | C 字符串,包含要被重命名/移动的文件名称 |
newname | C 字符串,包含了文件的新名称 |
返回值
如果成功,则返回零。如果错误,则返回非零,并设置 errno
实例
#include <stdio.h>
int main()
{
int result;
char oldname[] = "文件1.cpp";
char newname[] = "文件2.cpp";
result = rename(oldname, newname);
if (result == 0)
puts("File successfully renamed");
else
perror("Error renaming file");
return 0;
}
tmpfile
函数原型
FILE * tmpfile ( void );
功能
以二进制更新模式(wb+)创建临时文件。被创建的临时文件会在流关闭的时候或者在程序终止的时候自动删除
参数
none
返回值
如果成功,该函数返回一个指向被创建的临时文件的流指针。如果文件未被创建,则返回 NULL
实例
#include <stdio.h>
int main()
{
FILE* fp;
fp = tmpfile();
printf("临时文件被创建\n");
fclose(fp);
return(0);
}
运行上述代码 VS 会报错:
This function or variable may be unsafe. Consider using tmpfile_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
只需在文件最开头加上 #define _CRT_SECURE_NO_WARNINGS
即可
tmpnam
函数原型
char * tmpnam ( char * str );
功能
生成并返回一个有效的临时文件名,该文件名之前是不存在的。如果 str 为空,则只会返回临时文件名
参数
str | 一个指向字符数组的指针,其中,临时文件名将被存储为 C 字符串,建议大小至少为L_tmpnam |
返回值
一个指向 C 字符串的指针,该字符串存储了临时文件名。
如果 str 是一个空指针,则该指针指向一个内部缓冲区,缓冲区在下一次调用函数时被覆盖。
如果 str 不是一个空指针,则返回 str。如果函数未能成功创建可用的文件名,则返回一个空指针。
实例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char buffer[L_tmpnam];
char* ptr;
tmpnam(buffer);
printf("临时名称 1: %s\n", buffer);
ptr = tmpnam(NULL);
printf("临时名称 2: %s\n", ptr);
return(0);
}
文件访问
fopen
FILE * fopen ( const char * filename, const char * mode );
功能 使用给定的模式 mode 打开 filename 所指向的文件
参数
filename | 字符串,表示要打开的文件名 |
mode | 字符串,表示文件的访问模式,可以是下表中的一系列值 |
mode | 描述 |
“r” | read:打开一个用于读取的文件,该文件必须存在 |
“w” | write:创建一个用于写入的空文件,如果文件已存在会覆盖原有文件 |
“a” | append:追加一个文件,写操作向文件末尾操作,若文件不存在则创建新文件 |
“r+” | read/update:打开一个用于更新的文件,可读可写。该文件必须存在 |
“w+” | write/update:创建一个用于读写的空文件 |
“a+” | append/update:打开一个用于读取和追加的文件 |
使用上述描述符,文件将以文本方式打开。为了以二进制方式打开,可使用描述符 “b”。”b” 有两种添加方式,既可以放到描述符的末尾,比如 “ab”, “r+b”;也可以放置在 “+” 之前,比如 “wb+”, “rb+”。
在 C 的新标准中添加了一个新的描述符:”x”,可以添加在任何的 “w” 类描述符后面(wx, wbx, w+x, wb+x)。它的作用是:如果创建或读取的文件已存在,则强制函数运行失败,而不是覆盖原有文件。
文本文件根据运行的环境,输入输出操作可能会发生一些特殊字符的转换。
返回值
如果文件被成功打开或创建,返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。
实例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
FILE* pFile;
pFile = fopen("myfile.txt", "w");
if (pFile != NULL)
{
fputs("fopen example", pFile);
fclose(pFile);
}
else {
puts("no file exist");
}
return 0;
}
fclose
int fclose ( FILE * stream );
功能
关闭流 stream。刷新所有的缓冲区
参数
stream | 指向 FILE 对象的指针,该 FILE 对象指定了要被关闭的流 |
返回值
如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。
实例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
FILE* pFile;
pFile = fopen("myfile.txt", "a+");
fprintf(pFile, "fclose example\n");
fclose(pFile);
return 0;
}
freopen
FILE * freopen ( const char * filename, const char * mode, FILE * stream );
功能
把一个新的文件名 filename 与给定的打开的流 stream 关联,同时关闭流中的旧文件
参数
filename | 字符串,表示要打开的文件名 |
mode | 字符串,表示文件的访问模式,和 fopen 的 mode 一样 |
stream | 指向 FILE 对象的指针,该 FILE 对象标识了要被重新打开的流 |
返回值
如果文件成功打开,则函数返回一个指针,指向用于标识流的对象。否则,返回空指针
实例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
FILE* fp;
printf("该文本重定向到 stdout\n"); // 黑框中显示该句
fp = freopen("file.txt", "w+", stdout);
printf("该文本重定向到 file.txt\n"); // file.txt 中显示该句
fclose(fp);
return(0);
}
setbuf
void setbuf ( FILE * stream, char * buffer );
功能
定义流 stream 应如何缓冲。该函数应在与流 stream 相关的文件被打开时,且还未发生任何输入或输出操作之前被调用一次。
参数
stream | 指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流 |
buffer | 分配给用户的缓冲,它的长度至少为 BUFSIZ 字节,BUFSIZ 是一个宏常量,表示数组的长度 |
返回值
无
实例
#include <stdio.h>
int main()
{
char buf[BUFSIZ];
setbuf(stdout, buf);
puts("This is runoob");
fflush(stdout);
return(0);
}
fflush
int fflush ( FILE * stream );
功能
刷新流 stream 的输出缓冲区
参数
stream | 指向 FILE 对象的指针,该 FILE 对象指定了一个缓冲流 |
返回值
如果成功,该函数返回零值。如果发生错误,则返回 EOF,且设置错误标识符
实例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
char buff[1024];
memset(buff, '\0', sizeof(buff));
printf("启用全缓冲\n");
setvbuf(stdout, buff, _IOFBF, 1024);
fprintf(stdout, "这里是 runoob.com\n");
fprintf(stdout, "该输出将保存到 buff\n");
fflush(stdout);
fprintf(stdout, "这将在编程时出现\n");
fflush(stdout);
return(0);
}
setvbuf
int setvbuf ( FILE * stream, char * buffer, int mode, size_t size );
功能
定义流 stream 应如何缓冲
参数
stream | 指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流 |
buffer | 分配给用户的缓冲。如果设置为 NULL,该函数会自动分配一个指定大小的缓冲 |
mode | 指定了文件缓冲的模式 |
size | 缓冲的大小,以字节为单位 |
mode 的几种模式如下:
模式 | 描述 |
_IOFBF | 全缓冲:对于输出,数据在缓冲填满时被一次性写入。对于输入,缓冲会在请求输入且缓冲为空时被填充 |
_IOLBF | 行缓冲:对于输出,数据在遇到换行符或者在缓冲填满时被写入,具体视情况而定。对于输入,缓冲会在请求输入且缓冲为空时被填充,直到遇到下一个换行符 |
_IONBF | 无缓冲:不使用缓冲。每个 I/O 操作都被即时写入。buffer 和 size 参数被忽略 |
返回值
如果成功,则该函数返回 0,否则返回非零值
实例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
char buf[5];
int main()
{
int i;
setvbuf(stdout, buf, _IOFBF, 5);
printf("12345");
return 0;
}
编译运行上面程序,程序将缓冲数据存储到 buf 内,buf 装满后自动输出,所以上述会先输出 1234,程序运行结束后再补全输出
文件位置
fgetpos/fsetpos
int fgetpos ( FILE * stream, fpos_t * pos );
int fsetpos ( FILE * stream, const fpos_t * pos );
功能
fgetpos: 获取流 stream 的当前文件位置,并把它写入到 pos
fsetpos: 设置给定流 stream 的文件位置为给定的位置
参数
stream | 指向 FILE 对象的指针,该 FILE 对象标识了流 |
pos | 指向 fpos_t 对象的指针。(fsetpos 中该对象包含了 fgetpos 获得的位置) |
返回值
如果成功,该函数返回零值,否则返回非零值
实例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
FILE* fp;
fpos_t position;
fp = fopen("file.txt", "w+");
fputs("Hello, World!\n", fp);
fgetpos(fp, &position);
fputs("你好", fp);
fflush(fp);
fsetpos(fp, &position);
fputs("这将覆盖之前的内容", fp);
fclose(fp);
return(0);
}
fseek
int fseek ( FILE * stream, long int offset, int origin );
功能
设置流 stream 的文件位置为给定的偏移 offset
参数
stream | 指向 FILE 对象的指针,该 FILE 对象标识了流 |
offset | 相对 whence 的偏移量,以字节为单位 |
whence | 表示开始添加偏移 offset 的位置 |
whence 一般为以下常量:
常量 | 描述 |
SEEK_SET | 文件开头 |
SEEK_CUR | 文件指针当前位置 |
SEEK_END | 文件末尾 |
返回值
如果成功,则该函数返回零,否则返回非零值
实例
#include <stdio.h>
int main()
{
FILE* fp;
fp = fopen("file.txt", "w+");
fseek(fp, 20, SEEK_SET);
fputs(" Hello World", fp);
fclose(fp);
return(0);
}
文档信息
- 本文作者:Ziyue Qi
- 本文链接:https://www.qiziyue.cn/2023/02/04/C%E8%AF%AD%E8%A8%80%E5%AE%98%E6%96%B9%E5%BA%93%E5%AD%A6%E4%B9%A0stdio/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)