利用标准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函数接口实现计算一个本地磁盘某个文件的大小,文件名通过命令行进行传递的更多相关文章

  1. UNIX高级环境编程(7)标准IO函数库 - 二进制文件IO,流定位,创建临时文件和内存流

    1 二进制IO(Binary IO) 在前一篇我们了解了逐字符读写和逐行读写函数. 如果我们在读写二进制文件,希望以此读写整个文件内容,这两个函数虽然可以实现,但是明显会很麻烦且多次循环明显效率很低. ...

  2. UNIX高级环境编程(6)标准IO函数库 - 流的概念和操作

    标准IO函数库隐藏了buffer大小和分配的细节,使得我们可以不用关心预分配的内存大小是否正确的问题. 虽然这使得这个函数库很容易用,但是如果我们对函数的原理不熟悉的话,也容易遇到很多问题.   1 ...

  3. 第3章 文件I/O(8)_贯穿案例:构建标准IO函数库

    9. 贯穿案例:构建标准IO函数库 //mstdio.h #ifndef __MSTDIO_H__ #define __MSTDIO_H__ #include <unistd.h> #de ...

  4. MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具

    这里向大家介绍一个新的生成T-SQL脚本的SQL Server命令行工具:mssql-scripter.它支持在SQL Server.Azure SQL DB以及Azure SQL DW中为数据库生成 ...

  5. 标准IO函数以及基本知识点总结

    什么是标准IO呢?有哪些特点? 标准IO是标准c库提供的对文件操作的函数接口.他的特点是:1 带缓存,2 大部分都调用系统接口函数实现.(c库就是一种实现好的函数接口,作用是屏蔽下层细节.提供上层接口 ...

  6. 如何用node编写命令行工具,附上一个ginit示例,并推荐好用的命令行工具

    原文 手把手教你写一个 Node.js CLI 强大的 Node.js 除了能写传统的 Web 应用,其实还有更广泛的用途.微服务.REST API.各种工具……甚至还能开发物联网和桌面应用.Java ...

  7. 显示器 Linux 性能 18 (一个命令行工具传递)

    对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐认识到监控和保持系统启动并执行是多么的不easy.基于此原因. ...

  8. 利用迅雷提供的接口从磁力链得到bt种子文件

    本地下载工具的磁力链下载速度不给力,而百度云盘有提供离线下载服务,相当于就是直接到服务器取个链接而已.但这需要bt文件,而我只有链力链.网上搜了一下,可以从磁力链构造一个bt文件的下载地址,用pyth ...

  9. 从一个带有http://网络文件中获取文件名

    例如文件网址为: http://a.hiphotos.baidu.com/image/h%3D200/sign=c3da85e50123dd543e73a068e108b3df/80cb39dbb6f ...

  10. 利用Python实现从百度下载图片到本地磁盘

    import urllib.request import os import re url=r'http://image.baidu.com/search/index?tn=baiduimage&am ...

随机推荐

  1. 为了解决服务启动慢的问题,我为什么要给Apollo和Spring提交PR?

    最近在整理之前记录的工作笔记时,看到之前给团队内一组服务优化启动耗时记录的笔记,简单整理了一下分享出来.问题原因并不复杂,主要是如何精准测量和分析,优化后如何定量测量优化效果,说人话就是用实际数据证明 ...

  2. 一个超经典 WinForm,WPF 卡死问题的终极反思

    一:背景 1. 讲故事 写这篇文章起源于训练营里一位朋友最近在微信聊到他对这个问题使用了一种非常切实可行,简单粗暴的方式,并且也成功解决了公司里几个这样的卡死dump,如今在公司已是灵魂级人物,让我也 ...

  3. 国家和地区代码列表,ISO 3166-1:2006

    本文根据ISO 3166-1:2006(International Standard Norme Internationale) 英文版(含2007年补充说明)整理.与ISO 3166-1:1997相 ...

  4. Sharding-JDBC分库分表

    https://blog.csdn.net/bochuangli/article/details/123029392 https://blog.csdn.net/bochuangli/article/ ...

  5. 无耳科技 Solon v3.0.7 发布(2025农历新年版)

    Solon 框架! Solon 框架由杭州无耳科技有限公司(下属 Noear 团队)开发并开源.是新一代,面向全场景的 Java 企业级应用开发框架.从零开始构建(非 java-ee 架构),有灵活的 ...

  6. 取消浏览器中记住密码自动填充时弹出Windows安全中心的验证

    1.问题描述 我们在使用谷歌浏览器的过程中,经常会将一些账号和密码记住在浏览器中,方便下次通过浏览器自动填充. 此方式虽然方便,但是有时候会遇到一种情况,那就是每次在浏览器中使用自动填充的时候,需会弹 ...

  7. 解决Git报“OpenSSL SSL_read: Connection was reset, errno 10054”错的问题

    1.问题描述 有时候当我们使用Git获取资源,会报"OpenSSL SSL_read: Connection was reset, errno 10054"的错误,出现该错误是因为 ...

  8. pip安装MySQLdb报错mysql_config not found

    报错EnvironmentError: mysql_config not found解决方法 1.sudo apt-get install python-setuptools 2.sudo apt-g ...

  9. 常用的linux命令以及详解

    Linux系统中包含了大量的命令,这些命令是用户与系统交互的主要方式.以下是一些常用的Linux命令及其详细解释: 1. 文件和目录操作 ls:列出目录内容. ls:列出当前目录的文件和子目录. ls ...

  10. 『Python底层原理』--CPython的变量实现机制

    在Python中,变量的使用看起来非常简单,例如 a = 10,s = "hello"等等. 然而,这种简单的赋值操作背后,CPython其实做了很多复杂的工作. 本文将通过一些简 ...