当前位置: C语言 -- 标准库 -- <stdio.h> -- freopen

freopen函数


概要:
#include <stdio.h>
FILE *freopen(const char * restrict filename,
     const char * restrict mode,
     FILE * restrict stream);

描述:

该函数首先关闭先前与参数stream指向流相关联的文件,然后按参数mode指定的模式打开参数filename指向的文件,并将该文件与参数stream指向流相关联。关闭文件失败将被忽略。流的错误指示符(error indicator)和文件末尾指示符(end-of-file indicator)将被清除。

如果参数filename是空指针,函数就像使用当前关联文件一样,尝试将流的模式更改为参数mode指定的模式;哪些模式允许以及在什么情况下允许,将由实现定义。

ISO/IEC 9899:2018标准定义了该函数的安全版本freopen_s


参数:
const char * restrict filename

指向表示文件名的字符串(如果系统支持,文件名可以包含路径。)的指针,文件名规则由实现定义。

const char * restrict mode

指向表示文件访问模式的字符串的指针。ISO/IEC 9899:2018标准支持的文件访问模式具体如下所示:

模式 描述
r

打开文本文件用于读取数据。

w

截断到零长度(如果文件已经存在的话。)或者创建新文本文件用于写入数据。

wx

创建新文本文件用于写入数据。

a

添加;打开或者创建文本文件用于在文件末尾处写入数据。

rb

打开二进制文件用于读取数据。

wb

截断到零长度(如果文件已经存在的话。)或者创建新二进制文件用于写入数据。

wbx

创建新二进制文件用于写入数据。

ab

添加;打开或者创建二进制文件用于在文件末尾处写入数据。

r+

打开文本文件用于更新数据(读取数据和写入数据)。

w+

截断到零长度(如果文件已经存在的话。)或者创建新文本文件用于更新数据。

w+x

创建新文本文件用于更新数据。

a+

添加;打开或者创建文本文件用于更新数据,在文件末尾处写入数据。

r+b 或者 rb+

打开二进制文件用于更新数据(读取数据和写入数据)。

w+b 或者 wb+

截断到零长度(如果文件已经存在的话。)或者创建新二进制文件用于更新数据。

w+bx 或者 wb+x

创建新二进制文件用于更新数据。

a+b 或者 ab+

添加;打开或者创建二进制文件用于更新数据,在文件末尾处写入数据。

如果模式参数是除上表以外的其它值,函数行为是未定义的。如果模式参数字符串以上表序列之一开始,实现可能会选择忽略剩余的字符,或者使用剩余字符来选择不同类型的文件(其中一些可能不符合ISO/IEC 9899:2018标准第7.21.2 Streams节的流属性。)。


如果文件不存在或者文件无法读取,以读取模式(字符r作为打开模式的第一个字符。)打开文件将会失败。

如果文件已经存在或者无法创建,以独占模式(字符x作为打开模式的最后一个字符。)打开文件将会失败;否则在底层系统支持独占访问的范围内,使用独占(也称非共享。)模式创建文件。

以添加模式打开文件(字符a作为打开模式的第一个字符。)会导致对文件的所有后续写入都被强制到文件的当前末尾,而不管fseek函数的调用。由于空字符填充,在一些实现中以添加模式打开二进制文件(字符b作为打开模式的第二个字符或者第三个字符。)可能最初将流的文件位置指示符定位在最后写入的数据之外。

当以更新模式(字符+作为打开模式的第二个字符或者第三个字符。)打开文件时,可以在关联的流上执行输入和输出操作。在没有调用fflush函数或者文件定位函数(例如:fseekfsetposrewind函数。)的情况下,输出操作后不能立即执行输入操作;在没有调用文件定位函数的情况下,输入操作后不能立即执行输出操作,除非输入操作到达文件末尾(end-of-file)。在某些实现中,使用更新模式打开或者创建文本文件可能会打开或者创建二进制流。

FILE * restrict stream

指向一个要重新打开的流的指针。


返回值:

如果打开操作失败,函数返回一个空指针;否则函数返回参数stream的值。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
/*函数freopen范例*/

#include <stdio.h>
#include <stdlib.h>

#define LENGTH 100

int main(void)
{
    FILE *pFile;
    char arrOne[LENGTH] = {0};
    char arrTwo[LENGTH] = {0};

    /*从标准输入流读取数据--键盘。*/
    scanf("%[^\n]", arrOne);

    /*从标准输入流读取数据--文件。*/
    pFile = freopen("gch.txt", "r", stdin);
    if(!pFile)
    {
        puts("Fail to open the file.");
        exit(EXIT_FAILURE);
    }
    scanf("%[^\n]", arrTwo);

    fclose(pFile);

    /*输出字符串。*/
    puts(arrOne);
    puts(arrTwo);
    
    return 0;
}


结果:

两个scanf语句都是从标准输入流读取数据;不同的是第一个scanf语句从键盘读取输入;第二个scanf语句从gch.txt文件读取输入。


相关内容:
fclose 关闭文件的函数。
fflush 刷新流的函数。
fopen 打开文件的函数。