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边学边做--立方体和棱柱体
本篇介绍Manim中创建三维立体的两个常用对象:Cube和Prism. Cube在制作动画时,可以用于展示立体几何中的立方体概念,或者通过旋转.缩放等动画效果来帮助理解三维空间中的几何变换. Pris ...
- 780E开发板之errDump错误日志上报,操作方法解析
一.errDump功能 LuatOS-Air错误日志上报功能模块名叫:errDump,errDump对"量产投放市场的设备,远程调试初步定位问题"至关重要,强烈建议客户一定要使 ...
- java——棋牌类游戏五子棋(webwzq1.0)之一(基础)
这是本人最近一段时间写的斗地主的java代码,大体框架都实现了,一些细节还需要后续优化. package basegame; import java.awt.Button; import java.a ...
- LNMP一键安装
PHP环境快捷搭建工具: https://lnmp.org/ [安装] wget https://soft.lnmp.com/lnmp/lnmp2.1.tar.gz -O lnmp2.1.tar.gz ...
- PHP之soap
扩展安装: 1.下载源码包 cd /root & wget -O php7.1.27.tar.gz http://cn2.php.net/get/php-7.1.27.tar.gz/from/ ...
- 用OpenResty搭建高性能服务端
相关链接:https://github.com/openresty/lua-nginx-module OpenResty 简介 OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web ...
- uni-app 简单上手
1.前言 uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.Web(响应式).以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/ ...
- #oscp#渗透测试 kioptix level 3靶机getshell及提权教程
声明! 文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!! 一.靶机搭建 点击扫描虚拟机 选择靶机使在文件夹即可 二.信息收集 前言 信 ...
- AOP中动态代理详解
动态代理概述 什么是代理 代理模式(Proxy pattern): 为另一个对象提供一个替身或占位符以控制对这个对象的访问 什么是动态代理? 动态代理就是,在程序运行期,创建目标对象的代理对象,并对目 ...
- 2024年1月Java项目开发指南10:vite+Vue3项目创建
新建项目 安装router npm install vue-router 在src下新建目录router,在目录下新建index.js 在index.js里面配置路由 import { createR ...