专业课笔记——(第十二章:文件的读写)

目录

一、文件概述

1.存储角度

2.文件类型

3.文件操作流程

二、文件的基本操作

1.文件的使用模式

2.文件字符形式的输入输出

3.文件字符串形式的输入输出 

4.文件格式化形式的输入输出

5.文件数据块形式的输入输出

6.文件的随机读写


一、文件概述

1.存储角度

文件存取方式分为:顺序存取方式、随机存取方式。

  • 顺序存取就是从上往下,一笔一笔读取文件的内容。写入数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件。
  • 随机存取方式多半以二进制文件为主。它会以一个完整的单位来进行数据的读取和写入,通常以结构为单位。

2.文件类型

文件类型分为:文本文件和二进制文件

  • 文本文件是以字符编码的方式进行保存的。
  • 二进制文件将内存中的数据原封不动的进行保存,适用于非字符为主的数据。

3.文件操作流程

建立/打开文件——从文件中读取数据或向文件中写数据——关闭文件

  • 当一个文件不存在时,如果是读操作,则会报错。
  • 当一个文件不存在时,如果是写操作,则会自动创建这个文件。
  • 文件打开和关闭是成套的,当结束使用之后一定要关闭文件,
#include <stdio.h>  
#include <stdlib.h> // 为了使用EXIT_FAILURE  
  
int main()  
{  
    FILE *p = fopen("/tmp/1.txt", "r");  
    if (p == NULL)  
    {  
        printf("open error!\n");  
        return 0:
    }  
    fclose(p); // 成功打开文件后关闭它  
    return 0; // 程序成功执行  
}

二、文件的基本操作

1.文件的使用模式

1、“r”(只读):从文件头开始

  • 文本文件需存在,如不存在则报错。

2、“r+”(读写):从文件头开始

  • 文本文件需存在,如不存在则报错。

3、“w”(只写):从文件头开始

  • 文本文件不存在则创建新文件,存在则清空原有内容。

4、“w+”(读写):从文件头开始

  • 文本文件不存在则创建新文件,存在则清空原有内容。

5、“a”(追加)(读写):从文件尾开始

  • 文本文件不存在进行创建新文件,存在则在末尾追加。

6、“a+” (追加)(读写):从文件头读取,从文件尾写入

  • 文本文件不存在进行创建新文件,存在则在末尾追加。

二进制使用模式同上面所示,唯一就是在后面加上“b”即可,如下所示:

1、“rb”(只读):从文件头开始

  • 二进制文件需存在,如不存在则报错。

2、........均类比如上

2.文件字符形式的输入输出

1、函数fgetc()、fputc()

  • fgetc(fp_read):从fp指向的文件读入一个字符,若失败返回EOR即-1。
  • fputc(ch, fp_write):将字符ch写到fp指向的文件,若失败返回EOR即-1。
#include <stdio.h>  
#include <stdlib.h>  
  
int main() {  
    FILE *fp_read, *fp_write;  
    char ch, fir_name[40], sec_name[40];  
  
    printf("请输入被复制的文件名: ");  
    scanf("%s", fir_name);  
  
    printf("请输入新的文件名: ");  
    scanf("%s", sec_name);  
  
    // 打开源文件进行读取  
    if (!(fp_read = fopen(fir_name, "r"))) {  
        printf("Cannot open the file %s!\n", fir_name);  
        return 1; // 返回非零值表示错误  
    }  
  
    // 打开目标文件进行写入  
    if (!(fp_write = fopen(sec_name, "w"))) {  
        printf("Cannot open the file %s!\n", sec_name);  
        fclose(fp_read); // 发生错误时关闭已打开的源文件  
        return 1; // 返回非零值表示错误  
    }  
  
    // 逐字符读取源文件并写入目标文件  
    while ((ch = fgetc(fp_read)) != EOF) {  
        fputc(ch, fp_write);  
    }  
  
    printf("Copy complete!\n");  
  
    // 关闭文件  
    fclose(fp_read);  
    fclose(fp_write);  
  
    return 0; // 程序正常结束  
}

3.文件字符串形式的输入输出 

1、函数fgetc()、fputc()

  • fgets(str, 100, fp_read):从fp指向的文件读入长度(100-1)字符并保存在str字符数组中,若失败返回NULL。
  • fputs(str, fp_write):将tr字符数组内容写入fp_write指向的目标文件 ,成功返回0,若失败返回非0值。
#include <stdio.h>  
#include <stdlib.h>  
  
