文件I/O常用函数fopen/fclose/getc/putc/
fopen
C 标准库 - <stdio.h>
声明
FILE *fopen(const char *filename, const char *mode)
描述
使用给定的模式 mode
打开 filename
所指向的文件。
参数
filename
-- 这是 C 字符串,包含了要打开的文件名称。
mode
-- 这是 C 字符串,包含了文件访问模式,模式如下:

返回值
该函数返回一个
FILE
指针。否则返回 NULL
,且设置全局变量 errno
来标识错误。
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE * fp;
fp = fopen ("file.txt", "w+");
fprintf(fp, "%s %s %s %d", "We", "are", "in", 2020);
fclose(fp);
return(0);
}
让我们编译并运行上面的程序,这将创建一个带有一下内容的文件 file.txt:
We are in 2020
#include <stdio.h>
int main () {
FILE *fp;
int c;
fp = fopen("file.txt", "r");
while (1) {
c = fgetc(fp);
if (feof(fp)) {
break ;
}
printf("%c", c);
}
fclose(fp);
return(0);
}
————————————————————————————————
fclose
C 标准库 - <stdio.h>
声明
int fclose(FILE *stream)
描述
关闭流 stream
。刷新所有的缓冲区。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象指定了要被关闭的流。
返回值
如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。
————————————————————————————————
getc
C 标准库 - <stdio.h>
声明
int getc(FILE *stream)
描述
从指定的流 stream
获取下一个字符(一个无符号字符),并把位置标识符往前移动。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了要在上面执行操作的流。
返回值
该函数以无符号 char
强制转换为 int
的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF
。
#include<stdio.h>
int main() {
char c;
printf("请输入字符:");
c = getc(stdin);
printf("输入的字符:");
putc(c, stdout);
return(0);
}
请输入字符:a<Enter>
输入的字符:a
————————————————————————————————
putc
C 标准库 - <stdio.h>
声明
int putc(int char, FILE *stream)
描述
把参数 char
指定的字符(一个无符号字符)写入到指定的流 stream
中,并把位置标识符往前移动。
参数
char
-- 这是要被写入的字符。该字符以其对应的 int
值进行传递。
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了要被写入字符的流。
返回值
该函数以无符号 char
强制转换为 int
的形式返回写入的字符,如果发生错误则返回 EOF
。
#include <stdio.h>
int main () {
FILE *fp;
int ch;
fp = fopen("file.txt", "w");
for (ch = 33 ; ch <= 100; ch++ ) {
putc(ch, fp);
}
fclose(fp);
return(0);
}
让我们编译并运行上面的程序,这将在当前目录中创建文件 file.txt,它的内容如下:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd
现在让我们使用下面的程序查看上面文件的内容:
#include <stdio.h>
int main () {
FILE *fp;
int c;
fp = fopen("file.txt","r");
while(1) {
c = fgetc(fp);
if (feof(fp)) {
break ;
}
printf("%c", c);
}
fclose(fp);
return(0);
}
————————————————————————————————
fgetc
C 标准库 - <stdio.h>
声明
int fgetc(FILE *stream)
描述
从指定的流 stream
获取下一个字符(一个无符号字符),并把位置标识符往前移动。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了要在上面执行操作的流。
返回值
该函数以无符号 char
强制转换为 int
的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF
。
#include <stdio.h>
int main () {
FILE *fp;
int c;
int n = 0;
fp = fopen("file.txt","r");
if (fp == NULL) {
perror("打开文件时发生错误");
return(-1);
}
do {
c = fgetc(fp);
if (feof(fp)) {
break ;
}
printf("%c", c);
} while(1);
fclose(fp);
return(0);
}
假设我们有一个文本文件 file.txt,它的内容如下。文件将作为实例中的输入:
We are in 2020
编译并运行上面的程序,这将产生以下结果:
We are in 2020
————————————————————————————————
fputc
C 标准库 - <stdio.h>
声明
int fputc(int char, FILE *stream)
描述
把参数 char
指定的字符(一个无符号字符)写入到指定的流 stream
中,并把位置标识符往前移动。
参数
char
-- 这是要被写入的字符。该字符以其对应的 int
值进行传递。
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了要被写入字符的流。
返回值
如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF
,并设置错误标识符。
#include <stdio.h>
int main () {
FILE *fp;
int ch;
fp = fopen("file.txt", "w+");
for( ch = 33 ; ch <= 100; ch++ ) {
fputc(ch, fp);
}
fclose(fp);
return(0);
}
让我们编译并运行上面的程序,这将在当前目录中创建文件 file.txt,它的内容如下:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd
使用下面的程序查看上面文件的内容:
#include <stdio.h>
int main () {
FILE *fp;
int c;
fp = fopen("file.txt","r");
while(1) {
c = fgetc(fp);
if( feof(fp) ) {
break ;
}
printf("%c", c);
}
fclose(fp);
return(0);
}
————————————————————————————————
fscanf
C 标准库 - <stdio.h>
声明
int fscanf(FILE *stream, const char *format, ...)
描述
从流 stream
读取格式化输入。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了流。
format
-- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format
说明符。format
说明符形式为 [=%[*][width][modifiers]type=]
附加参数
-- 根据不同的 format
字符串,函数可能需要一系列的feof(fp))附加参数,每个参数包含了一个要被插入的值,替换了 format
参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
返回值
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF
。
#include <stdio.h>
#include <stdlib.h>
int main() {
char str1[10], str2[10], str3[10];
int year;
FILE * fp;
fp = fopen ("file.txt", "w+");
fputs("We are in 2020", fp);
rewind(fp);
fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
printf("Read String1 |%s|\n", str1 );
printf("Read String2 |%s|\n", str2 );
printf("Read String3 |%s|\n", str3 );
printf("Read Integer |%d|\n", year );
fclose(fp);
return(0);
}
Read String1 |We|
Read String2 |are|
Read String3 |in|
Read Integer |2020|
————————————————————————————————
fprintf
C 标准库 - <stdio.h>
声明
int fprintf(FILE *stream, const char *format, ...)
描述
发送格式化输出到流 stream
中。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了流。
format
-- 这是 C 字符串,包含了要被写入到流 stream
中的文本。它可以包含嵌入的 format
标签,format
标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format
标签属性是 %[flags][width][.precision][length]specifier
附加参数
-- 根据不同的 format
字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format
参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
返回值
如果成功,则返回写入的字符总数,否则返回一个负数。
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE * fp;
fp = fopen ("file.txt", "w+");
fprintf(fp, "%s %s %s %d", "We", "are", "in", 2020);
fclose(fp);
return(0);
}
编译并运行上面的程序,这将创建文件 file.txt,它的内容如下:
We are in 2020
现在让我们使用下面的程序查看上面文件的内容:
#include <stdio.h>
int main () {
FILE *fp;
int c;
fp = fopen("file.txt","r");
while (1) {
c = fgetc(fp);
if ( feof(fp) ){
break ;
}
printf("%c", c);
}
fclose(fp);
return(0);
}
————————————————————————————————
fseek
C 标准库 - <stdio.h>
声明
int fseek(FILE *stream, long int offset, int whence)
描述
设置流 stream
的文件位置为给定的偏移 offset
,参数 offset
意味着从给定的 whence
位置查找的字节数。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了流。
offset
-- 这是相对 whence
的偏移量,以字节为单位。
whence
-- 这是表示开始添加偏移 offset
的位置。它一般指定为下列常量之一:
SEEK_SET
文件的开头, SEEK_CUR
文件指针的当前位置, SEEK_END
文件的末尾
返回值
如果成功,则该函数返回零,否则返回非零值。
#include <stdio.h>
int main () {
FILE *fp;
fp = fopen("file.txt","w+");
fputs("This is w3cschool.cn", fp);
fseek( fp, 7, SEEK_SET );
fputs(" C Programming Langauge", fp);
fclose(fp);
return(0);
}
编译并运行上面的程序,这将创建文件 file.txt,它的内容如下。最初程序创建文件和写入 This is w3cschool.cn,但是之后我们在第七个位置重置了写指针,并使用 puts() 语句来重写文件,内容如下:
This is C Programming Langauge
————————————————————————————————
ftell
C 标准库 - <stdio.h>
声明
long int ftell(FILE *stream)
描述
返回给定流 stream
的当前文件位置。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了流。
返回值
该函数返回位置标识符的当前值。如果发生错误,则返回 -1L
,全局变量 errno
被设置为一个正值。
fseek(fp, 0L, SEEK_SET); // 定位至文件开始处
fseek(fp, 10L, SEEK_SET); // 定位至文件中的第10个字节
fseek(fp, 2L, SEEK_CUR); // 从文件当前位置前移2个字节
fseek(fp, 0L, SEEK_END); // 定位至文件结尾
fseek(fp, -10L, SEEK_END); // 从文件结尾处回退10个字节
#include <stdio.h>
int main () {
FILE *fp;
int len;
fp = fopen("file.txt", "r");
if (fp == NULL) {
perror ("打开文件错误");
return(-1);
}
fseek(fp, 0, SEEK_END);
len = ftell(fp);
fclose(fp);
printf("file.txt 的总大小 = %d 字节\n", len);
return(0);
}
假设我们有一个文本文件 file.txt,它的内容如下:
This is w3cschool.cn
编译并运行上面的程序,如果文件内容如上所示,这将产生以下结果,否则会根据文件内容给出不同的结果:
file.txt 的总大小 = 21 字节
关于二进制读取与文本读取及移植性,见:二进制模式和文本模式
————————————————————————————————
fgetpos
C 标准库 - <stdio.h>
声明
int fgetpos(FILE *stream, fpos_t *pos)
描述
获取流 stream
的当前文件位置,并把它写入到 pos
。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了流。
pos
-- 这是指向 fpos_t
对象的指针。
返回值
如果成功,该函数返回零。如果发生错误,则返回非零值。
————————————————————————————————
fsetpos
C 标准库 - <stdio.h>
声明
int fsetpos(FILE *stream, const fpos_t *pos)
描述
设置给定流 stream
的文件位置为给定的位置。参数 pos
是由函数 fgetpos
给定的位置。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了流。
pos
-- 这是指向 fpos_t
对象的指针,该对象包含了之前通过 fgetpos
获得的位置。
返回值
如果成功,该函数返回零值,否则返回非零值,并设置全局变量 errno
为一个正值,该值可通过 perror
来解释。
#include <stdio.h>
int main () {
FILE *fp;
fpos_t position;
fp = fopen("file.txt","w+");
fgetpos(fp, &position);
fputs("Hello, World!", fp);
fsetpos(fp, &position);
fputs("这将覆盖之前的内容", fp);
fclose(fp);
return(0);
}
编译并运行上面的程序,这将创建一个文件 file.txt,它的内容如下。首先我们使用 fgetpos() 函数获取文件的初始位置,接着我们向文件写入 Hello, World!,然后我们使用 fsetpos() 函数来重置写指针到文件的开头,重写文件为下列内容:
这将覆盖之前的内容
————————————————————————————————
ungetc
C 标准库 - <stdio.h>
声明
int ungetc(int char, FILE *stream)
描述
把一个(或多个)字符退回到stream
代表的文件流中。可以用ungetc()
来将读出的结果返回到流中,这样下次就可以继续从流中读取数据。
把字符 char
(一个无符号字符)推入到指定的输入流 stream
中,以便它是下一个被读取到的字符。
参数
char
-- 这是要被推入的字符。该字符以其对应的 int
值进行传递。
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了输入流(必须是输入流不能是输出流)。
返回值
如果成功,则返回被推入的字符,否则返回 EOF
,且流 stream
保持不变。
#include <stdio.h>
int main () {
FILE *fp;
int c;
char buffer[256];
fp = fopen("file.txt", "r");
if( fp == NULL ) {
perror("打开文件时发生错误");
return(-1);
}
while ( !feof(fp) ) {
c = getc(fp);
/* 把 ! 替换为 + */
if( c == '!' ) {
ungetc('+', fp);
} else {
int r = ungetc(c, fp);
if(r==EOF){
printf("(%s)","EOF");
}
char *ret = fgets(buffer, 255, fp);
printf("【%d->%c,%s】", c, ret);
fputs(buffer, stdout);
}
return(0);
}
假设我们有一个文本文件 file.txt,它的内容如下。文件将作为实例中的输入:
this is w3cschool
!c standard library
!library functions and macros
(空换行)-->故意加一个空换行!
编译并运行上面的程序,这将产生以下结果:(理解程序要先搞清楚feof getc ungetc fgets函数的返回值)
【116->t,this is w3cschool
】this is w3cschool
【33->!,+c standard library
】+c standard library
【33->!,+library functions and macros
】+library functions and macros
(EOF)【-1->�,(null)】+library functions and macros
————————————————————————————————
feof
C 标准库 - <stdio.h>
声明
int feof(FILE *stream)
描述
测试给定流 stream
的文件结束标识符。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了流。
返回值
文件结束:返回非0
值;文件未结束:返回0
值。文件结束符只能被clearerr()
清除.
#include <stdio.h>
int main () {
FILE *fp;
int c;
fp = fopen("file.txt","r");
if(fp == NULL) {
perror("打开文件时发生错误");
return(-1);
}
while(1){
c = fgetc(fp);
if( feof(fp) ){
break ;
}
printf("%c", c);
}
fclose(fp);
return(0);
}
————————————————————————————————
ferror
C 标准库 - <stdio.h>
声明
int ferror(FILE *stream)
描述
测试给定流 stream
的错误标识符。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了流。
返回值
如果设置了与流关联的错误标识符,该函数返回一个非零值,否则返回一个零值。
#include <stdio.h>
int main() {
FILE *fp;
char c;
fp = fopen("file.txt", "w");
c = fgetc(fp);
if (ferror(fp)) {
printf("读取文件:file.txt 时发生错误\n");
}
clearerr(fp);
if (ferror(fp)) {
printf("读取文件:file.txt 时发生错误\n");
}
fclose(fp);
return (0);
}
假设我们有一个文本文件 file.txt,它是一个空文件。让我们编译并运行上面的程序,因为我们试图读取一个以只写模式打开的文件,这将产生以下结果。
读取文件:file.txt 时发生错误
————————————————————————————————
clearerr
C 标准库 - <stdio.h>
声明
void clearerr(FILE *stream)
描述
清除给定流 stream
的文件结束和错误标识符。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了流。
返回值
这不会失败,且不会设置外部变量 errno
,但是如果它检测到它的参数不是一个有效的流,则返回 -1
,并设置 errno
为 EBADF
。
#include <stdio.h>
int main() {
FILE *fp;
char c;
fp = fopen("file.txt", "w");
c = fgetc(fp);
if (ferror(fp)) {
printf("读取文件:file.txt 时发生错误\n");
}
clearerr(fp);
if (ferror(fp)) {// 上行代码清除了错误标识符,所以没有error了
printf("读取文件:file.txt 时发生错误\n");
}
fclose(fp);
return (0);
}
————————————————————————————————
perror
C 标准库 - <stdio.h>
声明
void perror(const char *str)
描述
把一个描述性错误消息输出到标准错误 stderr
。首先输出字符串 str
,后跟一个冒号,然后是一个空格。
参数
str
-- 这是 C 字符串,包含了一个自定义消息,将显示在原本的错误消息之前。
返回值
不返回任何值。
#include <stdio.h>
int main () {
FILE *fp;
/* 首先重命名文件 */
rename("file.txt", "newfile.txt");
/* 现在让我们尝试打开相同的文件 */
fp = fopen("file.txt", "r");
if( fp == NULL ) {
perror("Error: ");
return(-1);
}
fclose(fp);
return(0);
}
Error: : No such file or directory
————————————————————————————————
fflush
C 标准库 - <stdio.h>
声明
int fflush(FILE *stream)
描述
刷新流 stream
的输出缓冲区。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象指定了一个缓冲流。
返回值
如果成功,该函数返回零值。如果发生错误,则返回 EOF
,且设置错误标识符(即 feof
)。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main() {
char buff[1024];
memset(buff, '\0', sizeof(buff));
fprintf(stdout, "启用全缓冲\n");
setvbuf(stdout, buff, _IOFBF, 1024);
fprintf(stdout, "这里是 w3cschool.cn\n");
fprintf(stdout, "该输出将保存到 buff\n");
fflush(stdout);
fprintf(stdout, "这将在编程时出现\n");
fprintf(stdout, "最后休眠五秒钟\n");
sleep(5);
return (0);
}
编译并运行上面的程序,这将产生以下结果。在这里,程序把缓冲输出保存到 buff,直到首次调用 fflush() 为止,然后开始缓冲输出,最后休眠 5 秒钟。它会在程序结束之前,发送剩余的输出到 STDOUT。
启用全缓冲
这里是 w3cschool.cn
该输出将保存到 buff
这将在编程时出现 <<<5秒后打印
最后休眠五秒钟 <<<5秒后打印
————————————————————————————————
setbuf
C 标准库 - <stdio.h>
声明
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 w3cschool");
fflush(stdout);
return(0);
}
编译并运行上面的程序,这将产生以下结果。在这里,程序在即将输出的时候,发送输出到 STDOUT
,否则它将缓冲输出。您也可以使用 fflush()
函数来刷新清空缓冲,输出缓冲数据。
This is w3cschool
————————————————————————————————
setvbuf
C 标准库 - <stdio.h>
声明
int setvbuf(FILE *stream, char *buffer, int mode, size_t size)
描述
定义流 stream
应如何缓冲。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了一个打开的流。
buffer
-- 这是分配给用户的缓冲。如果设置为 NULL
,该函数会自动分配一个指定大小的缓冲。
mode
-- 这指定了文件缓冲的模式:
_IOFBF
全缓冲:对于输出,数据在缓冲填满时被一次性写入。对于输入,缓冲会在请求输入且缓冲为空时被填充。
_IOLBF
行缓冲:对于输出,数据在遇到换行符或者在缓冲填满时被写入,具体视情况而定。对于输入,缓冲会在请求输入且缓冲为空时被填充,直到遇到下一个换行符。
_IONBF
无缓冲:不使用缓冲。每个 I/O 操作都被即时写入。buffer
和size
参数被忽略。
size
--这是缓冲的大小,以字节为单位。
返回值
如果成功,则该函数返回 0
,否则返回非零值。
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main() {
char buff[1024];
memset(buff, '\0', sizeof(buff));
fprintf(stdout, "启用全缓冲\n");
setvbuf(stdout, buff, _IOFBF, 1024);
fprintf(stdout, "这里是 w3cschool.cn\n");
fprintf(stdout, "该输出将保存到 buff\n");
fflush( stdout);
fprintf(stdout, "这将在编程时出现\n");
fprintf(stdout, "最后休眠五秒钟\n");
sleep(5);
return (0);
}
编译并运行上面的程序,这将产生以下结果。在这里,程序把缓冲输出保存到 buff,直到首次调用 fflush() 为止,然后开始缓冲输出,最后休眠 5 秒钟。它会在程序结束之前,发送剩余的输出到 STDOUT。
启用全缓冲
这里是 w3cschool.cn
该输出将保存到 buff
这将在编程时出现 <<<5秒后打印
最后休眠五秒钟 <<<5秒后打印
————————————————————————————————
fread
C 标准库 - <stdio.h>
声明
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
描述
从给定流 stream
读取数据到 ptr
所指向的数组中。
参数
ptr
-- 这是指向带有最小尺寸 size*nmemb
字节的内存块的指针。
size
-- 这是要读取的每个元素的大小,以字节为单位。
nmemb
-- 这是元素的个数,每个元素的大小为 size
字节。
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象指定了一个输入流。
返回值
成功读取的元素总数会以 size_t
对象返回,size_t
对象是一个整型数据类型。如果总数与 nmemb
参数不同,则可能发生了一个错误或者到达了文件末尾。
#include <stdio.h>
#include <string.h>
int main() {
FILE *fp;
char c[] = "This is w3cschool";
char buffer[20];
/* 打开文件用于读写 */
fp = fopen("file.txt", "w+");
/* 写入数据到文件 */
fwrite(c, strlen(c) + 1, 1, fp);
/* 查找文件的开头 */
fseek(fp, SEEK_SET, 0);
/* 读取并显示数据 */
fread(buffer, strlen(c) + 1, 1, fp);
printf("%s\n", buffer);
fclose(fp);
return (0);
}
编译并运行上面的程序,这将创建一个文件 file.txt,然后写入内容 this is w3cschool。接下来我们使用 fseek() 函数来重置写指针到文件的开头,文件内容如下所示:
This is w3cschool
————————————————————————————————
fwrite
C 标准库 - <stdio.h>
声明
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
描述
把 ptr 所指向的数组中的数据写入到给定流 stream
中。
参数
ptr
-- 这是指向要被写入的元素数组的指针。
size
-- 这是要被写入的每个元素的大小,以字节为单位。
nmemb
-- 这是元素的个数,每个元素的大小为 size
字节。
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象指定了一个输出流。
返回值
如果成功,该函数返回一个 size_t
对象,表示元素的总数,该对象时一个整型数据类型。如果该数字与 nmemb
参数不同,则会显示一个错误。
#include<stdio.h>
int main () {
FILE *fp;
char str[] = "This is w3cschool.cn";
fp = fopen( "file.txt" , "w" );
fwrite(str , 1 , sizeof(str) , fp );
fclose(fp);
return(0);
}
编译并运行上面的程序,这将创建一个文件 file.txt,它的内容如下:
This is w3cschool.cn
————————————————————————————————
rewind
C 标准库 - <stdio.h>
声明
void rewind(FILE *stream)
描述
设置文件位置为给定流 stream
的文件的开头。
参数
stream
-- 这是指向 FILE
对象的指针,该 FILE
对象标识了流。
返回值
不返回任何值。
#include <stdio.h>
int main() {
char str[] = "This is w3cschool.cn";
FILE *fp;
int ch;
/* 首先让我们在文件中写入一些内容 */
fp = fopen("file.txt", "w");
fwrite(str, 1, sizeof(str), fp);
fclose(fp);
fp = fopen("file.txt", "r");
while (1) {
ch = fgetc(fp);
if (feof(fp)) {
break;
}
printf("%c", ch);
}
rewind(fp);
printf("\n");
while (1) {
ch = fgetc(fp);
if (feof(fp)) {
break;
}
printf("%c", ch);
}
fclose(fp);
return (0);
}
编译并运行上面的程序,这将产生以下结果:
file.txt:
This is w3cschool.cn
Console:
This is w3cschool.cn
This is w3cschool.cn