美文网首页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/

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