利用标准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 ...
随机推荐
- CDS标准视图:安排维护计划的调用 I_MAINTENANCEPLANSCHEDULE
视图名称:安排维护计划的调用 I_MAINTENANCEPLANSCHEDULE 视图类型: 视图代码: 点击查看代码 @AbapCatalog.compiler.compareFilter: tru ...
- 史上最全memcached面试26题和答案
Memcached是什么? Memcached是一个开源的,高性能的内存绶存软件,从名称上看Mem就是内存的意思,而Cache就是缓存的意思. Memcached的作用? Memcached的作用:通 ...
- SpringCloud(2)---入门篇
SpringCloud(6)---熔断降级理解.Hystrix实战 一.概念 1.为什么需要熔断降级 (1)需求背景 它是系统负载过高,突发流量或者网络等各种异常情况介绍,常用的解决方案. 在一个分布 ...
- [rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(05):svg图片转为png格式(暨svg部件的使用)
前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发. iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动. 本合集是基于新版本的关于分 ...
- 快速 log2 取整算法 (O(1) 时间与空间复杂度)
先上核心代码(文末附针对多种整数类型的代码): inline int log_2(int x) { int rst = 0; if (x & 0xffff'0000U) rst += 16, ...
- Idea无法下载插件或下载插件报错
Plugin Python was not installed: Cannot download 'https://plugins.jetbrains. file -> settings -& ...
- Amis坑
一.特殊字符 1.输入框.多行输入框输入$s字符默认替换成空. 如调用后端接口的输入框输入123$BB123,实际请求的参数为123,$后面的参数消息 解决办法:如确实需要输入$的话,在$前面加\即可 ...
- Vue3 性能优化十大技巧:打造高性能应用的终极指南
在现代前端开发中,性能优化是提升用户体验和系统效率的关键.Vue3 作为目前最流行的前端框架之一,提供了许多内置的性能优化工具和方法.本文将深入探讨 Vue3 中的十大性能优化技巧,帮助你从零开始构建 ...
- 解密ZAB协议:Zookeeper一致性的核心实现
一致性问题 设计一个分布式系统必定会遇到一个问题-- 因为分区容忍性(partition tolerance)的存在,就必定要求我们需要在系统可用性(availability)和数据一致性(consi ...
- 爱快路由-宽带刷下行流量docker版教程
疑难解答加微信机器人,给它发:进群,会拉你进入八米交流群 机器人微信号:bamibot 简洁版教程访问:https://bbs.8miyun.cn 一天天看直播上行流量太高,给你下行加加速吧,让你下行 ...