首页 > 其他分享 >15. 文件操作

15. 文件操作

时间:2023-03-13 12:34:29浏览次数:40  
标签:fp 文件 15 函数 写入 printf 操作 打开

一、什么是文件

  文件 是指一组相关数据的有序集合。这个数据集合有一个名称,叫做文件名。所有的文件都通过流进行输入、输出操作。与文本流和二进制流对应,文本可以分为 文本文件二进制文件

  • 文本文件,也称 ASCII 文件。这种文件在保留的时,每一字符对应一个字节,用于存放对应的 ASCII 码。
  • 二进制文件,不保存 ASCII 码,而是按二进制的编码方式来保存文件内容。

  文件在程序中是以流的形式来操作的。 是指数据源(文件)和程序(内存)之间的经历的路径。输入流 指的是数据从数据源(文件)到程序(内存)的路径。输出流 指的是数据从程序(内存)到数据源(文件)的路径。

  当我们提到输入时,这意味着要向程序写入一些数据。输入可以是以文件的形式或命令行中进行。C语言 提供了一系列内置的函数来读取给定的输入,并根据需要写入到程序中。

  当我们提到输出时,这意味着要在屏幕上、打印机上或任意文件中显示一些数据。C语言 提供了一些列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。

  C语言 把所有的设备都当作文件,所以设备被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以访问键盘或屏幕。

标准文件 文件指针 设备
标准输入 stdin 键盘
标准输出 stdout 屏幕
标准错误 stderr 屏幕

二、文件的基本操作

  文件的基本操作包括文件的打开和关闭,除了标准的输入、输出文件外,其它所有的文件都必须先打开再使用,而使用后也必须关闭该文件。

2.1、文件指针

  文件指针是一个指向文件有关信息的指针,这些信息包括文件名、状态 和 当前位置,它们保存在一个结构体变量中。在使用文件时需要在内存中为其分配空间,用来存放文件的基本信息。该结构体类型是由系统定义的,C语言 规定该类型为 FILE 型,其声明如下:

#ifndef _FILE_DEFINED
  struct _iobuf {
    char *_ptr;
    int _cnt;
    char *_base;
    int _flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char *_tmpfname;
  };
  typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif

2.2、文件的打开

  fopen() 函数用来打开一个文件,打开文件的操作就是创建一个流。fopen() 函数的原型在 stdio.h 中,其函数原型如下:

FILE *fopen( const char *restrict filename, const char *restrict mode );

  其中,filename 是指要被打开的文件的文件名,mode 是指对打开的文件要进行读操作还是写操作。

  mode 的具体参数值如下:

文件的打开方式 含义
r(只读) 打开一个文件,只允许读操作,文件必须存在;
(此操作下,文件必须存在)
w(只写) 打开或建立一个文本文件,只允许写操作;
(如果文件不存在,则创建一个文件)
(如果文件存在,则将覆盖此文件的内容)
a(追加) 打开一个文本文件,并在文件末尾写数据;
(如果文件不存在,则创建一个文件)
rb(只读) 打开一个二进制文件,只允许读数据;
wb(只写) 打开或建立一个二进制文件,只允许写数据;
ab(追加) 打开一个二进制文件,并在文件末尾写数据;
r+(读写) 打开一个文本文件,允许读和写;
(文件必须存在,原有的内容保留)
w+(读写) 打开或建立一个问及文本文件,允许读写;
(如果文件不存在,则新建一个文件,重新写入的内容将覆盖原有所有内容)
a+(读写) 打开一个文件文本,允许读,或在文件末追加数据;
(如果文件不存在,则新建一个文件)
rb+(读写) 打开一个二进制文件,允许读和写;
wb+(读写) 打开或建立一个二进制文件,允许读和写;
ab+(读写) 打开一个二进制文件,允许读,或在文件末追加数据;

  如果使用 fopen() 函数打开文件成功,则返回一个有确定执行的 FILE 类型指针;若打开失败,则返回 NULL;

  通常打开文件失败的原因有以下几个方面:

  • 指定的盘符或路径不存在;
  • 文件名中含有无效字符;
  • 以 r 模式打开一个不存在的文件;

2.3、文件的关闭

  文件在使用完毕后,应使用 fclose() 函数将其关闭,fclose() 函数 和 fopen() 函数一样,函数原型也在 stdio.h 中,其函数原型如下:

int fclose( FILE *stream );

  fclose() 函数也返回一个值,当正常完成关闭操作时,fcolse() 函数返回值为 0,否则返回 EOF。

在程序结束之前应关闭所有文件,这样做的目的是防止因为没有关闭文件而造成的数据流失;

三、文件的读写操作

3.1、fputc()与fgetc()函数

  fputc() 函数的作用是把一个字符写到磁盘文件(strem所指向的文件)中去。如果函数写入成功,则返回值就是写入的字符;如果写入失败,就返回 EOF。fputc() 函数的一般形式如下:

