C 语言 Freopen() 函数2025年1月7日 | 阅读 6 分钟 由于C语言中的freopen()函数,可以重新打开一个已有的文件流(FILE*)并使用不同的文件或模式。将它们链接到新文件可以让你重定向标准输入、输出或错误流。该函数用于执行诸如将输出路由到文件以及修改流写入或读取的文件等操作。文件名、模式和流与fopen()的参数相同。freopen()函数会关闭与流关联的原始文件。如果函数失败并返回NULL,则原始流保持不变。 语法它具有以下语法: 参数- FILE *: 它表示函数返回的是指向FILE对象的指针。这个FILE引用代表新打开的文件流。
- const char *filename: 这是一个指向要打开的文件名的指针,以字符串形式表示。如果filename为NULL,则freopen()会修改当前打开的文件流的模式,而不是打开新文件。
- const char *mode: 这是一个指向字符串的指针(例如,"r"表示读取,"w"表示写入),用于指示文件访问模式。它指定如何打开文件或修改当前文件流。
- FILE *stream: 这是一个指向当前打开的FILE流的指针,你想重定向或重新打开它。该流可以是用户定义的,也可以是标准流(stdin、stdout、stderr)之一。
模式参数可能的值是文本文件模式几种文本文件模式如下: - "r": 允许读取已存在的文件。如果文件不存在,函数将无法工作。无法编辑文件。
- "w": 创建一个新写入文件。如果文件已存在,则会删除其内容。如果不存在,则会创建一个新文件。在此模式下无法从文件读取。
"a": 打开一个当前文件,以便在末尾追加数据。如果文件不存在,则会创建它。数据以这种方式添加到文件末尾,允许写入而不修改已存在的内容。 - "r+": 允许以读写方式打开文件。必须存在文件。文件内容保持不变,允许读取和更新文件。
- "w+": 创建一个新文件用于读写。如果文件已存在,则会被清空。如果不存在,则会创建一个新文件。如果文件已存在,则会被截断,但仍允许在此模式下读写。
- "a+": 以追加和读取方式打开一个已存在的文件。如果文件不存在,则会创建它。数据以这种方式添加到文件末尾,允许写入而不修改已存在的内容。
二进制文件模式几种二进制文件模式如下: - "rb": 允许您读取已存在的二进制文件。文件必须存在。当以二进制格式读取数据时,不允许修改。
- "wb": 创建一个适合写入的新二进制文件。如果文件已存在,则会擦除其内容。如果不存在,则会创建一个新文件。此模式不允许读取,但允许写入二进制数据。
- "ab": 允许在已存在的二进制文件末尾追加数据。如果文件不存在,则会创建它。此模式在不更改已存在内容的情况下添加二进制数据。
- "r+b" 或 "rb+": 允许您对已存在的二进制文件进行读写操作。文件必须存在。可以通过这种方式更新文件内容而不擦除它。
- "w+b" 或 "wb+": 创建一个可写入和读取的新二进制文件。如果文件已存在,则会擦除其内容。如果不存在,则会创建一个新文件。此模式允许读写,并在文件已存在时进行截断。
- "a+b" 或 "ab+": 允许您对已存在的二进制文件进行读取和追加操作。如果文件不存在,则会创建它。添加二进制格式的数据,并且可以从任何位置读取文件。
返回值当freopen()函数成功时,它会返回一个指向FILE对象的指针。当freopen失败时,它会将全局变量errno更改为指示错误,并返回NULL。 函数行为当调用freopen()时,它会执行几个操作: - 关闭现有文件: 在执行任何进一步操作之前,函数会关闭与提供的流关联的文件。如果流已打开,则在执行任何其他文件操作之前会关闭它。
- 打开新文件: 之后,它会以模式指定的模式打开由文件名指示的文件。
- 替换流: 输入或输出操作实际上被重定向到新打开的文件,该文件与指定的流关联。
示例 - 将标准输出重定向到文件输出
This will be written to the file instead of the console.
Another line that goes into the file.
说明此C代码使用freopen()函数将标准输出(stdout)重定向到名为output.txt的文件。程序首先尝试以写入模式打开文件;如果失败,则会显示错误通知并终止程序。之后,printf()操作会将文本写入文件而不是控制台。写入后使用fclose()关闭文件。接下来,会在控制台上打印最后的printf()语句,通过重新打开控制台将stdout返回到它。这演示了如何将输出重定向到文件并返回到终端。 示例 - 将标准输入重定向到文件输出
Error opening the file: No such file or directory
说明此C程序演示了如何使用freopen()将标准输入(stdin)从文件重定向。首先打开input.txt文件,并将stdin重定向到从中读取。之后,程序逐行扫描文件,并在进行时计数,并为每一行打印行号。文件处理后,它会给出读取的总行数,并确定是否读取了任何行。这演示了freopen()如何通过关闭stdin然后再次打开文件读取第一行来进行对同一文件的多次操作。最后,它再次关闭文件。为文件操作集成了错误处理,以确保报告并妥善处理任何问题。 实际用途- 调试和测试: 由于freopen()不会显著更改程序代码,因此可以在开发过程中测试程序如何处理文件输入和输出。这对于自动化测试和调试很有用。
- 日志管理: 为了帮助在生产环境中进行调试和错误日志记录,将stderr重定向到文件可以帮助捕获错误消息。
|