C语言文件处理

文件写入

基础示例

核心代码:

fprintf(fp, "hello c file!\n");

完整代码:

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 以只写方式打开文件fp = fopen("test.txt", "w"); // r w a r+ w+ a+// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}printf("open success!\n");// 写入文件fprintf(fp, "hello c file!\n");// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

fprintf按照指定格式写入文件

核心代码:

int i = 33;
char c[] = "zhangdapeng";
double d = 33.33;
fprintf(fp, "%d %s %lg\n", i, c, d);

完整代码:

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 以只写方式打开文件fp = fopen("test.txt", "w"); // r w a r+ w+ a+// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}printf("open success!\n");// 写入文件int i = 33;char c[] = "zhangdapeng";double d = 33.33;fprintf(fp, "%d %s %lg\n", i, c, d);// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

练习:读写格式字符

需求:

  • 将int类型,字符串类型,double类型的三个变量的值按照空格分割写入到test.txt文件中
  • 读取test.txt中的一行文本,然后转换为int类型,字符串类型和double类型的变量并输出

编写write.c,实现格式化写入的功能代码:

#include <stdio.h>int main(){FILE *fp = NULL;fp = fopen("test.txt", "w");if (fp == NULL){printf("open failed!\n");return -1;}printf("open success!\n");int age = 33;char name[] = "zhangdapeng";double weight = 83.7;fprintf(fp, "%d %s %lg\n", age, name, weight);fclose(fp);fp = NULL;return 0;
}

使用gcc编译:

gcc write.c -o write

执行:

./write

查看当前目录:

ls

查看文件内容:

cat test.txt

输出:

33 zhangdapeng 83.7

编写read.c,实现读取格式化字符的功能。

#include <stdio.h>int main(){FILE *fp = NULL;fp = fopen("test.txt", "r");if (fp == NULL){printf("open failed!\n");return -1;}printf("read the test.txt success!\n");int newAge;char newName[128];double newWeight;fscanf(fp, "%d %s %lg\n", &newAge, newName, &newWeight);printf("newAge = %d, newName = %s, newWeight = %f\n", newAge, newName, newWeight);fclose(fp);fp = NULL;printf("read the format string success!\n");return 0;
}

编译代码:

gcc read.c -o read

执行代码:

./read

输出:

read the test.txt success!
newAge = 33, newName = zhangdapeng, newWeight = 83.700000
read the format string success!

标准输出

stdin标准输入,stdout标准输出,stderr标准错误输出。

核心代码:

fprintf(stdout, "%d %s %lg\n", i, c, d);

示例代码:

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "r"); // r w a r+ w+ a+// 判断是否打开成功if (fp == NULL) {printf("open test.txt failed!\n");return -1;}// 读取文件int i;char c[128];double d;fscanf(fp, "%d %s %lg\n", &i, c, &d);// 输出fprintf(stdout, "%d %s %lg\n", i, c, d);// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

输出:

33 zhangdapeng 33.33

fputc每次写一个字符

示例代码:

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "a");// 判断是否打开成功if (fp == NULL) {printf("open test.txt failed!\n");return -1;}// 每次写一个字符fputc('a', fp);fputc('b', fp);fputc('c', fp);// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

fputs写入字符串到文件

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "w");// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}// 写入字符串fputs("abc1\n", fp);fputs("abc2\n", fp);fputs("abc3\n", fp);// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

fwrite按块写入文件

这个方法非常适合处理大文件。如果要写入大型文件,优先考虑使用此方法。

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "w");// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}// 写入文件char buf[] = "abc";int count = fwrite(buf, 1, sizeof(buf), fp);printf("写入了%d个字节的数据\n", count);// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

fwrite写入结构体数组

#include <stdio.h>typedef struct person {int id;char name[32];
} Person;int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "w");// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}// 结构体数组Person arr[] = {{1, "张三"},{2, "李四"},{3, "王五"},};// 写入文件int count = fwrite(arr, 1, sizeof(arr), fp);printf("写入了%d个字节的数据\n", count);// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

文件读取