int fputc( int ch, FILE *stream );

  其中,ch 是要写入的字符,它可以是一个字符常量,也可以是一个字符变量。stream 是文件指针变量。

  fgetc() 函数的作用是从指定的文件(fp 指向的文件)读入一个字符赋给指定的变量。该文件必须必须是以只读或读写的方式打开。当文件遇到文件结束符将返回一个文本结束标志 EOF。fgetc() 函数的一般形式如下:

int fgetc( FILE *stream );

  其中,strem 表示要读取的文件对象;

#include <stdio.h>

int main()
{
    FILE *fp;
    char writeCh,readCh;

    if((fp = fopen("E:\\text.txt","w")) == NULL)        // 以只写模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    printf("请输入一个字符:");
    scanf("%c",&writeCh);

    if((fputc(writeCh,fp)) == EOF)                           // 写入一个字符
    {
        printf("写入失败!\n");
    }
    else
    {
        printf("写入成功!\n");
    }

    fclose(fp);                                         // 关闭文件,保留写入的内容

    if((fp = fopen("E:\\text.txt","r")) == NULL)        // 以只读模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    readCh = fgetc(fp);                                     // 从文件中读取一个字符
    printf("从文件中读取的字符为:%c\n",readCh);

    fclose(fp);                                         // 关闭文件

    return 0;
}

3.2、fputs()与fgets()函数

  fputs() 函数与 fputc() 函数类似,区别在于 fputc() 函数每次指向文件写入一个字符,而 fputs() 函数每次向文件写入一个字符串,其中字符串可以是字符串常量,也可以是字符数组名、指针或变量。该函数不会字符串结尾的 '\0'写入。如果调用成功,返回一个非零值,否则返回 EOF。。fputs() 函数的一般形式如下:

int fputs( const char *restrict str, FILE *restrict stream );

  其中,str 表示要写入的字符串,stream 表示要写入的文件指针。

  fgets() 函数与 fgetc() 函数类似,区别在于 fgetc() 函数每次从文件中读出一个字符,而 fgets() 函数每次从指定的文件中读取一个字符串到字节数组中。当读取到换行符('\n')或文件结束符(EOF)表示读取结束。如果成功则返回 str 指向的地址,如果没读入任何字符遇到 EOF,则 str 会指向的位置保留原有的内容,函数返回 NULL。。fgets() 函数的一般形式如下:

char *fgets( char *restrict str, int count, FILE *restrict stream );

  其中,str 用来存放从文件中读取的字符串,count 用来指定读取的字节数(包括 '\0'),strem 表示要读取的文件对象。

#include <stdio.h>
#include <string.h>

int main()
{
    FILE *fp;
    char wiriteStr[100],readStr[100];

    if((fp = fopen("E:\\text.txt","w")) == NULL)        // 以只写模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    printf("请输入一个字符串:\n");
    gets(wiriteStr);
    if((fputs(wiriteStr,fp)) == EOF)                    // 写入一个字符串,不能写入中文
    {
        printf("写入失败!\n");
    }
    else
    {
        printf("写入成功!\n");
    }
  
    fclose(fp);                                         // 关闭文件,保留写入的内容

    if((fp = fopen("E:\\text.txt","r")) == NULL)        // 以只读模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    fgets(readStr,strlen(wiriteStr)+1,fp);             // 从文件中读取一个字符串
    printf("从文件读取的字符串为:\n");
    printf("%s\n",readStr);

    fclose(fp);                                         // 关闭文件

    return 0;
}

3.3、fprintf()与fscanf()函数

  fprintf() 函数与 printf() 函数类似,它们之间最大区别在于 fprintf() 函数读写的对象不是终端,而是文件。fprintf() 函数的一般形式如下:

int fprintf( FILE *restrict stream, const char *restrict format, ... );

  其中,strem 表示要操作的文件对象,format 是格式化字符串,与 printf() 函数类似,由格式化占位符和普通字符组成。格式化占位符以 % 开头,用于指明参数值如何格式化。

  fscanf() 函数与 scanf() 函数类似,它们之间最大区别在于 fscanf() 函数读写的对象不是终端,而是文件。fscanf() 函数的一般形式如下:

int fscanf( FILE *restrict stream, const char *restrict format, ... );

  其中,strem 表示要操作的文件对象,format 是格式化字符串,与 scanf() 函数类似,由格式化占位符和普通字符组成。格式化占位符以 % 开头,用于指明参数值如何格式化。

#include <stdio.h>

