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中也是 ...
随机推荐
- Eclipse:An internal error occurred during: "Building workspace". GC overhead limit exceeded
http://blog.csdn.net/shaozhang872196/article/details/18552273 http://www.cnblogs.com/sonofelice/p/52 ...
- multer处理post请求的代码演示
let express = require('express'); let multer = require('multer'); let mObj = multer({dest:__dirname+ ...
- RAID 磁盘阵列说明
Copy From wiki RAID档次 最少硬盘 最大容错 可用容量 读取性能 写入性能 安全性 目的 应用产业 单一硬盘 (引用) 0 1 1 1 无 JBOD 1 0 n 1 1 无( ...
- linux bin & sbin different
linux bin & sbin different flutter & $PATH http://blog.taylormcgann.com/2014/04/11/differenc ...
- SVG to Image in js
SVG to Image in js SVG to Image https://image.online-convert.com/convert-to-svg https://stackoverflo ...
- LinkedList 实现 Queue
package cn.com.example; import java.util.LinkedList; /** * Created by Jack on 2017/3/8. */ public cl ...
- BZOJ5338[TJOI2018]xor——主席树+dfs序
题目描述 现在有一颗以1为根节点的由n个节点组成的树,树上每个节点上都有一个权值vi. 现在有Q 次操作,操作如下: 1 x y 查询节点x的子树中与y异或结果的最大值 2 x y z ...
- VMWare 安装 Linux
参考 : http://www.aboutyun.com/thread-6780-1-1.html 这的是很详细.赞一下 我这里就简化一下. 1 下载: VMWare : https://d ...
- day5 if else elif 判断语句
age_of_princal = 56 guess_age = int( input(">>:") ) '''伪代码,提供思路用 if guess_age == age ...
- Python函数绘图
最近看数学,发现有时候画个图还真管用,对理解和展示效果都不错.尤其是三维空间和一些复杂函数,相当直观,也有助于解题.本来想用mathlab,下载安装都太费事,杀鸡不用牛刀,Python基本就能实现.下 ...