C语言文件io操作

news2024/11/16 11:33:02

一、fopen

在C语言中,操作文件之前应该先打开文件。使用<stdio.h>头文件中的fopen()函数可以打开文件,因为FILE也是结构体,我们通过返回一个文件指针就可以对文件进行操作。在用完fopen之后要记得关闭该文件流。

用法:

FILE* fl = fopen("文件名","打开方式");

其中打开方式有:

 为了实现低耦合我们也可以这样写:

int main(int arg,char* argv[])
{
    FILE* fl = fopen(argv[1],"打开方式");
    
    fclose(fl);
    return 0;
}

因为在main函数中我们传入的是一个指向字符串的指针数组所以我们可以用argv[1]来表示传入的第二个字符串,一般我们Linux中第一个传入的参数是所要编译的文件,第二个才是所要操作的文件,所以可以这样写。这样我们就可以打开一个文件了,但是我们还没有对文件进行读写操作,所以控制台还不会有任何输出。

为了判断文件是否打开成功我们还可以用if语句进行判断一下:

int main(int arg,char* argv[])
{
    FILE* fl = fopen(argv[1],"打开方式");
    
    if(fl == NULL)
{
    perror("fopen error!\n");
    exit(0);
}
    
    fclose(fl);
    return 0;
}

如果fl打开失败则用函数perror打印一下,然后用exit(0)终止程序。注意:用exit()函数要加上include<stdlib.h>头文件 

二、fgetc

这个是最简单的读文件操作,这个函数用来从文件指针指向的文件中读一个字符,返回的值是读取的字符,如果发生错误则返回EOF

用法:

fgetc(文件指针);

int main()
{
    FILE* fl = fopen("test.txt","r");
    
    char ch = fgetc(fl);
    printf("%c",ch);

    fclose(fl);
    return 0;
}

在其中我们以只读的方式打开了文件test.txt,用fgetc()获取的fl指向文件的第一个字符,并把其赋值给了ch,假设我们test.txt文件内容是这样的:

abcd

则打印结果是:

 a

 三、fgets

与上面的fgetc()函数不同的是,fgets()函数是从一个文件中一次性读一行数据,并且它会把读取的字符串复制到缓冲区buf,并在最后追加一个null字符来终止字符串。

用法:

fgets(char *buf, int n, FILE* fl);

#define 10 SIZE
int main(int arg,char* argv[])
{
    FILE* fl = fopen(argv[1],"r");
    
    char buf[20];
    fgets(buf,SIZE,fl);
    fclose(fl);
    return 0;
}

 其中有两种情况:

1、当SIZE大于一行的字符串时,那么当读到字符串末尾的换行符时,fgets()会返回,并在buf的最后面插入字符串结束标志'\0'。而buf缓冲区剩余的位置不会再填充

2、当SIZE小于一行的字符串时,那么会读入n-1个字符,此时并没有读到末尾的'\n',但是还是会在buf缓冲区末尾加上'\0'

可以用while循环来输出fgets()函数读入的字符串

#define 10 SIZE
int main(int arg,char* argv[])
{
    FILE* fl = fopen(argv[1],"r");
    
    char buf[20];

    while(fgets(buf,SIZE,fl)!=NULL)
{
    printf("%s",buf);
}
    fclose(fl);
    return 0;
}

三、fputc

fputc是向指定的文件中写入一个字符

 用法:

fputc(int ch,FILE* fl);

其中ch为要写入的字符,fl为文件指针,fputc()写入成功时返回要写入的字符,失败时返回EOF

如:

#define 10 SIZE
int main(int arg,char* argv[])
{
    FILE* fl = fopen(argv[1],"a");
    
    char ch = 'a';
    fputc(ch,fl);
    fclose(fl);
    return 0;
}

注意:此时用的打开文件方式是a,a是往文件后面追加的意思,不会覆盖文件里面已有的内容,而用w的话就会覆盖掉文件里面已有的内容。

四、fputs

fputs()函数是将一行字符串写入到指定的文件中,但不包括空字符
用法:

fputs(char *str,FILE* fl);

 其中 str是要输入的字符串,fl是指向所要写入的文件的指针

#define 10 SIZE
int main(int arg,char* argv[])
{
    FILE* fl = fopen(argv[1],"打开方式");
    
    fputs("aabbcc",fl);
    fclose(fl);
    return 0;
}

其中将字符串aabbcc写入到了fl指向的文件中。

五、fscanf

fscanf函数是根据format格式从fl中读取数据,与fgets类似

