c语言操作文件

1、文件存储

文件存取格式

从用户或者操作系统使用的角度(逻辑上)文件可以分为文本文件、二进制文件

文本文件:存储时,是将字符的ascii码值存在磁盘中,取的时候将ascii码翻译成对应的字符,这个翻译器就是文本编辑器

二进制文件:存储的是二进制,取的时候也是二进制

例子 

比如,用记事本打开一张图片会出现以下乱码,因为图片的存储编码内容与文本不同,记事本打开的时候就翻译成对应的字符的时候就出了问题

ps:存储文件与大家的软件(翻译器)必须一致才可以进行开发(翻译) 

 2、磁盘的文件存储

物理上即使磁盘存储的角度,所有文件都是存储的二进制,以字节为单位顺序存储

 

2、文件指针

 当打开一个文件时,操作系统会返回一个结构体.这个结构体有对此文件操作的所有信息

3、相对路径

 1、vs中源码执行

相对xxxxxx.vcxproj文件

 2、如果是可执行文件exe

则相对于exe所在目录

3、设备文件

程序启动的时候会默认打开三个设备文件获取三个设备文件指针

标准输入文件 stdin(表示键盘)、标准输出文件 stdout(表示显示器)、标准错误文件 stderr(表示显示器)是由系统打开的,可直接使用。

 

4、文件相关函数

4.1、fopen

函数功能: 打开一个文件
函数原型:FILE * fopen(const char * path,const char * mode);
相关函数:open,fclose,fopen_s[1] ,_wfopen
所需库: <stdio.h>
返回值: 文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。
  一般而言,打开文件后会作一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。

打开文件之后,程序可以得到文件的相关信息,例如大小、类型、权限、创建者、更新时间等。在后续读写文件的过程中,程序还可以记录当前读写到了哪个位置,下次可以在此基础上继续操作

标准输入文件 stdin(表示键盘)、标准输出文件 stdout(表示显示器)、标准错误文件 stderr(表示显示器)是由系统打开的,可直接使用。

 阅读:C语言fopen函数的用法,C语言打开文件详解

文件的打开模式见下图

下面例子有点问题(思考)

#include <stdio.h>
#include <stdlib.h>

#define N 100

int main() {
    FILE* fp;
    char str[N + 1];

    //判断文件是否打开失败
    if ((fp = fopen("d:\\demo.txt", "rt")) == NULL) {
        puts("Fail to open file!");
        exit(0);
    }

    //循环读取文件的每一行数据
    while (fgets(str, N, fp) != NULL) {
        printf("%s", str);
    }

    //操作结束后关闭文件
    fclose(fp);
    return 0;
}

 4.2.fflush

fflush() 通常仅用于输出流。它的目的是清除(或刷新)输出buffer,并将缓冲的数据移动到控制台(在stdout的情况下)或磁盘(在文件输出流的情况下)
声明:int fflush(FILE* stream);

参数:stream为文件指针。

返回值:成功返回0,失败返回EOF,错误代码存于errno 中。指定的流没有缓冲区或者只读打开时也返回0值。

fflush()也可用于标准输入(stdin)和标准输出(stdout),用来清空标准输入输出缓冲区。

stdin 是 standard input 的缩写,即标准输入,一般是指键盘;标准输入缓冲区即是用来暂存从键盘输入的内容的缓冲区。stdout 是 standard output 的缩写,即标准输出,一般是指显示器;标准输出缓冲区即是用来暂存将要显示的内容的缓冲区。
另外fclose也可以把缓冲区的内容刷新到磁盘中的功能

#include <stdio.h>
#include <stdlib.h>


int main() {
	FILE* fp;
	fp = fopen("./demo.txt", "w");
	//判断文件是否打开失败
	if (fp == NULL) {
		perror("打开文件错误:");
		exit(0);
	}
	char buf[12] = "helloworld!";
	int i = 0;
	while (buf[i] != 0) {
		fputc(buf[i],fp);
		i++;
	};
	fflush(fp);//把缓冲区的内容刷新到磁盘中,下次open
	fclose(fp);//也可以吧缓冲区的内容刷新到磁盘中
	fp = fopen("./demo.txt", "r");
	char buff[1024] = "";
	i = 0;
	//int a = fgetc(fp);
	//char b = (char)a;
	//char c = fgetc(fp);
	while ((buff[i] = fgetc(fp)) != -1) {
		i++;
	};
	printf("%s", buff);
	fclose(fp);
	return 0;
}

4.3、fclose

声明:int fclose(FILE *stream);

参数:stream为文件流指针。

返回值:若关文件动作成功则返回0,有错误发生时则返回EOF,并把错误代码存到errno。

描述:C 库函数 int fclose(FILE *stream) 关闭流 stream。刷新所有的缓冲区。

fclose()用来关闭fopen()打开的文件,此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。

例子

思考控制台为什么没有打印出内容

#include <stdio.h>
#include <stdlib.h>