int main() {  
    FILE *fp_read, *fp_write;  
    char str[100]; // 增加缓冲区大小,以便能够读取更长的行  
  
    // 打开源文件进行读取  
    if (!(fp_read = fopen("text.txt", "r"))) { // 注意修正双引号的使用  
        printf("Cannot open the file text.txt!\n");  
        return 1; // 返回非零值表示错误  
    }  
  
    // 打开目标文件进行写入(假设目标文件名为 copy.txt)  
    if (!(fp_write = fopen("copy.txt", "w"))) { 
        printf("Cannot open the file copy.txt!\n");  
        fclose(fp_read); //发生错误时关闭已打开的源文件  
        return 1; // 返回非零值表示错误  
    }  
  
    // 逐行读取源文件并写入目标文件  
    while (fgets(str, 100, fp_read)) { // 注意 fgets 函数的调用方式  
        printf("%s", str);  
        fputs(str, fp_write); // 将读取的内容写入fp_write指向的目标文件  
    }  
    printf("Copy complete!\n");  
  
    // 关闭文件  
    fclose(fp_read);  
    fclose(fp_write);  
  
    return 0; // 程序正常结束  
}

4.文件格式化形式的输入输出

1、函数fscanf()、fprintf()(不建议用,推荐使用fread和fwrite)

  • fscanf(fp,格式串,输入项表):从文本文件中按格式输入数据,成功时,返回成功匹配并赋值的输入项数;如果到达文件末尾或发生读取错误,则可能返回EOF。
  • fprintf(fp,格式串,输出项表):按格式输出数据到文本文件中。
#include <stdio.h>
#include <string.h>

int main()
{
    FILE *file = fopen("./1.txt", "r");
    if(file == NULL)
    {
        printf("open error!\n");
        return 0;
    }
    FILE *fp = fopen("./2.txt", "w");
    char buf[1024] = {0};
    fscanf(file, "%s", buf);
    fprintf(fp, "aaa:%s", buf);
    fclose(file);
    fclose(fp);
    return 0;
}

5.文件数据块形式的输入输出

1、函数read(buffer,size,count,fo)、fwrite(buffer,size,count,fp):

2、buffer:是一个地址。(起始地址)

  • 对fread来说:用来存放文件读入的数据的存储区的地址;
  • 对fwrite来说:把此地址开始的存储区中的数据向文件输出。

3、size:要读写的字节数。
4、count:要读写多少个数据项。(每个数据项长度为size)
5、fp:FILE 类型指针
注意:数据块输入输出函数只适合于二进制文件

#include <stdio.h>  
#define SIZE 10  

struct student {  
    char name[20];  
    int num;  
    int age; 
    char addr[20];  
} stu[SIZE];  
  
int main() {  
    int i;  
    FILE *fp_read, *fp_write;  
  
    if (!(fp_read = fopen("data stu.dat", "rb"))) {  
        printf("Cannot open the file data stu.dat!\n");
        return 0; 
    }  
  
    if (!(fp_write = fopen("datal stu.dat", "wb"))) {   
        printf("Cannot open the file datal stu.dat!\n");  
        fclose(fp_read); //发生错误时关闭已打开的源文件  
        return 0; 
    }  
  
    for (i = 0; i < SIZE; i++) {  
        if (fread(&stu[i], sizeof(struct student), 1, fp_read) != 1) {  
            printf("File read error\n"); 
            fclose(fp_read);  
            fclose(fp_write);  
            return 0; 
        }  
  
        printf("Name: %s, Num: %d, Age: %d, Addr: %s\n", stu[i].name, stu[i].num, stu[i].age, stu[i].addr);  
  
        if (fwrite(&stu[i], sizeof(struct student), 1, fp_write) != 1) {  
            printf("File write error\n"); 
            fclose(fp_read);  
            fclose(fp_write);  
            return 0; 
        }  
    }  
  
    printf("Successful storage!\n"); 
    fclose(fp_read); 
    fclose(fp_write);  
    return 1;  
}

6.文件的随机读写

1、文件的随机读写:指定想要读写的文件位置。

2、rewind(fp)函数

  • rewind():函数使文件文件位置标记指向文件开头。
  • rewind(pf)

3、fseek(fp,位移量,起始点):改变文件位置标记

  • 文件起始点含义如下:
文件开头 SEEK_SET = 0
当前位置 SEEK_CUR = 1
文件结尾 SEEK_END = 2
  • 位移量:这个值可以是正数、负数或零。正数表示向前移动(远离文件开头),负数表示向后移动(朝向文件开头),零则不移动位置但可以用来重新定位起始点。