int main()
{
    FILE *fp;
    char writeStr[100],readStr[100];

    if((fp = fopen("E:\\text.txt","w")) == NULL)        // 以只写模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    printf("请输入一个字符串:\n");
    scanf("%s",writeStr);                               // 写入一个字符串,不能写入中文,字符串不能有空格
    fprintf(fp,"%s",writeStr);

    fclose(fp);                                         // 关闭文件,保留写入的内容

    if((fp = fopen("E:\\text.txt","r")) == NULL)        // 以只读模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    fscanf(fp,"%s",readStr);                            // 从文件中读取一个字符串
    printf("从文件中读取的字符为:\n");
    printf("%s\n",readStr);

    fclose(fp);                                         // 关闭文件

    return 0;
}

3.7、fwrite()与fread()函数

  fwrite() 函数的作用是将 buffer 所指向的内容输出 count 次,每次写 size 字节到 stream 所指向的文件中。返回值是实际写入文件中的元素个数。fwrite() 函数的一般格式如下:

size_t fwrite( const void *restrict buffer, size_t size, size_t count, FILE *restrict stream );

  其中,buffer 是一个指针,要写入文件的数据的地址,size 表示要写的字节数,count 表示要写多少个 size 字节的数据相,fp 表示要写入的文件。

  fread() 函数的作用是从 stream 所指向的文件中读入 count 次,每次读 size 字节,读入的信息保存在 buffer 地址中。返回值是实际读取到的元素个数。fread() 函数的一般形式如下:

size_t fread( void *restrict buffer, size_t size, size_t count, FILE *restrict stream );

  其中,buffer 是一个指针,要读入文件的数据的地址,size 表示要读的字节数,count 表示要读多少个 size 字节的数据相,stream 表示要写读的文件。

#include <stdio.h>
#include <string.h>

int main()
{
    FILE *fp;
    char writeStr[100],readStr[100];

    if((fp = fopen("E:\\text.txt","w")) == NULL)            // 以只写模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    printf("请输入一个字符串:\n");
    gets(writeStr);

    fwrite(writeStr,sizeof(char),strlen(writeStr)+1,fp);    // 连续写入一个字符到文件

    fclose(fp);                                             // 关闭文件,保留写入的内容

    if((fp = fopen("E:\\text.txt","r")) == NULL)            // 以只读模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    fread(readStr,sizeof(char),strlen(writeStr)+1,fp);      // 从文件中连续读取一个字符
    printf("从文件中读取的内容为:\n");
    printf("%s\n",readStr);

    fclose(fp);                                         // 关闭文件

    return 0;
}

四、文件的定位

4.1、fseek()函数

  fseek() 函数的作用时移动文件内部位置指针,fseek() 函数的一般形式如下:

int fseek( FILE *stream, long offset, int origin );

  其中,stream 指定要操作的文件对象。offset 表示要移动的字节数,要求位移量是 long 型数据,以文件长度大于 64KB 时不会出错。当用常量表示位移量时,要求加后缀 L。origin 表示从何处开始计算位移量,规定的起始点有 文件首、文件当前位置 和 文件尾。

起始点 表示符号 数字表示
文件首 SEEK_SEK 0
文件当前位置 SEEK_CUR 1
文件尾 SEEK_END 2
#include <stdio.h>
#include <string.h>

int main()
{
    FILE *fp;
    char writeStrp[100],readStr[100];

    if((fp = fopen("E:\\text.txt","w")) == NULL)        // 以只写模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    printf("请输入一个字符串:\n");
    gets(writeStrp);
    if((fputs(writeStrp,fp)) == EOF)                    // 写入一个字符串到文件中,不能写入中文
    {
        printf("写入失败!\n");
    }
    else
    {
        printf("写入成功!\n");
    }
  
    fclose(fp);                                         // 关闭文件,保留写入的内容

    if((fp = fopen("E:\\text.txt","r")) == NULL)        // 以只读模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    fseek(fp,5L,0);                                     // 文件指针偏移5

    fgets(readStr,strlen(writeStrp)+1,fp);              // 从文件中读取一个字符串
    printf("从文件读取的字符串为:\n");
    printf("%s\n",readStr);

    fclose(fp);                                         // 关闭文件

    return 0;
}

4.2、rewind()函数

  rewind() 函数的作用是使文件位置指针从新返回文件的开头,该函数没有返回值。rewind() 函数的一般格式如下:

void rewind( FILE *stream );

  其中,stream 指要操作的文件对象。

#include <stdio.h>
#include <string.h>