打开模式

  • r:只读
  • w:只写
  • a:追加
  • r+:可读可写,但是不会创建文件
  • w+:可读可写,不存在则创建
  • a+:追加,不存在会创建文件
  • rb:读二进制文件
  • wb:写二进制文件

一个程序,默认最多只能打开1024个文件。

基础示例

示例代码:

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 以只写方式打开文件fp = fopen("test.txt", "w"); // r w a r+ w+ a+// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}printf("open success!\n");// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

输出:

open success!

fscanf 按照指定格式读取文件

核心代码:

int i;
char c[128];
double d;
fscanf(fp, "%d %s %lg\n", &i, c, &d);

完整代码:

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "r"); // r w a r+ w+ a+// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}printf("open success!\n");// 读取文件int i;char c[128];double d;fscanf(fp, "%d %s %lg\n", &i, c, &d);// 查看printf("读取结果:i=%d c=%s d=%lg\n", i, c, d);// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

输出:

open success!
读取结果:i=33 c=zhangdapeng d=33.33

fgetc每次读取一个字符

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "r");// 判断是否打开成功if (fp == NULL) {printf("open test.txt failed!\n");return -1;}// 每次读一个字符while (1) {char c = fgetc(fp);if (c == -1) {break;}printf("%c", c);};printf("\n");// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

feof判断文件末尾

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "r");// 判断是否打开成功if (fp == NULL) {printf("open test.txt failed!\n");return -1;}// 每次读一个字符char c;while (!feof(fp)) { // 使用feof判断文件末尾c = fgetc(fp);if (c > 0) {printf("%c", c);}};printf("\n");// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

fgets按行读取文件

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "r");// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}// 按行读取字符串char buf[1024];// 读第1行fgets(buf, 1024, fp);printf("%s", buf);// 读第2行fgets(buf, 1024, fp);printf("%s", buf);// 读第3行fgets(buf, 1024, fp);printf("%s", buf);// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

fgets按行循环读取文件

fgets读取到文件末尾或者读取失败的时候,返回NULL,可以以此作为循环退出的条件。

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "r");// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}// 按行读取字符串char *p = NULL;char buf[1024];// 循环读取while (1) {p = fgets(buf, sizeof(buf), fp);if (p == NULL) {break;}printf("%s", buf);}// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

fread按块读取文件

fread一般和fwrite配合使用,适合处理大型文件。

我们可以把上个案例写入的结构体数组读取出来。

#include <stdio.h>
#include <string.h>typedef struct person {int id;char name[32];
} Person;int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "r");// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}// 结构体数组Person arr[3];// 初始化内存memset(arr, 0, sizeof(arr));// 读取文件for (int i = 0; i < 3; ++i) {int count = fread(&arr[i], 1, sizeof(Person), fp);printf("写入了%d个字节的数据\n", count);printf("id=%d name=%s\n", arr[i].id, arr[i].name);}// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

输出:

写入了36个字节的数据
id=1 name=张三
写入了36个字节的数据
id=2 name=李四
写入了36个字节的数据
id=3 name=王五

fread一次性读取文件

#include <stdio.h>
#include <string.h>typedef struct person {int id;char name[32];
} Person;int main() {// 文件类型的指针FILE *fp = NULL;// 打开文件fp = fopen("test.txt", "r");// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}// 结构体数组Person arr[3];// 初始化内存memset(arr, 0, sizeof(arr));// 一次性读取文件fread(arr, 1, sizeof(arr), fp);// 读取文件for (int i = 0; i < 3; ++i) {printf("id=%d name=%s\n", arr[i].id, arr[i].name);}// 关闭文件fclose(fp);// 置空,释放内存fp = NULL;return 0;
}

输出:

id=1 name=张三
id=2 name=李四
id=3 name=王五

文件复制

基础示例

需求:将test.txt中的内容读取并写入到test2.txt中。

核心代码:

// 读取文件
int i;
char c[128];
double d;
fscanf(fp, "%d %s %lg\n", &i, c, &d);// 写入
fprintf(fp2,"%d %s %lg\n", i, c, d);