fseek(fp,100L,0);//将文件位置标记向前移到离文件开头100个字节处
fseek(fp,50L,1); //将文件位置标记前移到离当前位置50个字节处
fseek(fp,-10L,2);//将文件位置标记从文件末尾处向后退10个字节

4、代码实现

#include <stdio.h>  
  
#define SIZE 10  
  
// 定义学生结构体  
struct student {  
    char name[20];  
    int num;  
    int age;  
    char addr[20];  
};stu[SIZE]; 
  
int main() {  
    FILE *fp_read, *fp_write;  
    int i;  
  
    // 打开文件以写入,注意文件名和模式  
    if (!(fp_write = fopen("data_stu.txt", "wb"))) {  
        printf("Cannot open the file data_stu.txt for writing!\n");  
        return 1;  
    }  
  
    // 打开文件以读取  
    if (!(fp_read = fopen("data_stu.dat", "rb"))) {  
        printf("Cannot open the file data_stu.dat for reading!\n");  
        fclose(fp_write); // 关闭已打开的文件  
        return 1;  
    }  
    
    printf("Name\tNum\tAge\tAddr\n");  
    for (i = 0; i < SIZE; i += 2) { 
        fseek(fp_read,i*sizeof(struct student),0);
        fread(&stu[i], sizeof(struct student), 1, fp_read);
        fwrite(&stu[i], sizeof(struct student), 1, fp_write); 
        printf("%s\t%d\t%d\t%s\n", stu[i].name, stu[i].num, stu[i].age, stu[i].addr);    
    }  
  
    fclose(fp_read);  
    fclose(fp_write);  
  
    printf("Successful storage!\n");  
    return 0; // 成功返回0  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/775692.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DataWhale-吃瓜教程学习笔记 (七)

学习视频**&#xff1a;第6章-支持向量机_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 第六章 支持向量机 - 算法原理 几何角度 对于线性可分数据集&#xff0c;找距离正负样本距离都最远的超平面&#xff0c;解是唯一的&#xff0c;泛化性能较好 - 超平面 - 几何间隔 例…

堆叠的作用

一、为什么要堆叠 传统的园区网络采用设备和链路冗余来保证高可靠性&#xff0c;但其链路利用率低、网络维护成本高&#xff0c;堆叠技术将多台交换机虚拟成一台交换机&#xff0c;达到简化网络部署和降低网络维护工作量的目的。 二、堆叠优势 1、提高可靠性 堆叠系统多台成…

ServiceImpl中的参数封装为Map到Mapper.java中查询

ServiceImpl中的参数封装为Map到Mapper.java中查询&#xff0c;可以直接从map中获取到key对应的value

【Python机器学习】处理文本数据——多个单词的词袋(n元分词)

使用词袋表示的主要缺点之一就是完全舍弃了单词顺序。因此“its bad&#xff0c;not good at all”和“its good&#xff0c;not bad at all”这两个字符串的词袋表示完全相同&#xff0c;尽管它们的含义相反。幸运的是&#xff0c;使用词袋表示时有一种获取上下文的方法&#…

LeetCode热题100刷题3:3. 无重复字符的最长子串、438. 找到字符串中所有字母异位词、560. 和为 K 的子数组

3. 无重复字符的最长子串 滑动窗口、双指针 class Solution { public:int lengthOfLongestSubstring(string s) {//滑动窗口试一下//英文字母、数字、符号、空格,ascii 一共包含128个字符vector<int> pos(128,-1);int ans 0;for(int i0,j0 ; i<s.size();i) {//s[i]…

全端面试题15(canvas)

在前端开发领域&#xff0c;<canvas> 元素和相关的 API 是面试中经常被提及的主题。下面是一些常见的关于 HTML5 Canvas 的面试问题及解答示例&#xff1a; 1. 什么是 <canvas> 元素&#xff1f; <canvas> 是 HTML5 引入的一个用于图形渲染的标签。它本身并…

能否免费使用Adobe XD?

Adobe XD不是免费的。Adobe 目前XD采用订阅模式&#xff0c;提供订阅模式 7 每天试用期结束后需要付费购买&#xff0c;具体价格根据不同的订阅计划确定&#xff0c;包括每月购买&#xff0c;包括 9.99 美元或每月 99.99 美元&#xff0c;或者选择购买Adobe CreativeCloud整体订…

【qt】如何通过域名获得IP地址?

域名是什么呢?像www.baidu.com的baidu.com就是域名. 域名相当于是网站的门牌号. 域名可以通过 DNS 解析将其转换为对应的 IP 地址. 用我们获取IP地址的方式就可以,但是现在没有可以用另一种方法. 槽函数的实现: void MainWindow::lookupHost(const QHostInfo &hostInf…

Python学习笔记29:进阶篇(十八)常见标准库使用之质量控制中的数据清洗

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 质量控制…

RedHat / CentOS安装FTP服务

本章教程,记录在RedHat / CentOS中安装FTP的具体步骤。FTP默认端口:21 1、安装 epel 源 yum install -y epel-release2、安装 pure-ftpd yum -y install pure-ftpd3、修改默认配置 # 默认配置位于 /etc/pure-ftpd/pure-ftpd.conf,在配置文件中找到下面几个参数进行修改:#…

并发、多线程和HTTP连接之间有什么关系?

一、并发的概念 并发是系统同时处理多个任务或事件的能力。在计算中&#xff0c;这意味着系统能够在同一时间段内处理多个任务&#xff0c;而不是严格按照顺序一个接一个地执行它们。并发提高了系统的效率和资源利用率&#xff0c;从而更好地满足用户的需求。在现代应用程序中&…

C++ windows下使用openvino部署yoloV8

目录 准备版本&#xff1a; 准备事项: 选择配置界面&#xff1a; 下载界面&#xff1a; ​编辑 添加VS配置&#xff1a; 准备代码&#xff1a; yolov8.h yolov8.cpp detect.cpp 如何找到并放置DLL&#xff1a; 准备版本&#xff1a; opencv 4.6.0 openvino 2024.0…

深度解读:Etched Sohu与Groq LPU芯片的区别

本文简单讲解一下Etched Sohu与Groq LPU两种芯片的区别。 设计理念的差异 首先&#xff0c;这两款产品在设计理念上完全是两条不同的路线。Etched Sohu芯片的设计理念是围绕Transformer模型进行优化。Transformer模型近年来在NLP任务中表现出色&#xff0c;Etched公司因此为其…

SpringSecurity中文文档(Servlet Password Storage)

存储机制&#xff08;Storage Mechanisms&#xff09; 每种支持的读取用户名和密码的机制都可以使用任何支持的存储机制&#xff1a; Simple Storage with In-Memory AuthenticationRelational Databases with JDBC AuthenticationCustom data stores with UserDetailsServic…

4个免费文章生成器,为你免费一键生成原创文章

在当今的创作领域&#xff0c;创作者们常常陷入各种困境。灵感的缺失、内容创新的压力&#xff0c;每一项都如同沉重的枷锁&#xff0c;束缚着他们的创作步伐。但随着免费文章生成器的出现&#xff0c;宛如一场及时雨&#xff0c;为创作者们带来了新的希望和转机。免费文章生成…

【ABB】原点设定

【ABB】原点设定 操作流程演示 操作流程 操作轴回原点编辑电机校准偏移更新转速计数器 1.首先得了解机器手的轴&#xff0c;这里以6轴作参考。 注意先回456轴&#xff0c;后回123轴。 2.然后需要了解机器人关节运动模式&#xff0c;即选择如下两个模式。 3.注意机器人各轴移动…

19C 单机文件系统安装文档

准备工作 1)查看系统版本、内核参数 more /etc/redhat-release more /etc/redflag-releaseuname -a2)查看当前系统是否配置了HugePages。在下面的查询中&#xff0c;HugePages的几个相关值都为0&#xff0c;表明当前未配值HugePages&#xff0c;其次可以看到该版本的大页大小为…

Linux服务器性能参数指标

【摘要】一个基于 Linux 操作系统的服务器运行的同时&#xff0c;会表征出各种各样参数信息&#xff0c;这些蛛丝马迹往往会帮助快速定位跟踪问题。 这里只是一些简单的工具查看系统的相关参数&#xff0c;当然很多工具也是通过分析加工 /proc、/sys 下的数据来工作的&#xff…

课设:选课管理系统(Java+MySQL)

在本博客中&#xff0c;我将介绍用Java、MySQL、JDBC和Swing GUI开发一个简单的选课管理系统。 技术栈 Java&#xff1a;用于编写应用程序逻辑MySQL&#xff1a;用于存储和管理数据JDBC&#xff1a;用于连接Java应用程序和MySQL数据库Swing GUI&#xff1a;用于构建桌面应用程…

RH850系列芯片深度剖析 1.8-内存管理之MPU

RH850系列芯片深度剖析 1.8-内存管理之MPU 文章目录 RH850系列芯片深度剖析 1.8-内存管理之MPU一、MPU简介1.1 功能特性1.2 系统保护标识符(SPID)二、保护区域设置2.1 保护区域属性设置2.2 保护区域设置注意事项2.2.1 跨越保护区域边界2.2.2 无效的保护区域设置2.2.3 保护违规…