当前位置: 首页 > news >正文

C语言文件基本操作

这里咱们不写那么细,就复习一下常用的文件操作。分别是文件的打开和关闭,还有读写。

1.首先介绍一下文件指针

对文件的操作都是由文件指针来完成的,它是一个结构体,保存文件有关的信息。该结构体由系统实现,我们只需要记得使用时写成这样即可:

FILE *fp;

2.文件的打开

fopen函数用来打开文件。

FILE *fp;
fp = fopen(文件名,使用文件方式);

常用的文件使用方式:

        只是文本文件的,二进制文件大家需要自行百度一下。

文件使用方式含义
r(只读)打开一个文本文件,只允许读数据
w(只写)打开或建立一个文本文件,只允许写数据
a(追加)打开一个文本文件,并在文件末尾写数据
r+,w+,a+对应功能不变,只是均支持读写操作

 3.文件的关闭

fclose(文件指针);

4.文件的读写

这一部分的函数有很多。

(1)fputc()函数和fgetc()函数

ch = fputc(ch,fp);
ch = fgetc(ch,fp);

下面举个例子演示:

首先在D盘下的CFILE文件夹下创建一个test.txt文件

 然后是我们的文件的写入程序:

#include <stdio.h>

int main()
{
    FILE* fp;
    char ch;
    fp = fopen("D:\\CFILE\\test.txt", "w");//注意从文件夹复制过来的路径只有一个斜杠,我们自己要加一个
    if (fp == NULL) {
        printf("文件打开失败");
        return 0;
    }
    ch = getchar();
    while (ch != '#') {
        fputc(ch, fp);
        ch = getchar();
    }
    fclose(fp);
    return 0;
}

 

我们的结果:

 接下来是读操作的例子:

就读我们刚刚创建的这个文件。

#include <stdio.h>

int main()
{
    FILE* fp;
    char ch;
    fp = fopen("D:\\CFILE\\test.txt", "r");//注意从文件夹复制过来的路径只有一个斜杠,我们自己要加一个
    if (fp == NULL) {
        printf("文件打开失败");
        return 0;
    }
    ch = fgetc(fp);
    while (ch != EOF) {
        printf("%c ", ch);
        ch = fgetc(fp);
    }
    fclose(fp);
    return 0;
}

运行结果:

 

(2)fputs()函数和fgets()函数

        与fputc()函数和fgetc()函数完全类似,只不过变成了对字符串操作。

fputs(字符串,文件指针);
fgets(字符数组名,n,文件指针);

        n是得到的字符串中字符的个数(包含'\0');

(3)fprintf()函数和fscanf()函数

        格式输出输入函数,与printf()函数和scanf()函数的区别就是读写对象不同,前者是磁盘文件,后者是终端。

例:它的作用是将整形变量i的值以"%d"的格式输出到fp指向的文件中。

fprintf(文件类型指针,格式字符串,输出列表);
fprintf(fp,"%d",i);
fscanf(文件类型指针,格式字符串,输入列表);
fscanf(fp,"%d",&i);

 一个fscanf()函数的例子:

首先在test.txt中写5个字母,一会用程序将他们以整数形式输出。

#include <stdio.h>

int main()
{
    FILE* fp;
    char ch;
    fp = fopen("D:\\CFILE\\test.txt", "r");//注意从文件夹复制过来的路径只有一个斜杠,我们自己要加一个
    if (fp == NULL) {
        printf("文件打开失败");
        return 0;
    }
    char j;
    for (int i = 0; i < 5; i++) {
        fscanf(fp, "%c", &j);
        printf("%d is %5d\n", i + 1, j);
    }
    fclose(fp);
    return 0;
}

(4)fread()函数和fwrite()函数

前面介绍的fpute和fgetc函数,每次只能读写文件中的一个字符,但是在编写程序的过程中往往需要对整块数据进行读写,例如,对一个结构体类型变量值进行读写。下面就介绍实现整块读写功能的fread和fwrite函数。

fread函数的一般形式如下:

fread(buffer,size,count,fp);

该函数的作用是从fp所指的文件中读入count次,每次读size字节,读入的信息存在buffer地址中。fwrite函数的一般形式如下:

fwrite(buffer,size,count,fp);

该函数的作用是将buffer地址开始的信息输出count次,每次写size字节到fp所指的文件中。

buffer:一个指针。对于fwrite函数来说,是要输出数据的地址(起始地址);对fread函数来说,是所要读入的数据存放的地址。

size:要读写的字节数。

count:要读写多少个size字节的数据项。

fp:文件型指针。

例如:fread(a,2,3,fp);其含义是从p所指的文件中每次读两个字节送入实数组a中,连续读3次。fwrite(a,2,3,fp);其含义是将a数组中的信息每次输出两个字节到fp所指向的文件中,连续输出3次。

举一个今天上课用到的例子吧:

学生信息管理系统

#include <stdio.h>
typedef struct student {
    char name[30];
    char age[10];
    char phone[15];
}student;
student stu[100];
int main()
{
    FILE* fp;
    char ch;
    fp = fopen("D:\\CFILE\\test.txt", "w");//注意从文件夹复制过来的路径只有一个斜杠,我们自己要加一个
    if (fp == NULL) {
        printf("文件打开失败");
        return 0;
    }
    printf("请问有多少学生?");
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        printf("请输入第%d位学生的姓名,年龄,电话号码:\n", i + 1);
        scanf("%s%s%s", stu[i].name, stu[i].age, stu[i].phone);
        fwrite(&stu[i], sizeof(student), 1, fp);
    }

    fclose(fp);
    return 0;
}

 

 

 

相关文章:

  • 2022年全球及中国疏水阀行业头部企业市场占有率及排名调研报告
  • java6.2 springCloud
  • 第6章Linux实操篇-开机、重启和用户登录注销
  • 大学网课答案微信公众号接口使用方法
  • 第5章Linux实操篇-Vi和Vim编辑器
  • java6.1 springboot
  • Linux高性能服务器之I/O复用之实例 ET AND LT(图像理解)(14)
  • 计算机毕业设计django基于python大学生心理健康系统(源码+系统+mysql数据库+Lw文档)
  • java计算机毕业设计个性化推荐的扬州农业文化旅游管理平台源码+数据库+系统+lw文档+mybatis+运行部署
  • C#进阶03——常用泛型数据结构类
  • 第4章Linux实操篇-远程登录到Linux服务器
  • 【FPGA教程案例66】硬件开发板调试6——基于FPGA的UDP网口通信和数据传输
  • 第2章Linux基础篇-VM和Linux的安装
  • [NOI2022] 众数 题解
  • linux文件IO
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Angularjs之国际化
  • Bytom交易说明(账户管理模式)
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Fabric架构演变之路
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Idea+maven+scala构建包并在spark on yarn 运行
  • jdbc就是这么简单
  • JSONP原理
  • k8s 面向应用开发者的基础命令
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • tweak 支持第三方库
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 学习笔记:对象,原型和继承(1)
  • 移动端唤起键盘时取消position:fixed定位
  • 函数计算新功能-----支持C#函数
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (175)FPGA门控时钟技术
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Forward) Music Player: From UI Proposal to Code
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (四) Graphivz 颜色选择
  • (转)http协议
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net的socket示例
  • .net反混淆脱壳工具de4dot的使用
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)