完整代码:

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;FILE *fp2 = NULL;// 打开文件fp = fopen("test.txt", "r"); // r w a r+ w+ a+fp2 = fopen("test2.txt", "w");// 判断是否打开成功if (fp == NULL) {printf("open test.txt failed!\n");return -1;}if (fp2 == NULL) {printf("open test2.txt failed!\n");return -1;}// 读取文件int i;char c[128];double d;fscanf(fp, "%d %s %lg\n", &i, c, &d);// 写入fprintf(fp2,"%d %s %lg\n", i, c, d);// 关闭文件fclose(fp);fclose(fp2);// 置空,释放内存fp = NULL;fp2 = NULL;return 0;
}

fgetc和fputc

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;FILE *fpw = NULL;// 打开文件fp = fopen("test.txt", "r");fpw = fopen("test2.txt", "w");// 判断是否打开成功if (fp == NULL) {printf("open test.txt failed!\n");return -1;}if (fpw == NULL) {printf("open test2.txt failed!\n");return -1;}char c;while (!feof(fp)) { // 使用feof判断文件末尾// 每次读一个字符c = fgetc(fp);if (c > 0) {// 每次写一个字符fputc(c, fpw);}};// 关闭文件fclose(fp);fclose(fpw);// 置空,释放内存fp = NULL;return 0;
}

feof 判断文件末尾

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;FILE *fpw = NULL;// 打开文件fp = fopen("python.png", "rb");fpw = fopen("python2.png", "wb");// 判断是否打开成功if (fp == NULL) {printf("open python.png failed!\n");return -1;}if (fpw == NULL) {printf("open python2.png failed!\n");return -1;}char c;while (!feof(fp)) { // 使用feof判断文件末尾// 每次读一个字符c = fgetc(fp);// 每次写一个字符fputc(c, fpw);};// 关闭文件fclose(fp);fclose(fpw);// 置空,释放内存fp = NULL;return 0;
}

fgets和fputs

fgets和fputs读写文件效率更高,但是不能读写二进制文件,只能对文本文件有效。

#include <stdio.h>int main() {// 文件类型的指针FILE *fp = NULL;FILE *fpw = NULL;// 打开文件fp = fopen("test.txt", "r");fpw = fopen("test2.txt", "w");// 判断是否打开成功if (fp == NULL) {printf("open failed!\n");return -1;}if (fpw == NULL) {printf("open failed!\n");return -1;}// 按行读取字符串char *p = NULL;char buf[1024];// 循环读取while (1) {p = fgets(buf, sizeof(buf), fp);if (p == NULL) {break;}fputs(buf, fpw);}// 关闭文件fclose(fp);fclose(fpw);// 置空,释放内存fp = NULL;fpw = NULL;return 0;
}

练习:读写英语

每个练习可以独立为一个c文件,也可以合并

  • 1、向english.txt中写入你最熟悉的四个英语语句,每行一个语句。
  • 2、将english.txt中的内容编写代码复制到english2.txt中。
  • 3、将english2.txt中的内容读取输出到stdout标准输出流中。

示例1:写入英语

#include <stdio.h>int main(){FILE* fp = fopen("english.txt", "w+");if (fp == NULL){printf("open the english.txt fail!\n");return -1;}printf("open the english.txt success!\n");fprintf(fp, "Hi, nice to meet you!\n");fprintf(fp, "I like english.\n");fprintf(fp, "How about you?\n");fprintf(fp, "Do you like to play basketball?\n");printf("write to english.txt success!\n");fclose(fp);fp = NULL;return 0;
}

示例2:复制文件

#include <stdio.h>int main(){FILE* r = fopen("english.txt", "r");if (r == NULL){printf("open english.txt fail!\n");return -1;}FILE* w = fopen("english2.txt", "w");if (w == NULL){printf("open english2.txt fail!\n");return -1;}char ch;while (1){ch = fgetc(r);if (ch == EOF){break;}fputc(ch, w);}printf("copy english.txt to english2.txt success!\n");fclose(r);r = NULL;fclose(w);w = NULL;return 0;
}

示例3:查看内容

#include <stdio.h>int main(){FILE* r = fopen("english2.txt", "r");if (r == NULL){printf("open english2.txt fail!\n");return -1;}char ch;while (1){ch = fgetc(r);if (ch == EOF){break;}fputc(ch, stdout);}fclose(r);r = NULL;return 0;
}