int fscanf(FILE *fl, const char *format, [argument...]);

 其中fl是指向文件的指针,format是格式字符串,[argument...]是接收字符串的参数。fscanf()遇到空格、回车会断开,fgets遇到回车会断开

如:

#define 10 SIZE
int main(int arg,char* argv[])
{
    FILE* fl = fopen(argv[1],"r+");
    
    while(!feof(fl))
{
    char buf[10] = {0};

    fscanf(fl,%s,buf);
    printf("%s",buf);
}
    fclose(fl);
    return 0;
}

其中定义了一个buf缓冲区,将读取到的字符放到buf中,然后输出

六、fprintf

fprintf()函数用于向文件中输出格式化文本,与fputs类似

该函数类似于printf函数,只是printf将文本打印到命令窗口中,fprintf将文本输出到文件中

用法:

int fprintf (FILE* fl, const char*format, [argument...])

其中,fl为指向文件的指针,format为要写入格式,[argument]为可变参数。

 #include<stdio.h>
   #include<stdlib.h>
   int main(int arv,char *argv[])
   {
 
      FILE *fl = fopen(argv[1],"a");
  
       if(fl == NULL)
       {
          perror("error!\n");
          exit(0);
      }
 
      char str[] = "abcdef";
    for(int i=0;i<6;i++){
      fprintf(fl,"buf[%d] = %c\n",i,str[i]);
     }
      fclose(fl);

    return 0;
 }

其中定义了一个字符串str,并用fprintf函数将该字符串以"buf[%d] = %c\n"格式输入到fl指向的文件中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/817951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小目标检测(3)——msgqueue多线程通信和多线程互斥编程

文章目录 引言正文代码的执行和线程使用std::mutex进行编程mutex基本用法std::lock_guard的使用std::unique_lock的使用 condition_variable的使用wait函数的使用condition_variable的整体代码 多线程编程的基本语句 总结引用 引言 在学习老师给的目标检测的代码过程中&#xf…

红队攻防 | 解决HW被疯狂封IP姿势~(附下载)

本项目其实就是个简单的代理服务器&#xff0c;经过小小的修改。加了个代理池进来。渗透、爬虫的时候很容易就会把自己ip给ban了&#xff0c;所以就需要ip代理池了。 ProxyPool 爬虫代理IP池项目,主要功能为定时采集网上发布的免费代理验证入库&#xff0c;定时验证入库的代理…

排序算法(冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序、计数排序)

&#x1f355;博客主页&#xff1a;️自信不孤单 &#x1f36c;文章专栏&#xff1a;数据结构与算法 &#x1f35a;代码仓库&#xff1a;破浪晓梦 &#x1f36d;欢迎关注&#xff1a;欢迎大家点赞收藏关注 文章目录 &#x1f353;冒泡排序概念算法步骤动图演示代码 &#x1f34…

ED透明屏有哪些应用场景?

ED透明屏是一种新型的显示技术&#xff0c;它采用了电致变色技术&#xff0c;可以实现屏幕的透明显示。ED透明屏的出现&#xff0c;为我们的生活带来了许多便利和创新。 首先&#xff0c;ED透明屏可以应用于商业广告领域。 传统的广告牌往往是固定的&#xff0c;无法改变内容&…

浅入浅出MySQL事务

什么是事务 事务是由数据库中一系列的访问和更新组成的逻辑执行单元。 事务的逻辑单元中可以是一条SQL语句&#xff0c;也可以是一段SQL逻辑&#xff0c;这段逻辑要么全部执行成功&#xff0c;要么全部执行失败。 事务处理的基本原则是“原子性”、“一致性”、“隔离性”和…

vue 修改端口号

在根目录创建一个vue.config.js文件夹 module.exports {lintOnSave: false,devServer: {port: 3000,open: true} }运行后

降压IC 外置MOS DC48V转24V 3A 30V-80V转24V 3A 高压大功率

摘要&#xff1a;本文介绍了AH8A50QA降压IC外置MOS芯片方案&#xff0c;可将输入电压范围从30V至80V和9V至100V转换为24V输出&#xff0c;并提供最大3A的输出电流。该芯片方案采用了内置MOS管和QFN-20封装&#xff0c;适用于电动车和汽车车载充电源等高压大功率应用场景。 随着…

Cpp6 — 模板

模板&#xff1a;这里有一个概念&#xff1a;泛型编程---针对广泛的类型去写代码编程。之前都是针对具体的类型进行编程。 模板分为函数模板和类模板。 函数模板 当我们想要使用一个swap可以用作多种类型时&#xff0c;可以使用模板。这样我们就可以不使用重载&#xff0c;不…

