利用标准IO函数接口实现计算一个本地磁盘某个文件的大小,文件名通过命令行进行传递
利用标准IO函数接口实现计算一个本地磁盘某个文件的大小,文件名通过命令行进行传递
方法一:使用ftell函数直接获取光标偏移量
相关标准库函数
SYNOPSIS
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence); // 设置文件流指针的位置
long ftell(FILE *stream);// 获取当前文件指针相对于文件开头的偏移量
void rewind(FILE *stream);// 将文件指针重置到文件开头,并清除错误标志
int fgetpos(FILE *stream, fpos_t *pos);// 获取文件流的当前位置信息(适用于大文件或复杂定位场景)
int fsetpos(FILE *stream, const fpos_t *pos);// 文件指针定位到fgetpos记录的位置
代码实现
#include <stdio.h>
#include <stdlib.h>
// argc = argv指针数组长度+1
int main(int argc,const char *argv[])
{
// 如果没给文件路径的话报错
if(argc<2) {
printf("请给出文件绝对路径\n");
exit(-1);
}
// 打开文件,用只读方式打开,光标在首个地址
FILE *file = fopen(argv[1],"a");
// 错误处理
if(!file){
perror("文件打开出错");
exit(-1);
}
// ftell计算文件偏移量
long count = ftell(file);
printf("文件的大小是: %ldbytes\n", count * sizeof(char));
// 关闭文件,释放堆内存
fclose(file);
}
方法二:使用fgetc逐字计算
相关标准库函数
SYNOPSIS
#include <stdio.h>
int fgetc(FILE *stream);// 从指定文件流中读取单个字符。每次读取后文件位置指针自动后移一个字节,支持读取文本/二进制文件
char *fgets(char *s, int size, FILE *stream);// 从文件流中读取一行字符串,最多读取size-1个字符(含换行符),末尾自动添加'\0',有效防止缓冲区溢出
int getc(FILE *stream);// 与fgetc()功能相同,但通常通过宏实现,执行效率略高。读取文件流中的单个字符
int getchar(void);// 标准输入(stdin)读取单个字符,等价于fgetc(stdin)
int ungetc(int c, FILE *stream); // 将字符c推回输入流,后续读取操作会优先获取该字符,用于实现"预读"功能
代码实现
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
//1.要求要计算大小的文件的路径需要通过命令行传递给main(),需要判断用户传递的参数是否有效
if (2 != argc)
{
printf("argument is invaild!\n");
exit(1);
}
//2.利用fopen()以只读方式打开需要计算大小的文件 "rb" 以二进制方式打开文件
FILE *fp = fopen(argv[1],"rb");
if (NULL == fp)
{
perror("fopen file error");
exit(1);
}
//3.计算文本数据大小,可以采用循环计数的方式,每次从文本中读取一个字符,直到文本到达末尾
int cnt = 0;
while(1)
{
if( fgetc(fp) == EOF )
{
printf("end of file\n");
break;
}
cnt++;
}
//4.循环终止,则说明计算完成,此时输出文本大小即可
printf("file [%s]: size = %ld \n",argv[1],ftell(fp));
return 0;
}
值得注意的点
这里有个需要注意的点,fopen()需要以“rb”的模式打开文件,r为只读,b为二进制打开。而Linux系统以文本方式打开文件和以二进制方式打开文件的区别:
在Linux系统中,以文本方式打开文件和以二进制方式打开文件的主要区别在于,文本方式可能会对文件内容进行解释和转换,而二进制方式则不会。以文本方式打开文件通常意味着文件会被当作字符数据来处理,而以二进制方式打开文件则会将文件视为字节序列,不对这些字节做任何特殊解释。这种区别对于处理文本文件和二进制文件是重要的,因为二进制文件可能包含可解释为控制字符的字节序列,这会影响文本处理工具的行为。
例如,在某些系统中,文本模式下,字节值小于32(十进制)的字节可能会被解释为控制字符,例如换行符(ASCII码10),而在二进制模式下,这些字节会被视为普通的数据。在编写代码时,如果你需要精确地读取或写入文件中的数据,包括所有的位(比特),那么你应该以二进制方式打开文件。例如,在C语言中,你可以使用 fopen 函数来以文本模式或二进制模式打开文件:
在Linux的man手册中只规定了r,r+,w,w+,a,a+,六种模式,然而,在c语言的C99标准中规定的fopen模式不只六种:
r open text file for reading
w truncate to zero length or create text file for writing
a append; open or create text file for writing at end-of-file
rb open binary file for reading
wb truncate to zero length or create binary file for writing
ab append; open or create binary file for writing at end-of-file
r+ open text file for update (reading and writing)
w+ truncate to zero length or create text file for update
a+ append; open or create text file for update, writing at end-of-file
r+b or rb+ open binary file for update (reading and writing)
w+b or wb+ truncate to zero length or create binary file for update
a+b or ab+ append; open or create binary file for update, writing at end-of-file
利用标准IO函数接口实现计算一个本地磁盘某个文件的大小,文件名通过命令行进行传递的更多相关文章
- UNIX高级环境编程(7)标准IO函数库 - 二进制文件IO,流定位,创建临时文件和内存流
1 二进制IO(Binary IO) 在前一篇我们了解了逐字符读写和逐行读写函数. 如果我们在读写二进制文件,希望以此读写整个文件内容,这两个函数虽然可以实现,但是明显会很麻烦且多次循环明显效率很低. ...
- UNIX高级环境编程(6)标准IO函数库 - 流的概念和操作
标准IO函数库隐藏了buffer大小和分配的细节,使得我们可以不用关心预分配的内存大小是否正确的问题. 虽然这使得这个函数库很容易用,但是如果我们对函数的原理不熟悉的话,也容易遇到很多问题. 1 ...
- 第3章 文件I/O(8)_贯穿案例:构建标准IO函数库
9. 贯穿案例:构建标准IO函数库 //mstdio.h #ifndef __MSTDIO_H__ #define __MSTDIO_H__ #include <unistd.h> #de ...
- MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具
这里向大家介绍一个新的生成T-SQL脚本的SQL Server命令行工具:mssql-scripter.它支持在SQL Server.Azure SQL DB以及Azure SQL DW中为数据库生成 ...
- 标准IO函数以及基本知识点总结
什么是标准IO呢?有哪些特点? 标准IO是标准c库提供的对文件操作的函数接口.他的特点是:1 带缓存,2 大部分都调用系统接口函数实现.(c库就是一种实现好的函数接口,作用是屏蔽下层细节.提供上层接口 ...
- 如何用node编写命令行工具,附上一个ginit示例,并推荐好用的命令行工具
原文 手把手教你写一个 Node.js CLI 强大的 Node.js 除了能写传统的 Web 应用,其实还有更广泛的用途.微服务.REST API.各种工具……甚至还能开发物联网和桌面应用.Java ...
- 显示器 Linux 性能 18 (一个命令行工具传递)
对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐认识到监控和保持系统启动并执行是多么的不easy.基于此原因. ...
- 利用迅雷提供的接口从磁力链得到bt种子文件
本地下载工具的磁力链下载速度不给力,而百度云盘有提供离线下载服务,相当于就是直接到服务器取个链接而已.但这需要bt文件,而我只有链力链.网上搜了一下,可以从磁力链构造一个bt文件的下载地址,用pyth ...
- 从一个带有http://网络文件中获取文件名
例如文件网址为: http://a.hiphotos.baidu.com/image/h%3D200/sign=c3da85e50123dd543e73a068e108b3df/80cb39dbb6f ...
- 利用Python实现从百度下载图片到本地磁盘
import urllib.request import os import re url=r'http://image.baidu.com/search/index?tn=baiduimage&am ...
随机推荐
- Windows Server 2008R2服务器 IIS7.0 安装SSL证书并绑定https
本例以阿里云服务器来解说,本服务器为Winodws Server 2008 R2(一般现在至少是2012版本了)默认IIS为7.0 第一步: 在阿里云上申请好证书并下载IIS版本,下载后上传到服务器中 ...
- 在 .NET 9 中使用 Scalar 替代 Swagger
前言 在.NET 9发布以后ASP.NET Core官方团队发布公告已经将Swashbuckle.AspNetCore(一个为ASP.NET Core API提供Swagger工具的项目)从ASP.N ...
- Java开发常用工具链接-copy
Java开发常用工具链接这里汇总了下Java开发过程中常用的一些工具,与一些自动化生成工具. 1. Spring相关工具通过Sql生成Spring相关的项目. Sql生成SpringBoot项目通过M ...
- 分布式Session解决方案详解
4种分布式session解决方案 cookie和session的区别和联系 cookie是本地客户端用来存储少量数据信息的,保存在客户端,用户能够很容易的获取,安全性不高,存储的数据量小session ...
- 金山毒霸提示这是高危入侵行为taskeng.exe
如果安装了金山毒霸之后经常会弹窗提示:这是高位入侵行为.行为发起taskeng.exe.可疑进程regsvr32.EXE,可疑路径antivirus.php,如下入所示: 可以直接点击"阻止 ...
- 面试题:关于StringBuffer()源码的深度理解Debug分析
import org.junit.Test; /** * @author CH * @create 2021 上午 11:23 */ public class IDEADebug { @Test pu ...
- XLSReadWriteII5的使用示例
procedure TForm1.Button1Click(Sender: TObject); var i, n: Integer; XLS: TXLSReadWriteII5; // 引用XLSRe ...
- Q:Tomcat使用的jdk版本而不依赖环境变量
1)在tomcat中显式配置-JVM启动使用内存大小 解决:vim打开tomcat目录下的bin/catalina.sh文件,在文件最上部配置JAVA_OPTS属性. windows下在catalin ...
- Element-UI 使用心得之el-card
el-card 是Element-UI 内置的卡片组件,使用起来很方便,但是对Vuejs和html 不是精通的话,根据自己的要求布局,会出现自己的小困惑,必须添加垂直居中,按照CSS 布局设置,总是 ...
- 关于 False、True、0、1、tinyint(1) 的说明
MySQL 保存 Boolean 值时,用 1 代表 TRUE,0 代表 FALSE:类似一个 bit 位,默认没有数据,即为 0,也即 Faslse MySQL 存储 Boolean 值的类型为 t ...