标准流

stdin 标准输入流

stdin用于从键盘上读取数据,也就是从控制台读取数据,是一种特殊的文件流。

示例代码:

#include <stdio.h>int main(){int n;fscanf(stdin, "%d", &n);fprintf(stdout, "%d\n", n);return 0;
}

输出:

11
11

stdout 标准输出流

可以将文件中读取的内容,输出到标准输出流中,也可以直接将内存中的内容输出到标准输出流中。

示例代码:

#include <stdio.h>int main(){char name[] = "zhangdapeng";fprintf(stdout, "%s\n", name);return 0;
}

输出:

zhangdapeng

stderr 标准错误流

标准错误流和标准输出流的用法是一样的,不过标准错误流一般用来输出错误信息。

示例代码:

#include <stdio.h>int main(){char errMsg[] = "Sorry, there is a panic error!!!";fprintf(stderr, "%s\n", errMsg);return 0;
}

输出:

Sorry, there is a panic error!!!

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

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

相关文章

最全网络安全学习路线!涵盖所有知识点,看这一篇掌握网安技能!

目录 零基础小白&#xff0c;到就业&#xff01;入门到入土的网安学习路线&#xff01; 建议的学习顺序&#xff1a; 一、夯实一下基础&#xff0c;梳理和复习 二、HTML与JAVASCRIPT&#xff08;了解一下语法即可&#xff0c;要求不高&#xff09; 三、PHP入门 四、MYSQL…

加密/解密--数字信封/数字签名/数字证书

what 加密 加密&#xff1a;加密就是对原来为明文的文件或数据按某种算法进行处理&#xff0c;使其成为一 段不可读的代码&#xff0c;通常称为 “密文”。从而达到保护数据不被非法窃取的目的。 解密 数据加密的逆向过程&#xff0c;将加密的数据转换为明文 加/解密工作机…

【GoLang基础】切片和数组有什么区别?

问题引出&#xff1a; Go语言中的切片和数组有什么区别&#xff1f; 解答&#xff1a; 在 Go 语言中&#xff0c;切片&#xff08;slice&#xff09;和数组&#xff08;array&#xff09;是两种不同的数据类型&#xff0c;它们在使用和特性上有着明显的区别。 数组&#xff0…

C语言队列的含义与队列数据操作代码详解!

引言&#xff1a;于本篇博客当中&#xff0c;我们将讲到数据结构——队列的有关知识。而对于这次的队列&#xff0c;我们将会在单链表的基础上实现。 更多有关C语言和数据结构知识详解可前往个人主页&#xff1a;计信猫 一&#xff0c;队列的含义 队列是一种特殊的线性表&#…

使用 SSH 连接 GitHub Action 服务器

