C语言标准库学习-stdio.h

2023/02/04 C语言 C标准库 共 5478 字,约 16 分钟

头文件定义了用于输入和输出的函数、类型和宏

函数

章节结构:

函数原型

// 函数原型

功能

参数

参数1说明

返回值

实例

// 实例代码

文件操作

remove

函数原型

int remove ( const char * filename ); 

功能

删除路径为 filename 的文件

参数

filenameC 字符串,包含了要被删除的文件名称(路径)

返回值

如果成功返回 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 命名一个现有文件,该函数可能会失败或覆盖现有文件,这取决于特定的系统和库实现

参数

oldnameC 字符串,包含要被重命名/移动的文件名称
newnameC 字符串,包含了文件的新名称

返回值

如果成功,则返回零。如果错误,则返回非零,并设置 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);
}

文档信息

Search

    Table of Contents