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 ...
随机推荐
- 【踩坑日记】uni-app相机抽帧,相机被多次初始化问题
缘起:最近频繁接到使用我们AI运行识别插件用户的反馈,部分机型在uni中抽几帧后,就不再帧的了.开始以为又是小程序的API兼容的问题(确有机型出现过抽帧兼容性问题),后面越来越多的反馈在原生下无问题, ...
- 全新向量数据库SQL Server 2025:带你迈入AI驱动的数据未来
全新向量数据库SQL Server 2025:带你迈入AI驱动的数据未来 上次大家下单的<微软憋大招:SQL Server + Copilot = 地表最强AI数据库!> 抱怨迟迟没有发货 ...
- DSPf28335 --工程模版相关文件
创建工程需要的两个文件 DSP2833x_common 1.cmd 下图中的两个文件(由TI公司提供的) 1.28335_RAM_lnk.cmd :程序下载到RAM中进行调试和仿真所使用的启动文件. ...
- Cygwin:windows下的Linux系统
Cygwin是啥?Cygwin是一个可原生运行于Windows系统上的POSXI兼容环境. 是的,我又开新专辑了<零基础swoole学习笔记>.不是我太贪心,而是最近半年和小伙伴一直在用s ...
- Git之message提交
作用 编写格式化的 commit message 能够大大提高代码的维护效率. 比如: 可以提供更多的历史信息,方便快速浏览: 可以过滤某些 commit(比如文档改动),便于快速查找信息: 可以直接 ...
- elasticsearch之python操作(非原生)
elasticsearch 模块 Elasticsearch低级客户端.提供从Python到ES REST端点的直接映射. 连接集群节点 指定连接 es = Elasticsearch( ['172. ...
- pve 下的群晖虚拟机硬盘空间扩容的记录
pve下,105号群晖虚拟机,btrfs系统,sata硬盘. 虚拟机容量硬盘130G,扩展至140G,还需要命令行和网页存储管理器界面操作,以实现扩容的目的. df -h Filesystem Siz ...
- k8s~service和deployment中的spec.selector
service和deployment中的spec.selector 在 Kubernetes 中,Service 和 Deployment 的 spec.selector 在使用上是有一些不同之处的, ...
- .NET 中的中间件(Middleware)
ASP.NET Core 中间件 什么是中间件(Middleware)? 中间件是组装到应用程序管道中以处理请求和响应的软件. 每个组件: 选择是否将请求传递给管道中的下一个组件. 可以在调用管道中的 ...
- 禁用SAP Hana错误密码锁定用户功能
背景 公司项目适配多种数据库其中包含SAP Hana,由于有同事的数据库连接工具保存了某个在用的数据库的旧密码,导致时不时会被锁用户.通过查询官方文档已解决,这里统一记录一下. 禁用密码锁定方法 以下 ...