int main() {
	FILE* fp;
	fp = fopen("./demo.txt", "w");
	//判断文件是否打开失败
	if (fp == NULL) {
		perror("打开文件错误:");
		exit(0);
	}
	char buf[12] = "helloworld!";
	int i = 0;
	while (buf[i] != 0) {
		fputc(buf[i],fp);
		i++;
	};
	//fflush(fp);//把缓冲区的内容刷新到磁盘中,下次open
	//fclose(fp);//也可以吧缓冲区的内容刷新到磁盘中
	fp = fopen("./demo.txt", "r");
	char buff[1024] = "";
	i = 0;
	//int a = fgetc(fp);
	//char b = (char)a;
	//char c = fgetc(fp);
	while ((buff[i] = fgetc(fp)) != -1) {
		i++;
	};
	printf("%s", buff);
	fclose(fp);
	return 0;
}

 

4.4、fgetc

fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符。fgetc() 的用法为:

int fgetc (FILE *fp);

fp 为文件指针。fgetc() 读取成功时返回读取到的字符,读取到文件末尾或读取失败时返回EOF。

EOF 是 end of file 的缩写,表示文件末尾,是在 stdio.h 中定义的宏,它的值是一个负数,往往是 -1。fgetc() 的返回值类型之所以为 int,就是为了容纳这个负数(char不能是负数)。

EOF 不绝对是 -1,也可以是其他负数,这要看编译器的实现。

4.5、EOF的说明

EOF 是 end of file 的缩写,表示文件末尾,是在 stdio.h 中定义的宏,它的值是一个负数,往往是 -1。fgetc() 的返回值类型之所以为 int,就是为了容纳这个负数(char不能是负数)。

EOF 本来表示文件末尾,意味着读取结束,但是很多函数在读取出错时也返回 EOF,那么当返回 EOF 时,到底是文件读取完毕了还是读取出错了?我们可以借助 stdio.h 中的两个函数来判断,分别是 feof() 和 ferror()。

4.6、fputc

字符写入函数 fputc

fputc 是 file output char 的所以,意思是向指定的文件中写入一个字符。fputc() 的用法为:

int fputc ( int ch, FILE *fp );

ch 为要写入的字符,fp 为文件指针。fputc() 写入成功时返回写入的字符,失败时返回 EOF,返回值类型为 int 也是为了容纳这个负数。例如:

fputc('a', fp);

或者:

char ch = 'a';

fputc(ch, fp);

表示把字符 'a' 写入fp所指向的文件中。

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

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

相关文章

ubuntu下gif动态图片的制作

Gif图片比视频小, 比静态JPG图片形象生动, 更适用于产品展示和步骤演示等。各种各样的gif动图为大家交流提供很大的乐趣. 这里简单介绍ubuntu系统下gif图的制作。 一、工具安装: kazam和ffmpeg kazam是linux下的一款简单但是功能强大的屏幕录制工具. 它可录制声音并选择全屏录…

【C++】一文带你初识C++继承

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a; C类 ♈️今日夜电波&#xff1a;napori—Vaundy 1:21 ━━━━━━️&#x1f49f;──────── 3:23 …

数据库--SQL关键字的执行顺序

数据库相关链接&#xff1a; 数据库--数据类型&#xff1a;http://t.csdn.cn/RtqMD 数据库--三大范式、多表查询、函数sql&#xff1a;http://t.csdn.cn/udJSG 数据库--MySQL增删改查&#xff1a;http://t.csdn.cn/xkiti 一、一条sql语句通常包括&#xff1a; select fro…

[PaddlePaddle] [学习笔记] [上] 计算机视觉(卷积、卷积核、卷积计算、padding计算、BN、缩放、平移、Dropout)

1. 计算机视觉的发展历程 计算机视觉作为一门让机器学会如何去“看”的学科&#xff0c;具体的说&#xff0c;就是让机器去识别摄像机拍摄的图片或视频中的物体&#xff0c;检测出物体所在的位置&#xff0c;并对目标物体进行跟踪&#xff0c;从而理解并描述出图片或视频里的场…

pytest自动生成测试类 demo

一、 pytest自动生成测试类 demo # -*- coding:utf-8 -*- # Author: 喵酱 # time: 2023 - 08 -15 # File: test4.py # desc: import pytest import unittest# 动态生成测试类def create_test_class(class_name:str, test_cases:list) -> type:"""生成测试类…

根据源码,模拟实现 RabbitMQ - 通过 SQLite + MyBatis 设计数据库(2)

目录 一、数据库设计 1.1、数据库选择 1.2、环境配置 1.3、建库建表接口实现 1.4、封装数据库操作 1.5、针对 DataBaseManager 进行单元测试 一、数据库设计 1.1、数据库选择 MySQL 是我们最熟悉的数据库&#xff0c;但是这里我们选择使用 SQLite&#xff0c;原因如下&am…

JavaScript、TypeScript、ES5、ES6之间的联系和区别

ECMAScript&#xff1a; 一个由 ECMA International 进行标准化&#xff0c;TC39 委员会进行监督的语言。通常用于指代标准本身。JavaScript&#xff1a; ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范&#xff0c;并且可能被用于…