商城小程序踩坑(一):iPhone 11、iPhoneX 等设备底部安全区域/小黑条适配

一、前言 这两天正在开发商城小程序-商品详情页&#xff0c;在做设备测试的时候突然发现详情页底部—— 购物车 和 购买区域在苹果手机上不适配&#xff0c;并且还存在小黑条。 底部功能没有办法正常使用。 如下图所示&#xff1a; 解决后效果&#xff0c;如下图所示&#xff…

Swagger之Hello World !

目录 ■1&#xff0e;前言・Swagger介绍 ■2&#xff0e;例子&#xff0c;如果基于Spring Boot项目&#xff0c;实现Swagger---非常简单 2&#xff0e;1&#xff0e;已有的SpringBoot项目 2&#xff0e;2&#xff0e;修改POM文件 2&#xff0e;3&#xff0e;添加Config文件…

html请求谷歌音频跨域问题(谷歌翻译接口)虚拟机ping不通google(下载谷歌音频、下载百度翻译音频)

文章目录 调用谷歌翻译接口&#xff0c;尝试了几种方案&#xff0c;都提示跨域不行第一种&#xff08;通过js代码获取音频文件的Blob对象&#xff0c;提示跨域了&#xff09;代码结果 第二种&#xff08;尝试新窗打开音频url&#xff0c;404&#xff0c;估计也是跨域了&#xf…

StarRocks Friends 广州站精彩回顾

上周六&#xff0c;StarRocks & Friends 活动在羊城广州成功举行&#xff0c;社区的小伙伴齐聚一堂&#xff0c;共同探讨了 StarRocks 在业界的应用实践和湖仓一体等热门话题。 本文总结了技术交流活动的关键内容和视频资料&#xff0c;感谢社区每一位小伙伴的支持和参与&…

如何提高接口测试覆盖率?

接口测试是测试系统组件间接口的一种测试。 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测试该如何提高测试的覆盖率呢&#…

PCL点云处理之最小二乘空间直线拟合(3D) (二百零二)

PCL点云处理之最小二乘空间直线拟合(3D) (二百零二) 一、算法简介二、实现代码三、效果展示一、算法简介 对于空间中的这样一组点:大致呈直线分布,散乱分布在直线左右, 我们可采用最小二乘方法拟合直线,更进一步地,可以通过点到直线的投影,最终得到一组严格呈直线分布…

软件测试一周面试十家公司,分享面试经历

从开始面试讲起&#xff0c;公司规模我分成5类&#xff1a;创业公司0-20人&#xff0c;小型公司20-40人&#xff0c;中小型50-99&#xff0c;中型公司100-499即将上市的那种&#xff0c;已上市公司100-499。 创业公司 第一个面试的那家创业公司特别坑&#xff0c;开始面试&am…

4年测试“我“该何去何从?测试还是测试开发?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 4年测试&#xff…

秋招备战笔试Day2

目录 单选 1.A 派生出子类 B &#xff0c; B 派生出子类 C &#xff0c;并且在 java 源代码有如下声明&#xff1a; 2.下面代码将输出什么内容&#xff1a;&#xff08;&#xff09; 3.阅读如下代码。 请问&#xff0c;对语句行 test.hello(). 描述正确的有&#xff08;&…

vlan access, trunk, hybrid (tagged/untagged) 笔记

vlan 接口和配置 PVID&#xff08;port vlan ID&#xff09; 定义 pvid 主要目的&#xff1a; 当交换机接口收到没有 vlan tag 标签的包时&#xff0c;接口会将定义的 pvid 作为当前包的 vlan id。当对映 pvid vlan 的包&#xff0c;通过当前交换机接口发出时&#xff0c;接…

ADSelfService Plus:保护密码安全的最佳解决方案

密码安全是当今数字时代中至关重要的话题。随着互联网和信息技术的迅速发展&#xff0c;我们的生活变得越来越数字化&#xff0c;密码已成为我们生活中不可或缺的一部分。然而&#xff0c;随着各种网络威胁和黑客攻击不断增加&#xff0c;保护我们的密码变得越来越重要。 密码安…

测试工程师刚入职如何快速熟悉需求并输出测试用例?

刚入职第一天&#xff0c;早上办完入职&#xff0c;下午就就分配了测试任务&#xff0c;2个模块13条短信验证&#xff0c;2天内输出测试用例&#xff08;xmind输出功能点&#xff0c;excel书写业务流&#xff09;。测试负责人给我们快速讲了一下业务&#xff0c;在这过程中大概…