C语言上机复习(一)文件操作
C语言—文件操作
1.1 fgetc() + fputc(): 以 字符 形式存取数据定义文件指针
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
using namespace std; /*
文件结束标志: EOF --- feof() 读写文件:
fgetc: file get char 以字符形式获取
fputc: file put char 以字符形式写到文件 */
int main()
{
//定义文件指针
FILE *fp;
//打开文件
fp = fopen("fopen_01.txt", "w+"); //判断文件打开是否成功
if (!fp) {
printf("打开文件失败\n");
exit();
} //写的方式: 自己移动
fputc('a', fp);
fputc('b', fp);
fputc('c', fp); //打开文件
fclose(fp); //只读文件
FILE *read = fopen("fopen_01.txt", "r"); if (!read) {
printf("打开文件失败\n");
exit();
} //读文件
//fgetc(): 放回int值, 以字符形式获取
int ch = fgetc(read);
while (ch != EOF)
{
putchar(ch); //打印字符到命令行
ch = fgetc(read);
} printf("\n"); fclose(read); return ; }
2.2 fgets() + fputs(): 以 字符串 形式存取数据
#define _CRT_SECURE_NO_WARNINGS
#include <cstdlib>
#include <cstdio>
using namespace std; /* int fputs(char *str, FILE *fp);
char* fgets(char *str, int n, FILE *fp); */
int main()
{
FILE *fp = fopen("fgets_fputs_02.txt", "w+"); if (!fp) {
printf("打开文件失败");
exit();
} //写的方式: 自己移动
int isok = fputs("Douzi is cute\n I love china!\n who are you?", fp);
//返回非负值,表示成功
printf("返回非负值表示成功: %d\n", isok); fclose(fp); FILE *read = fopen("fgets_fputs_02.txt", "r");
if (!read) {
printf("打开文件失败\n");
exit();
} //读文件
char str[] = "";
//设置读取的长度
while (fgets(str, , read))
{
puts(str);
}
//puts(str); fclose(read); return ; }

2.3 fread() + fwrite(): 以 二进制 形式存取数据
2.3.1 结构体数据
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std; /*
//以二进制形式存储数据
int fwrite(void *buffer,unsigned size, unsigned count, FILE * fp) //以什么方式写进去就以什么方式读出 !!
int fread(void *buffer,unsigned size, unsigned count, FILE * fp)
*/ struct student
{
char name[];
int age;
double num;
}mystudent; int main()
{
//写文件
FILE *fp = fopen("fread_fwrite_03.bat", "wb");
if (fp == NULL) {
printf("打开失败\n");
exit();
} while (true)
{
printf("输入姓名-年龄-成绩:\n");
scanf("%s%d%lf", &mystudent.name, &mystudent.age, &mystudent.num);
//参数: 源起始位置, 写多少(字节), 写的次数, 目的地
// &mystudent, sizeof(struct student), 1, fp
fwrite(&mystudent, sizeof(struct student), , fp);
printf("是否继续?(Y/N)"); //清除缓冲区
//否则下面的字符无法输入,因为上面输入按下回车,"回车"会被下面的getchar()吃掉,而无法自己输入
fflush(stdin);
int ch = getchar();
if (ch == 'N' || ch == 'n') {
break;
}
}
fclose(fp); //读取文件
FILE *read = fopen("fread_fwrite_03.bat", "rb");
if (!read) {
printf("文件打开失败\n");
exit();
} //以二进制形式读取
while (fread(&mystudent, sizeof(struct student), , read) > ) {
printf("姓名\t年龄\t成绩:\n");
printf("%s\t%d\t%.2f\n", mystudent.name, mystudent.age, mystudent.num);
} fclose(read); return ; }
2.3.2 结构体数组
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std; /*
//以二进制形式存储数据
int fwrite(void *buffer,unsigned size, unsigned count, FILE * fp) //以什么方式写进去就以什么方式读出 !!
int fread(void *buffer,unsigned size, unsigned count, FILE * fp):
count: 知道有多少数据可以读取 */ const int maxn = + ;
struct student
{
char name[];
int age;
double num;
}stus[maxn]; int main()
{
////写文件
FILE *fp = fopen("fread_fwrite_03.bat", "wb");
if (fp == NULL) {
printf("打开失败\n");
exit();
} int cnt;
scanf("%d", &cnt);
for (int i = ; i < cnt; i++)
{
printf("输入姓名-年龄-成绩:\n");
scanf("%s%d%lf", &stus[i].name, &stus[i].age, &stus[i].num); //清除缓冲区
//否则下面的字符无法输入,因为上面输入按下回车,"回车"会被下面的getchar()吃掉,而无法自己输入
fflush(stdin);
}
//参数: 源起始位置, 写多少(字节), 写的次数, 目的地
// stus, sizeof(struct student), cnt, fp
fwrite(stus, sizeof(struct student), cnt, fp); fclose(fp); //读取文件
FILE *read = fopen("fread_fwrite_03.bat", "rb");
if (!read) {
printf("文件打开失败\n");
exit();
} student read_demo[maxn];
fread(read_demo, sizeof(struct student), cnt, read); for (int i = ; i < cnt; i++){
printf("姓名\t年龄\t成绩:\n");
printf("%s\t%d\t%.2f\n", read_demo[i].name, read_demo[i].age, read_demo[i].num);
} return ; }

2.4 fprintf() + fscanf():模式化读写文件数据
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
using namespace std; /*
//printf: 多了指定位置
//参数: 指定位置, 与printf一样的格式化【类似%d这样】, 参数列表
int fscanf(FILE *fp, char *format, arg_list);
int fprintf(FILE *fp, char *format, arg_list);
stdin: 标准输入 -- 键盘输入
stdout: 标准输出 -- 屏幕输出
FILE *: 自定义输入输出
*/ const int maxn = ;
struct Student
{
char name[maxn];
int age;
double score;
} mystu, stu[maxn]; int main()
{
//写文件
////标准输入输出
//printf("请输入姓名,年龄,成绩: \n");
//fscanf(stdin, "%s%d%lf", mystu.name, &mystu.age, &mystu.score);
//fprintf(stdout, "%s\t%d\t%.1f\n", mystu.name, mystu.age, mystu.score);
FILE *fp = fopen("fscanf_fprintf_04.txt", "w+");
if (!fp) {
printf("failure!\n");
exit();
} while (true)
{
printf("输入姓名-年龄-成绩: \n");
//标准输入,写入文件
fscanf(stdin, "%s%d%lf", mystu.name, &mystu.age, &mystu.score);
//写入文件
fprintf(fp, "%s\t%d\t%.2f\n", mystu.name, mystu.age, mystu.score); fflush(stdin); printf("是否继续?(Y/N)");
int ch = getchar();
if (ch == 'N' || ch == 'n') {
break;
}
} fclose(fp); //读文件
FILE *read = fopen("fscanf_fprintf_04.txt", "r+");
if (!read) {
printf("failure\n");
exit();
} while (fscanf(read, "%s%d%lf", mystu.name, &mystu.age, &mystu.score) > )
{
//标准输出
fprintf(stdout, "%s\t%d\t%.2f\n", mystu.name, mystu.age, mystu.score); } fclose(read); }

3.1 文件指针: fseek() + rewind()
ftell(fp): 现在所在位置(可用来求数据个数)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std; /*
fseek: fseek(文件类型指针, 位移量, 起始点) 位移量必须是long类型
起始点: (宏)
SEEK_SET 文件首 0;
SEEK_CUR 文件当前位置 1;
SEEK_END 文件尾部 2; 以二进制形式存储数据
int fwrite(void *buffer,unsigned size, unsigned count, FILE * fp)
//以什么方式写进去就以什么方式读出 !!
int fread(void *buffer,unsigned size, unsigned count, FILE * fp)
*/
struct Student
{
char name[];
int age;
double num;
}stus[]; int main()
{
//以二进制形式写文件
FILE *fp = fopen("fseek_rewind_06.txt", "wb+");
if (!fp) {
printf("failure!\n");
exit();
}
int N;
cin >> N;
for (int i = ; i < N; i++)
{
printf("输入姓名-年龄-分数:\n");
scanf("%s%d%lf", stus[i].name, &stus[i].age, &stus[i].num);
fflush(stdin);
} //写入文件
//存N个数据
fwrite(stus, sizeof(struct Student), N, fp); //fseek(文件类型指针, 位移量, 起始点) 位移量必须是long类型
//SEEK_SET 文件首 0;
//注意点: 移动多个位置, long L :表示
//正负: 往后- 往前+
fseek(fp, , SEEK_SET); //移动到第二个数据位置
Student tmp;
fseek(fp, 1L * sizeof(struct Student), SEEK_SET);
fread(&tmp, sizeof(struct Student), , fp);
printf("第二个数据: \n");
printf("%s\t%d\t%.2f\n", tmp.name, tmp.age, tmp.num); //移动到最后一个位置(之后无元素)
fseek(fp, , SEEK_END);
long size = ftell(fp); //ftell:现在所在位置(表达这个文件的大小)
int number = size / sizeof(Student);
printf("有几个数据%d: \n", number); //移动到最后一个元素之前位置 位移量必须是long类型,需要类型转换
fseek(fp, -1L * (long)sizeof(struct Student), SEEK_END);
fread(&tmp, sizeof(struct Student), , fp);
printf("最后一个元素: \n");
printf("%s\t%d\t%.2f\n", tmp.name, tmp.age, tmp.num); //直接移动到文件开始位置
Student stu[];
rewind(fp);
printf("全部数据: \n");
int len = fread(stu, sizeof(struct Student), N, fp);
for (int i = ; i < len; i++){
printf("%s\t%d\t%.2f\n", stu[i].name, stu[i].age, stu[i].num);
} fclose(fp); return ; }

C语言上机复习(一)文件操作的更多相关文章
- C语言复习:文件操作
文件操作专题 C语言文件读写概念 文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁 ...
- 【Go语言】集合与文件操作
本文目录 1.数据集合的主要操作 1_1.字典的声明 1_2.字典的初始化和创建 1_3.字典的访问和操作 1_4.其他类型的数据集 2.文件操作 2_1.文件操作概述os包和path包 2_2.文件 ...
- C++学习(二十八)(C语言部分)之 文件操作
复习:#define 定义一个宏#include 文件包含#if 条件防止头文件重复包含定义一个宏 判断宏是否定义 判断头文件是否包含#define _STDIO_H_#include<stdi ...
- 17.3.15---C语言详解FILE文件操作
FILE 是 C语言文件结构定义, 打开文件和文件操作要用到这类结构.可以看成变量类型,用于变量声明.这个是一种数据结构类型,用来表示一个文件的相关信息,如果定义了一个文件指针,就用这个指针来指向某个 ...
- 归纳整理Linux下C语言常用的库函数----文件操作
在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...
- 说说Python 中的文件操作 和 目录操作
我们知道,文件名.目录名和链接名都是用一个字符串作为其标识符的,但是给我们一个标识符,我们该如何确定它所指的到底是常规文件文件名.目录名还是链接名呢?这时,我们可以使用os.path模块提供的isfi ...
- 【阅读笔记】《C程序员 从校园到职场》第六章 常用文件操作函数 (Part 1)
参考链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/24926023 让你提前认识软件开发(18):C语言中常用的文件操作函数总结 ...
- VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)
上一节中鸡啄米讲了定时器Timer的用法,本节介绍下文件操作类CFile类的使用. CFile类概述 如果你学过C语言,应该知道文件操作使用的是文件指针,通过文件指针实现对它指向的文件的各种操作.这些 ...
- Node.js文件操作一
Node.js和其他语言一样,也有文件操作.先不说node.js中的文件操作,其他语言的文件操作一般也都是有打开.关闭.读.写.文件信息.新建删除目录.删除文件.检测文件路径等.在node.js中也是 ...
随机推荐
- 简单对比一下不同Windows操作系统在相同硬件配置的情况下浏览器js引擎的性能
最近部门进行Windows客户端的测试产品单点性能, 感觉不在通的windows版本以及浏览器内核的情况下性能可能有差异, 也一直没有找到一个比较好的对比工具, 今天用chrome的控制台简单测试了下 ...
- Qt__CMakeLists.txt
cmake_minimum_required(VERSION 3.1.0) project (Project) if(CMAKE_COMPILER_IS_GNUCC) set(CMAKE_CXX_FL ...
- PP-物料清单用户处理手册
1 系统操作时间 1. 新旧物料的替换需有BOM的产生2. BOM中组件发生变化时需有BOM的更改2 系统操作权限角色编码 角色名称Z:PP_PS_007_1000_200 PP主数据维护员 3 适应 ...
- 使用TensorFlow实现分类
这一节使用TF搭建一个简单的神经网络用于分类任务,首先把需要的包引入,另外为了防止在多次运行中一些图中的tensor在内存中影响实验,采取重置操作: import tensorflow as tf i ...
- Nginx referer防盗链模块
L75 referer模块 ngx_http_referer_module 默认编译进nginx valid_referers 指令 Syntax: valid_referers none | blo ...
- Vue模板 script部分
<script> export default { name: "Home", data() { return {}; }, methods: { // 组件的方法 } ...
- 睡前小dp-poj3254-状压dp入门
http://poj.org/problem?id=3254 从这里学的 http://blog.csdn.net/accry/article/details/6607703 状压dp的入门题.一片N ...
- Saddle Point ZOJ - 3955(求每个值得贡献)
题意: 给出一个矩阵,删掉一些行和列之后 求剩下矩阵的鞍点的总个数 解析: 对于每个点 我们可以求出来 它所在的行和列 有多少比它大的 设为a 有多少比它小的 设为b 然后对于那些行和列 都有两种操 ...
- hud 1312
There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A ...
- tmux的使用
tmux的使用 1: tmux的介绍 tmux是一个优秀的终端多路复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权.使用它最直观的好处就是,通过一个终端登录远程主机并 ...