int main()
{
    FILE *fp;
    char writeStrp[100],readStr[100];

    if((fp = fopen("E:\\text.txt","w")) == NULL)        // 以只写模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    printf("请输入一个字符串:\n");
    gets(writeStrp);
    if((fputs(writeStrp,fp)) == EOF)                    // 写入一个字符串到文件中,不能写入中文
    {
        printf("写入失败!\n");
    }
    else
    {
        printf("写入成功!\n");
    }
  
    fclose(fp);                                         // 关闭文件,保留写入的内容

    if((fp = fopen("E:\\text.txt","r")) == NULL)        // 以只读模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    fseek(fp,5L,0);                                     // 文件指针偏移5

    fgets(readStr,strlen(writeStrp)+1,fp);              // 从文件中读取一个字符串
    printf("从文件读取的字符串为:\n");
    printf("%s\n",readStr);


    rewind(fp);                                         // 文件指针回到头部

    fgets(readStr,strlen(writeStrp)+1,fp);              // 从文件中读取一个字符串
    printf("从文件读取的字符串为:\n");
    printf("%s\n",readStr);

    fclose(fp);                                         // 关闭文件

    return 0;
}

4.3、ftell()函数

  ftell() 函数的作用是得到流式文件中的当前位置,用相对于文件开头的偏移量来表示。当 ftell() 函数返回 -1L 时,表示出错。ftell() 函数的一般形式如下:

long ftell( FILE *stream );

  其中,stream 表示要操作的文件。

#include <stdio.h>
#include <string.h>

int main()
{
    FILE *fp;
    char *str;
    long position;

    if((fp = fopen("E:\\text.txt","w")) == NULL)        // 以只写模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    printf("请输入一个字符串:\n");
    gets(str);
    if((fputs(str,fp)) == EOF)                          // 写入一个字符串到文件中,不能写入中文
    {
        printf("写入失败!\n");
    }
    else
    {
        printf("写入成功!\n");
    }
  
    fclose(fp);                                         // 关闭文件,保留写入的内容

    if((fp = fopen("E:\\text.txt","w")) == NULL)        // 以只读模式打开文件
    {
        printf("打开文件失败");
        return 0;
    }

    fseek(fp,5L,0);                                     // 文件指针偏移5

    position = ftell(fp);
    printf("文件指针当前位置为:%d\n",position);

    fclose(fp);                                         // 关闭文件

    return 0;
}

标签:fp,文件,15,函数,写入,printf,操作,打开
From: https://www.cnblogs.com/kurome/p/17210936.html

相关文章

  • lvgl入门学习第五篇lv_conf.h文件
    lv_conf.h是一个用户级别的文件不同工程可以有不同的lv_conf.h1、lv_conf.h文件介绍包含10个板块,lv_conf.h可以再下图中位置找到,并打开。......
  • Linux-等保加固-记录用户的登录和操作日志
    通过脚本代码实现记录所有用户的登录操作日志,防止出现安全事件后无据可查修改/etc/profile配置文件,在配置文件中新增以下内容 vi/etc/profileihistoryUSER=`whoam......
  • HUSTOJ后台文件上传文件大小限制修改
    1.首先根据提示,到Ubuntu系统平台相关目录下找到php.ini,修改相应变量值。2.正常情况下,设置后可以实现大文件上传。3.若依旧出现413RequestEntityTooLarge,则需要修改N......
  • HUSTOJ后台公告KindEditor编辑器中文件上传类型限制修改
    1.进入Ubuntu系统,/home/judge/src/web目录2.搜索找到KindEditor文件夹3.进入PHP文件夹,打开upload_json.php4.按照提示找到限制上传文件类型的代码,添加相应文件扩展名即......
  • 傻瓜式Java操作MySQL数据库备份(使用mysqldump命令)
    傻瓜式Java操作MySQL数据库备份(使用mysqldump命令)注释都是由chatGPT生成,有什么问题可以评论交流@Value("${backup.sql.database}")privateStringdatabases;......
  • Linux操作系统file命令 – 识别文件类型
    前言file命令用来识别文件类型,也可用来辨别一些文件的编码格式。(是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的)语法file[参数]......
  • JSch - Java实现的SFTP(文件上传下载)
    JSch-SFTP文件上传下载目录JSch-SFTP文件上传下载1.JSch简介2.ChannelSftp常用ApiJSch支持三种文件传输模式文件上传put()方法文件下载get()方法3.SFTP上传......
  • 达梦数据库linux下误删数据文件恢复
    达梦数据库linux下误删数据文件恢复数据找回分为两种方式,一种是利用数据迁移工具将数据迁移到新的正常的数据库实例上,一种是将删除的数据文件找回进行恢复,前提条件:数据文......
  • 「解题报告」ARC158D Equation
    好神仙的题。考虑形如\(F(x,y,z)=x^i+y^i+z^i\)的函数有一个性质:\(F(tx,ty,tz)=t^iF(x,y,z)\)。原式要求\((x+y+z)(x^n+y^n+z^n)(x^{2n}+y^{2n}+z^{2n......
  • 群晖提示无法安装此文件问题解决
    安装群晖的时候你可能会碰到如下情况:群晖安装DSM的时候提示:“无法安装此文件,文件可能已经毁损。(13)”还是讨厌的红色其实是U盘引导没有修改VID所致,用ChipGenius芯片精灵......