C :文件
一直没有系统学习过该章节,现参考《C语言程序设计 (第四版)谭浩强》
C文件基本知识
什么是文件



文件名

文件的分类


文件缓冲区

文件类型指针

typedef struct
{
short level; // 缓冲区“满”或“空”的程度
unsigned flags; // 文件状态标志
char fd; // 文件描述符
unsigned char hold; // 如缓冲区无内存不读取字符
short bsize; // 缓冲区的大小
unsigned char* buffer; // 数据缓冲区的位置
unsigned char* curp; // 指针当前的指向
unsigned istemp; // 临时文件指示器
short token; // 用于有效性检查
};FILE


文件打开与关闭

fopen




if ((fp = fopen("lena.bmp", "r")) == NULL)
{
printf("不能打开文件!\n");
exit(0); // 关闭所有文件,终止正在执行的程序,待用户检查出错误后,修改后重新运行z
}

fclose


顺序读写数据文件

如何向文件中读写一个字符


#include <stdio.h>
#include <windows.h>
int main()
{
FILE* fp = NULL; char ch, filename[10];
printf("请输入文件名:");
scanf("%s", filename);
if ((fp = fopen("filename", "w")) == NULL)
{
printf("不能打开文件!\n");
exit(0);
}
ch = getchar(); // 每次接收一个字符
while (ch != '#') // 当输入#时结束循环
{
fputc(ch, fp); // 向磁盘文件中输出一个字符
putchar(ch); // 将输出的字符显示在屏幕上
ch = getchar(); //继续接收输入的字符
} fclose(fp);
putchar(10); // 想屏幕输出换行符 return 0;
}

#include <stdio.h>
#include <windows.h> void main()
{
FILE *in,*out; char ch,infile[10],outfile[10];
printf("请输入读入的文件名:");
scanf("%s", infile);
printf("请输入输出的文件名:");
scanf("%s", outfile); if ((in = fopen(infile, "r")) == NULL)
{
printf("不能打开文件!\n");
exit(0);
}
if ((out = fopen(outfile, "w")) == NULL)
{
printf("不能打开文件!\n");
exit(0);
}
while (!feof(in)) // feof(in)检查in所指向的文件是否结束,feof:检查到文件读写位置标记是否移动到文件的末尾
{
ch = fgetc(in); // 从输入文件中读入一个字符,暂时存放在ch
fputc(ch, out); //将ch输出到文件中
putchar(ch); //将字符显示在屏幕上
}
putchar(10); // 想屏幕输出换行符
fclose(in);
fclose(out);
}
补充:
1、以上程序是按文本文件方式处理的,也可以用此程序来复制一个二进制文件,只需将fopen函数中的参数换为:“rb”和“wb”
2、C系统将fputc和fgetc函数定义为宏名putc和getc:

如何向文件中读写一个字符串



#include <stdio.h>
#include <windows.h>
#include <string.h> void main()
{
FILE* fp;
char str[3][10], temp[10]; // str存放字符串的二维数组,temp是临时数组
int i, j, k, n = 3;
printf("请输入字符串:\n");
for (i = 0; i < n; i++)
{
gets(str[i]); // 输入字符串
} for (i = 0; i < n - 1; i++) // 选择法对字符串进行排序
{
k = i;
for (j = i + 1; j < n; j++)
{
if (strcmp(str[k], str[j]) > 0) // strcmp:按字母大小比较两个字符串,相同返回0,否则返回1
k = j;
}
if (k != i)
{
strcpy(temp, str[i]); // strcpy:复制字符串
strcpy(str[i], str[k]);
strcpy(str[k], temp);
}
}
if ((fp = fopen("s.txt", "w")) == NULL)
{
printf("不能打开文件!\n");
exit(0);
}
printf("新的序列为:\n"); for (i = 0; i < n; i++)
{
fputs(str[i], fp); // 向文件中写入一个字符串,然后输出一个换行符
fputs("\n", fp);
printf("%s\n", str[i]);
}
}
格式化方式读写文件


二进制方式向文件读写一组数据