前言 Github Actions 是 GitHub 推出的持续集成 (Continuous integration&#xff0c;简称 CI) 服务它提供了整套虚拟服务器环境&#xff0c;基于它可以进行构建、测试、打包、部署项目&#xff0c;如果你的项目是开源项目&#xff0c;可以不限时使用服务器硬件规格&#xff1…

数据结构(四)抽象数据类型

数据结构&#xff08;四&#xff09;抽象数据类型 要点&#xff1a;数据结构是&#xff0c;数据对象&#xff0c;数据对象的操作和如何使用数据对象的操作 思考&#xff1a;什么是抽象数据类型 01 数据对象的定义 1.逻辑结构&#xff1a; 线性结构&#xff08;一对一&…

遂宁专业知识付费系统报价,免费网课平台怎么开通?需要哪些条件?

其实&#xff0c;不少的大咖老师都不愿意在大平台上开课&#xff0c;因为学员的留存并不是自己的&#xff0c;所以&#xff0c;很多人也考虑自己开通网课平台&#xff0c;那免费的平台怎么开通?这就是我们今天要跟老师们分享的内容了。 需要哪些条件? 大家如果想要开通免费的…

DrissionPage

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;本文章未经许…

Java请求第三方接口的一些步骤

一、前言 Java请求第三方接口的一些步骤。 在Java中请求第三方接口通常涉及以下步骤。这些步骤涵盖了从准备请求到处理响应的整个过程。 1. 确定接口详情 接口URL&#xff1a;你要请求的URL。请求方法&#xff1a;如GET、POST、PUT、DELETE等。请求参数&#xff1a;包括URL…

微型显示器可以实时监测大脑活动

美国团队开发基于LED的设备&#xff0c;以可视化大脑活动&#xff0c;在脑外科手术中指导神经外科医生 来自加州大学圣地亚哥分校和马萨诸塞州总医院的工程师和医生开发了一种薄膜显示设备&#xff0c;该设备结合了电极网格和特殊的GaN LED&#xff0c;可以在手术过程中实时跟…

多线程学习Day07

共享模型之不可变 从一个日期转换的问题开始 Slf4j(topic "c.Test1") public class Test1 {public static void main(String[] args) {SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");for (int i 0; i < 10; i) {new Thread(() -> {…

十大排序算法的介绍及常用六大算法的模板实现

十大排序算法 项目地址&#xff1a; https://gitee.com/zhang---xuan/top-ten-sorting-algorithm 1.冒泡排序&#xff08;Bubble Sort&#xff09; 比较相邻元素&#xff0c;将较大的元素往后移动&#xff0c;每次遍历将最大的元素移到末尾。时间复杂度为O(n^2)。 template…

buuctf-misc题目练习二

ningen 打开题目后是一张图片&#xff0c;放进winhex里面 发现PK&#xff0c;PK是压缩包ZIP 文件的文件头&#xff0c;下一步是想办法进行分离 Foremost可以依据文件内的文件头和文件尾对一个文件进行分离&#xff0c;或者识别当前的文件是什么文件。比如拓展名被删除、被附加…

元素设置 flex:1,但是会被内部长单词宽度超出拉伸

初始布局如上图&#xff0c;left中是代码编辑器&#xff0c;实际上是个文本域&#xff0c;当输入长文本过长时&#xff0c;left宽度会被拉伸。 右侧容器被挤压。 解决方案&#xff1a;width&#xff1a;0&#xff1b; .left{flex:1; width:0} 当输入长文本过长时&#xff0c…

保姆级零基础微调大模型(LLaMa-Factory,多卡版)

此处非常感谢https://github.com/hiyouga/LLaMA-Factory这个项目。 看到网上的教程很多都是教如何用webui来微调的,这里出一期命令行多卡微调教程~ 1. 模型准备 模型下载比较方便的方法: 1. modelscope社区(首选,速度很高,并且很多需要申请的模型都有)注意要选择代码…

信息系统架构_2.信息系统架构分类

信息系统架构可分为物理结构与逻辑结构两种&#xff0c;物理结构是指不考虑系统各部分的实际工作与功能结构&#xff0c;只抽象地考察其硬件系统的空间分布情况。逻辑结构是指信息系统各种功能子系统的综合体。 1.信息系统的物理结构 按照信息系统硬件在空间上的拓扑结构&…

HTML4(二)

文章目录 1 开发者文档2 基本标签2.1 排版标签2.2 语义化标签2.3 行内元素与块级元素2.4 文本标签2.5 常用标签补充 3 图片标签4 超链接标签4.1 跳转页面4.2 跳转文件4.3 跳转锚点4.4 唤起指定应用 5 列表5.1 有序列表5.2 无序列表5.3 自定义列表 6 表格6.1 基本结构6.2 表格标…

【Android】Kotlin学习之数据容器(数组创建)

kotlin数组 数组是一种初始化时指定容器大小, 不可以动态调整其大小的容器 数组创建

WPF之改变任务栏图标及预览

1&#xff0c;略缩图添加略缩按钮。 <Window.TaskbarItemInfo><TaskbarItemInfo x:Name"taskInfo" ProgressState"None" ProgressValue"0.6" ><TaskbarItemInfo.ThumbButtonInfos><ThumbButtonInfo x:Name"btiPlay&q…

深度解析Android 14新特性

Android 14新特性 前言行为变更所有应用核心功能用户体验无障碍功能安全性以 Android 14 或更高版本为目标平台的应用核心功能隐私权用户体验安全性非 SDK 限制新功能语法变化API语法性别的词形变化示例