前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言文件读写操作(详解)

C语言文件读写操作(详解)

作者头像
全栈程序员站长
发布于 2022-09-05 03:00:48
发布于 2022-09-05 03:00:48
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

数据流和缓冲区是什么?文件类型和文件存取方式都有啥?

  • 数据流 就C程序而言,从程序移进,移出字节,这种字节流就叫做流。程序与数据的交互是以流的形式进行的。进行C语言文件的读写时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。
  • 缓冲区 在程序执行时,所提供的额外内存,可用来暂时存放准备执行的数据。它的设置是为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多。 当使用标准I/O函数(包含在头文件stdio.h中)时,系统会自动设置缓冲区,并通过数据流来读写文件。当进行文件读取时,是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据。事实上,当写入文件时,并不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘。
  • 文件类型 文本文件和二进制文件: 文本文件是以字符编码的方式进行保存的。 二进制文件将内存中的数据原封不动的进行保存,适用于非字符为主的数据。其实,所有的数据都可以算是二进制文件。二进制文件的优点在于存取速度快,占用空间小。
  • 文件存取方式 顺序存取方式和随机存取方式: 顺序存取就是从上往下,一笔一笔读取文件的内容。写入数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件。 随机存取方式多半以二进制文件为主。它会以一个完整的单位来进行数据的读取和写入,通常以结构为单位。

什么是文件呢?

文件是一段数据的集合,这些数据可以是有规则的,也可以是无序的集合。在stdio.h有一个非常重要的东西,文件指针,每个文件都会在内存中开辟一块空间,用于存放文件的相关信息,这些信息保存在一个结构体中: struct _iobuf { char *_ptr; //指向buffer中第一个未读的字节 int _cnt; //记录剩余的未读字节的个数 char *_base;//文件的缓冲 int _flag;//打开文件的属性 int _file;//获取文件描述 int _charbuf;//单字节的缓冲,即缓冲大小仅为1个字节 int _bufsiz;//记录这个缓冲大小 char *_tmpfname;//临时文件名 }; typedef struct _iobuf FILE; FILE是一个数据结构,用于访问一个流。每个流都会对应一个FILE结构体。

C语言文件操作函数详解

C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:

  • 文件的打开 fopen():打开文件
  • 文件的关闭 fclose():关闭文件
  • 文件的读写 fgetc():读取一个字符 fputc():写入一个字符 fgets():读取一个字符串 fputs():写入一个字符串 fprintf():写入格式化数据 fscanf():格式化读取数据 fread():读取数据 fwrite():写入数据
  • 文件状态检查 feof():文件是否结束 ferror():文件读/写是否出错 clearerr():清除文件错误标志 ftell():文件指针的当前位置
  • 文件指针定位 rewind():把文件指针移到开始处 fseek():重定位文件指针

参数解释: “r”:以只读的形式打开文本文件(不存在则出错) “w”:以只写的形式打开文本文件(若不存在则新建,反之,则从文件起始位置写,覆盖原内容) “a”:以追加的形式打开文本文件(若不存在,则新建;反之,在原文件后追加) “r+”:以读写的形式打开文本文件(读时,从头开始;写时,新数据只覆盖所占的空间) “wb”:以只写的形式打开二进制文件 “rb”:以只读的形式打开二进制文件 “ab”:以追加的形式打开一个二进制文件 “rb+”:以读写的形式打开二进制文件。 “w+”:首先建立一个新文件,进行写操作,然后从头开始读(若文件存在,原内容将全部消失) “a+”:功能与”a”相同。只是在文件尾部追加数据后,可以从头开始读 “wb+”:功能与”w+”相同。只是在读写时,可以由位置函数设置读和写的起始位置 “ab+”:功能与”a+”相同。只是在文件尾部追加数据之后,可以由位置函数设置开始读的起始位置

打开文件 FILE *fopen( const char *filename, const char *mode );

  • filename:文件的路径
  • mode:打开模式

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{ 
   
    FILE* f;
    f = fopen("file.txt", "w");
    if (f != NULL)
    { 
   
        fputs("fopen example", f);
        fclose(f);
        f=NULL;
    }
    return 0;
}

注意:

  • 文件是否打开成功
  • 关闭文件
  • 文件指针置空

关闭文件 函数原型:int fclose( FILE *stream );

  • stream:流

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(fclose(f)!=0) 
{ 
   
	printf("File cannot be closed/n"); 
	exit(1); 
} 
else
{ 
   
    printf("File is now closed/n"); 
}

读取字符 int fgetc ( FILE * stream );

  • stream:流

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
int main ()
{ 
   
  FILE * pFile;
  int c;
  int n = 0;
  pFile = fopen ("D:\\myfile.txt", "r");
  if (pFile == NULL) perror ("Error opening file"); // 打开失败
  else
  { 
   
    while (c != EOF)
    { 
   
      c = fgetc (pFile); // 获取一个字符
      if (c == '$') n++; // 统计美元符号 '$' 在文件中出现的次数
    }
    fclose (pFile); // 一定记得要关闭文件
    printf ("The file contains %d dollar sign characters ($).\n",n);
  }
  return 0;
}

写入字符 int fputc( int c, FILE *stream );

  • c:要写入的字符
  • stream:流

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    char ch;
    FILE* pf = fopen("file.txt", "w");
    if (pf == NULL)
    { 
   
        perror("error opening file");
        exit(0);
    }
    ch = getchar();
    while (ch != '$')
    { 
   
        fputc(ch, pf);
        ch = getchar();
    }
    fclose(pf);

读取字符串 char * fgets ( char * str, int num, FILE * stream );

  • str:将读取到的内容复制到的目标字符串
  • num:一次读取的大小
  • stream:流

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    char buf[10] = { 
    0 };
    FILE *pf = fopen("file.txt", "r");
    if (pf == NULL)
    { 
   
        perror("open file for reading");
        exit(0);
    }
    fgets(buf, 9, stdin);
    printf("%s", buf);
    fclose(pf);

写入字符串 int fputs( const char *string, FILE *stream );

  • string:要写入的字符串
  • stream:一次读取的大小

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    char buf[10] = { 
    0 };
    FILE *pf = fopen("file.txt", "r");
    if (pf == NULL)
    { 
   
        perror("open file for reading");
        exit(0);
    }
    fgets(buf, 9, stdin);
    fputs(buf, stdout);
    fclose(pf);

读取数据块 size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

  • ptr:目标内存块
  • size:一次读取的字节大小
  • count:一次读取多少个 size
  • stream:流

例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <string.h>
 
int main()
{ 
   
    FILE *pFile = fopen("file.txt", "rb");
    if (pFile == NULL) 
    { 
   
        perror ("Error opening file");
        return 0;
    }
    char buf[100] = { 
    0 };
    while (!feof(pFile)) //没有到文件末尾
    { 
   
        memset(buf, 0, sizeof(buf));
        size_t len = fread(buf, sizeof(char), sizeof(buf), pFile);
        printf("buf: %s, len: %d\n", buf, len);
    }
    fclose(pFile);
}

写入数据块 size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream ); 同理,简单好理解,就不详细阐述了。

