美文网首页C Primer Plus(6th)
文件I/O常用函数fopen/fclose/getc/putc/

文件I/O常用函数fopen/fclose/getc/putc/

作者: akuan | 来源:发表于2020-12-13 16:18 被阅读0次

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

fopen的模式mode
返回值
该函数返回一个 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,并设置 errnoEBADF

#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 操作都被即时写入。buffersize 参数被忽略。

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

相关文章

  • 文件I/O常用函数fopen/fclose/getc/putc/

    fopenC 标准库 - 声明FILE *fopen(const char *filename, const c...

  • C语言读写文件

    C读写文件 使用 fopen(文件名,访问模式) 函数来打开文件,一般有getc/putc , fgets/fpu...

  • C语言文件相关函数

    fopen 打开文件 fclose 关闭文件 getc 一次读一个字符 putc 一次写一个字符 fgets和fp...

  • C语言文件

    文件的打开和关闭 fopen / fclose函数 fopen第一个参数接收打开的文件的名称的字符串,第二个参数接...

  • C 文件操作

    C语言中文件操作主要有以下函数: fopen() :打开一个文件 fclose():关闭一个文件 fgetc():...

  • C/C++文件读写

    简介 C/C++中可以使用以fopen、fclose为代表的文件操作函数对文件进行读写。 注:本文在Linux平台...

  • 10.20

    今天继续深入的讲解了文件的用法,包括一些函数的运用,像fscanf,fprintf,fopen,fclose,fs...

  • C基础-文件操作

    文件打开和关闭 这里的“打开”和“关闭”可调用标准库 stdio.h 中的 fopen 和 fclose 函数实现...

  • C&C++常用方法笔记 -文件操作

    fopen 打开文件 fclose 关闭文件 fget //获取字符串 fput //写入字符串 复制文件的实例 ...

  • 标准I/O的机理

    通常,使用标准I/O的第1步是调用fopen()打开文件(前面介绍过,C程序会自动打开3种标准文件)。fopen(...

网友评论

    本文标题:文件I/O常用函数fopen/fclose/getc/putc/

    本文链接:https://www.haomeiwen.com/subject/valugktx.html