随机读写数据文件

文件位置标记及其定位
1、文件位置标记


2、文件位置标记的定位


#include <stdio.h>
#include <windows.h>
#include <string.h> void main()
{
FILE* fp1, * fp2;
fp1 = fopen("pam.txt", "r"); //打开输入文件
fp2 = fopen("s.txt", "w"); // 打开输出文件
while (!feof(fp1))
{
putchar(getc(fp1)); // 逐个读入字符输出到屏幕上
}
putchar(10);
rewind(fp1); // 使文件位置标记返回文件头
while (!feof(fp1))
{
putc(getc(fp1), fp2); // 从文件头重新逐个读字符,输出到另外一个文件中
}
fclose(fp1);
fclose(fp2);
}

vfgrt67
随机读写的出错检测
ferror


clearerr

C :文件的更多相关文章
- Mapreduce的文件和hbase共同输入
Mapreduce的文件和hbase共同输入 package duogemap; import java.io.IOException; import org.apache.hadoop.co ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...
随机推荐
- manim边做边学--圆锥
Cone是Manim中专门用于创建和操控锥形几何对象的类. Cone允许用户定义锥体的底面半径.高度.颜色.不透明度等属性,并提供了一系列方法来操控这个锥体,如移动.缩放.旋转等. 通过这些属性和方法 ...
- Linux管道命令
Linux中常用文件字符串分析的命令 在linux中文件管理与系统管理的方面,经常会用到要从一个文件中或者一长串字符串中提取你所需要的数据,或者某些字段来进行查看或者分析,作为一个初级linux小菜鸟 ...
- pycharm之常用插件
参考:http://pycharm.iswbm.com/zh_CN/latest/ 1. Key Promoter X 如果让我给新手推荐一个 PyCharm 必装插件,那一定是 Key Promot ...
- 震惊!推荐一款AI驱动的自动化测试神器:TestCraft
在当今快速迭代的软件开发环境中,自动化测试已经成为确保软件质量的重要一环.然而,传统的手动录制和编写测试脚本的方式不仅耗时耗力,还难以跟上敏捷开发的节奏. 本文将为大家介绍一款基于AI技术的自动化测试 ...
- 基于.NetCore开发博客项目 StarBlog - (32) 第一期完结
前言 本文记录一下 StarBlog 项目的当前状态与接下来 v2 版本的开发规划. StarBlog 项目从 2022 年开始至今已经 2 年多了,本来早就该给第一期做个小结的,但这种博客类型的项目 ...
- qiankun 的 CSS 沙箱隔离机制
为什么需要CSS沙箱 在 qiankun 微前端框架中,由于每个子应用的开发和部署都是独立的,将主/子应用的资源整合到一起时,容易出现样式冲突的问题 因此,需要 CSS 沙箱来解决样式冲突问题,实现主 ...
- RocksDB 内存超限问题剖析
作者:来自 vivo 互联网服务器团队- Zeng Luobin 在使用 RocksDB 存储引擎的过程中,有部分开发者遇到了内存使用超出预期的情况.本文针对这一问题展开了深入分析,从内存使用原理.R ...
- taro 编译报:模块引入顺序不一致报错
前情 最近在开发一个小程序项目,基于公司的技术栈是React,于是使用Taro来开发小程序. 坑位 在开发中经常性的报类似如下的错误,大致意思是说你引入模块的顺序在不同模块中不一致 Why? 主要是m ...
- QEMU CVE-2021-3947 和 CVE-2021-3929 漏洞利用分析
QEMU CVE-2021-3947 和 CVE-2021-3929 漏洞利用分析 CVE-2021-3947 信息泄露漏洞 漏洞分析 漏洞点是 nvme_changed_nslist stati ...
- ruoyi若依前端验证码不显示的终极解决方法-20230721
搞了3天啊,查了各种资料啊. 然后使劲的看log啊,总算搞定了啊. 一般情况,本地开发环境测试没问题,部署到服务器就各种不适应,就是服务器配置的问题了. 本次这种验证码不显示,典型的nginx的配置 ...