文件指针重定位 int fseek ( FILE * stream, long int offset, int origin );

  • stream:流
  • offset:相对应 origin 位置处的偏移量,单位为字节
  • origin:指针的位置 #define SEEK_CUR 1 // 当前位置 #define SEEK_END 2 // 末尾 #define SEEK_SET 0 // 开头

获取指针位置 long int ftell ( FILE * stream );

  • stream:流

获取文件大小 例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long n;
fseek(pf,0,SEEK_END);
n=ftell(pf);

文件指针移到开始处 void rewind( FILE *stream );

  • stream:流

清除文件错误标志 void clearerr( FILE *stream );

  • stream:流

文件流是否读到了文件尾 int feof( FILE *stream );

  • stream:流

重命名文件 int rename ( const char * oldname, const char * newname );

  • oldname:原名
  • newname:新名

删除文件 int remove ( const char * filename );

  • filename:文件的路径

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137033.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C语言】文件操作详解
如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件。
大耳朵土土垚
2024/03/13
1450
【C语言】文件操作详解
轻松拿捏C语言——【文件操作】
程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows 环境后缀为.exe)
用户11162265
2024/06/14
1030
轻松拿捏C语言——【文件操作】
C语言重点突破(六)文件操作
我们在前面的文章介绍了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。 我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。 这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。 使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
对编程一片赤诚的小吴
2024/01/23
1450
C语言重点突破(六)文件操作
C语言进阶-文件操作超详解
scanf/printf、fscanf/fprintf、sscanf/sprintf函数对比
用户9645905
2022/11/30
1K0
C语言进阶-文件操作超详解
C/C++文件操作/IO流
直接点 - 磁盘上的文件,就是文件。从文件功能的角度上,文件分有数据文件和程序文件。
二肥是只大懒蓝猫
2023/05/03
8230
C/C++文件操作/IO流
C语言中的文件和文件操作
硬盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能角度来分类的)。
用户11305458
2024/10/09
1490
C语言中的文件和文件操作
文件操作(几乎最全)
我们写的程序的数据是存储在电脑的内存中,如果没有文件,程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。
Crossoads
2024/10/21
1170
文件操作(几乎最全)
C语言进阶(十四) - 文件管理
我们知道写的C程序是运行在内存上的,当程序运行结束后,程序相关的数据就消失了,这些数据并没有保存起来。如何保存程序运行产生的数据呢?我们可以把数据保存到磁盘文件中。通过C语言的文件相关的知识,我们将会有办法把程序运行产生的数据写入我们指定的磁盘文件中。 磁盘(外存)中的文件存放的信息是持久化的,不会像运行在内存中的程序那样,在程序运行结束或突然计算机断电等情况导致数据消失。
怠惰的未禾
2023/04/27
1K0
C语言进阶(十四) - 文件管理
深入挖掘C语言 ---- 文件操作
我们程序的数据需要输出到各种外部设备, 也需要从外部设备获取数据, 不同的外部设备的输入输出操作各不相同, 为了方便程序员对各种外部设备进行方便的操作, 我们抽象出了流的概念, 我们可以把流想象成流淌着字符的河.
用户11317877
2024/10/16
1280
深入挖掘C语言 ---- 文件操作
C语言文件操作
我们前面学习结构体时,写通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。
绝活蛋炒饭
2024/12/16
1300
C语言文件操作
C语言——P/文件操作
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。
用户11015888
2024/03/11
2140
C语言——P/文件操作
C 语言文件操作详解
在 C 语言中,文件操作是一个非常重要的主题。无论是保存用户数据、配置程序、还是读写日志文件,掌握文件操作都能使你的程序更加灵活和实用。本文将带你深入了解 C 语言中的文件操作,帮助你从基础到进阶,逐步掌握文件操作的技巧。
平凡之路.
2024/10/09
2700
C 语言文件操作详解
深度解析C语言文件操作
我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以在通讯录中添加、删除数据,此时数据是存放在内存中的,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录时,数据又得重新导入,如果这样使用通讯录就很难受。 既然是通讯录就应该记录下来,只有我们自己选择删除数据得时候,数据才不复存在。这就涉及到了数据得持久化得问题,我们一般数据持久化得方法有,把数据存放在磁盘文件、存放到数据库等方式。 使用文件我们就可以将数据存放在电脑的硬盘上,做到数据的持久化。
Yui_
2024/10/16
1520
深度解析C语言文件操作
【C语言】文件操作
磁盘(硬盘)上的文件是文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。
用户11290673
2024/09/25
1490
【C语言】文件操作
【C语言】万字文件操作总结
涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。
平凡的人1
2022/11/15
6020
【C语言】万字文件操作总结
【C语言】文件操作
我们在写代码的过程中,有的时候某一些数据我们是想把它保存下来的,而不是说只有在程序运行的时候,这些数据才能被我们录入或显示出来,我们总会遇到数据持久化的场景,所以这时我们需要将数据保存下来,一般数据持久化的方式有,把数据存到磁盘文件里,或存放到数据库里面
举杯邀明月
2023/04/12
4K0
【C语言】文件操作
C语言文件操作超详解
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。
fhvyxyci
2024/09/24
1330
C语言文件操作超详解
C语言 —— 指尖跃迁 刻印永恒 - 文件操作
我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?那是因为C语言程序在启动的时候,默认打开了3个流:
迷迭所归处
2025/04/17
1110
C语言 —— 指尖跃迁 刻印永恒 - 文件操作
【C语言篇】文件操作(下篇)
上面的四个都是针对字符的输入输出,但是实际文件会有不同的数据类型,这时就需要用到格式化输入输出函数了
半截诗
2024/10/09
880
【C语言篇】文件操作(下篇)
【C语言】与文件有关的操作
数据如果存在内存中,当程序退出、断电,数据就丢失了。 而数据存在硬盘中,其实就是存储在文件中,数据就不会因为断电、程序退出就丢失了。 而想要数据持久化,就需要存在文件中。 那怎么操作文件呢?
zxctscl
2024/01/23
2030
【C语言】与文件有关的操作
相关推荐
【C语言】文件操作详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验