看看安森美深力科NSI45090JDT4G 是如何点亮汽车内外照明系统解决方案

关于线性恒流调节器&#xff08;CCR&#xff09;&#xff1a;是一种用于控制电流的稳定输出。它通常由一个功率晶体管和一个参考电流源组成。CCR的工作原理是通过不断调节功率晶体管的导通时间来维持输出电流的恒定。当输出电流超过设定值时&#xff0c;CCR会减少功率晶体管的导…

Linux:shell脚本 正则表达式与AWK

一、正则表达式 由一类特殊字符及文本字符所编写的模式&#xff0c;其中有些字符&#xff08;元字符&#xff09;不表示字符字面意义&#xff0c;而表示控制或通配的功能&#xff0c;类似于增强版的通配符功能&#xff0c;但与通配符不同&#xff0c;通配符功能是用来处理文件…

八股文之框架篇(Spring Boot、SSM)

文章目录 Spring中的单例bean是线程安全的吗什么是AOP&#xff0c;项目中有没有使用到AOPSpring中的事务是如何实现的Spring中事务失效的场景有哪些Bean的生命周期Spring中的循环依赖&#xff08;循环引用&#xff09;SpringMVC的执行流程SpringBoot自动配置原理Spring、Spring…

生信豆芽菜-差异基因富集分析

网址&#xff1a;http://www.sxdyc.com/enrichmentEnrich 该工具使用R 语言的clusterProfiler包对关键基因集进行GO和KEGG富集分析&#xff0c;注意这个的关键基因集可以是差异基因&#xff0c;WGCNA的module基因&#xff0c;也可以是表型相关的基因集 1、数据准备 准备一个基因…

kubernetes企业级高可用部署

目录 1、Kubernetes高可用项目介绍 2、项目架构设计 2.1、项目主机信息 2.2、项目架构图 1、Kubernetes高可用项目介绍 2、项目架构设计 2.1、项目主机信息 2.2、项目架构图 2.3、项目实施思路 3、项目实施过程 3.1、系统初始化 3.2、配置部署keepalived服务 3.3、…

【Android Studio】 win11 安装配置 jdk17 超详细

概述 一个好的安装教程能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、下载JDK JDK官网 这里下载 JDK17 windows x64 installer 二、安装JDK 双击打开下载的 j…

如何在 iOS 上安装并使用 ONLYOFFICE 文档

借助 iOS 版文档应用&#xff0c;您可在移动端设备上访问存储于 ONLYOFFICE 账户中的文件&#xff0c;查看和编辑现有文本文档、电子表格和演示文稿&#xff0c;创建新文档并对其进行整理&#xff0c;以及连接第三方云存储服务。您可与其他门户网站用户协作编辑文档&#xff0c…

16.5.4 【Linux】SELinux 政策内的规则管理

SELinux 各个规则的布林值查询 getsebool 如果想要查询系统上面全部规则的启动与否 &#xff08;on/off&#xff0c;亦即布林值&#xff09;&#xff0c;很简单的通过 sestatus-b 或 getsebool -a 均可&#xff01; SELinux 各个规则规范的主体程序能够读取的文件 SELinux typ…

QT QtXlsx安装使用

QtXlsx介绍 QtXlsx是一个可以读取和写入Excel文件的库。它不需要Microsoft Excel&#xff0c;可以在Qt5支持的任何平台上使用。 这里一定是需要QT5支持的。 须知安装QtXlsx时&#xff0c;需要下载perl 1.安装perl 这里选择官网下载安装即可。 官网地址&#xff1a;https://p…

【Git】(四)子模块

1、增加子模块 进入准备添加子模块所在的目录&#xff0c;例如library。 git submodule add -b 1.0.0.0 gitgitee.com:sunriver2000/SubModule.git参数-b用于指定子模块分支。 2、更新子模块 git submodule update --progress --init --recursive --force --remote -- "…

Sending a Sequence Over the Network

一、题目 题面翻译 你现在有一个序列 a a a&#xff0c;定义一个用该序列生成新序列 b b b 的规则如下&#xff1a; 把 a a a 这个序列分成连续的几段&#xff1b;对于每一段&#xff0c;我们把这一段的长度插入到这一段的左边或右边。每一段进行操作后便得到了 b b b 序…

《零基础7天入门Arduino物联网-04》电路基础知识上

配套视频课程&#xff1a;《零基础学Arduino物联网&#xff0c;入门到进阶》 配套课件资料获取&#xff1a;微联实验室 配套学习套件购买&#xff1a;淘宝搜索店铺【微联实验室】 直流电与交流电 直流电&#xff08;DC&#xff09; 是指电流的方向始终保持不变的电流。这意味着…

什么是可视化编程?为什么它如此重要?

可视化编程&#xff0c;又叫可视化程序设计&#xff0c;一直以来就是备受讨论的“热门技术”。一方面&#xff0c;程序员抵触它&#xff0c;觉得它不如用代码开发。另一方面&#xff0c;对于产品经理等稍微懂点开发的业余人员&#xff0c;它确实能提供价值。所以&#xff0c;它…