fopen & fcolse & fseek & ftell & fstat 文件操作函数测试
1、文件大小查询file_size.c
方法一:fseek + ftell;
方法二:ftell
- #include <stdio.h>
- #include <fcntl.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
- void errHandling(const char *errMsg)
- {
- printf("%s: %s\n", errMsg, strerror(errno));
- exit(-);
- }
- long getFileSize1(FILE *fp)
- {
- if (fseek(fp, , SEEK_END) != )
- {
- errHandling("fseek() fail");
- }
- return ftell(fp);
- }
- long getFileSize2(int fd)
- {
- struct stat st;
- if ((fstat(fd, &st)) != )
- {
- errHandling("fstat() fail");
- }
- return st.st_size;
- }
- int main(int argc, char *argv[])
- {
- if (argc != )
- {
- printf("Usage: %s <file_name>\n", argv[]);
- exit(-);
- }
- FILE *fp = fopen(argv[], "r");
- if (NULL == fp)
- {
- errHandling("open() fail");
- }
- printf("The size of %s: %ld bytes (fseek+ftell)\n", argv[], getFileSize1(fp));
- printf("The size of %s: %ld bytes (fstat)\n", argv[], getFileSize2(fileno(fp)));
- fclose(fp);
- exit();
- }
2、特定大小文件创建以及读取操作时间测试 read_file_time.c
描述:创建1G大小文件,并完成顺序、逆序以及随机读取操作
- #include <stdio.h>
- #include <fcntl.h>
- #include <stdlib.h>
- #include <string.h>
- #include <errno.h>
- #include <sys/time.h>
- #define BUF_SIZE (1024 * 1024)
- #define READ_SIZE (BUF_SIZE * 1024)
- #define NUM_ROUND 1024
- void errHandling(const char *errMsg)
- {
- printf("%s: %s\n", errMsg, strerror(errno));
- exit(-);
- }
- long getFileSize(int fd)
- {
- struct stat st;
- if ((fstat(fd, &st)) != )
- {
- errHandling("fstat() fail");
- }
- return st.st_size;
- }
- /* in sequence */
- unsigned long getReadTimeSeq(char *pbuf, FILE *pf)
- {
- int readCnt = ;
- struct timeval bgn;
- struct timeval end;
- unsigned long timeCnt = ;
- memset(&bgn, , sizeof(struct timeval));
- memset(&end, , sizeof(struct timeval));
- printf("Start read in sequence\n");
- gettimeofday(&bgn, NULL);
- while (readCnt < READ_SIZE)
- {
- memset(pbuf, , BUF_SIZE);
- readCnt += fread(pbuf, , BUF_SIZE, pf);
- //printf("read %d MB\n", readCnt >> 20);
- }
- gettimeofday(&end, NULL);
- return ((end.tv_sec - bgn.tv_sec) * + (end.tv_usec - bgn.tv_usec));
- }
- /* inverted sequence */
- unsigned long getReadTimeInvertSeq(char *pbuf, FILE *pf)
- {
- int readCnt = ;
- long shift = READ_SIZE - BUF_SIZE;
- struct timeval bgn;
- struct timeval end;
- unsigned long timeCnt = ;
- memset(&bgn, , sizeof(struct timeval));
- memset(&end, , sizeof(struct timeval));
- //printf("Start read in inverted sequence\n");
- gettimeofday(&bgn, NULL);
- while (readCnt < READ_SIZE)
- {
- fseek(pf, shift, SEEK_SET);
- memset(pbuf, , BUF_SIZE);
- readCnt += fread(pbuf, , BUF_SIZE, pf);
- shift -= readCnt;
- //printf("read %d MB\n", readCnt >> 20);
- }
- gettimeofday(&end, NULL);
- return ((end.tv_sec - bgn.tv_sec) * + (end.tv_usec - bgn.tv_usec));
- }
- /* Random sequence */
- unsigned long getReadTimeRandPos(char *pbuf, FILE *pf)
- {
- int readCnt = ;
- long shift = READ_SIZE - BUF_SIZE;
- struct timeval bgn;
- struct timeval end;
- unsigned long timeCnt = ;
- memset(&bgn, , sizeof(struct timeval));
- memset(&end, , sizeof(struct timeval));
- srand((int)time());
- //int num = 0;
- gettimeofday(&bgn, NULL);
- while (readCnt < READ_SIZE)
- {
- //++num;
- shift = BUF_SIZE * (rand() % NUM_ROUND);
- fseek(pf, shift, SEEK_SET);
- memset(pbuf, , BUF_SIZE);
- readCnt += fread(pbuf, , BUF_SIZE, pf);
- }
- gettimeofday(&end, NULL);
- //printf("num = %d\n", num);
- return ((end.tv_sec - bgn.tv_sec) * + (end.tv_usec - bgn.tv_usec));
- }
- int main(int argc, char *argv[])
- {
- if (argc != )
- {
- printf("Usage: %s <file_name>\n", argv[]);
- exit(-);
- }
- FILE *pf = fopen(argv[], "w+");
- if (NULL == pf)
- {
- errHandling("open() fail");
- }
- /*生成大小为1G的文件*/
- fseek(pf, READ_SIZE, SEEK_SET);
- fputc(, pf);
- rewind(pf);
- char *buf = (char *)malloc(BUF_SIZE * sizeof(char));
- if (NULL == buf)
- {
- errHandling("malloc() fail");
- }
- printf("Time in sequence: timeCnt = %ld us\n", getReadTimeSeq(buf, pf));
- printf("Time in inverted sequence: timeCnt = %ld us\n", getReadTimeInvertSeq(buf, pf));
- printf("Time in random sequence: timeCnt = %ld us\n", getReadTimeRandPos(buf, pf));
- fclose(pf);
- free(buf);
- exit();
- }
3、编译
- EXES := read size
- .PHONY : all
- all : $(EXES)
- read : read_file_time.o
- gcc -o read read_file_time.o
- read_file_time.o : read_file_time.c
- gcc -c read_file_time.c
- size : file_size.o
- gcc -o size file_size.o
- file_size.o : file_size.c
- gcc -c file_size.c
- clean :
- rm -f *.o $(EXES)
统一编译以上两个源文件,并生成两个对应的可执行文件
fopen & fcolse & fseek & ftell & fstat 文件操作函数测试的更多相关文章
- C语言样式的文件操作函数
使用C语言样式的文件操作函数,需要包含stdio.h头文件. 1.打开文件的函数: //oflag的取值为“w”或“r”,分别表示以写或读的方式打开 FILE* fd = fopen(filename ...
- C语言文件操作函数
C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...
- 【阅读笔记】《C程序员 从校园到职场》第六章 常用文件操作函数 (Part 1)
参考链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/24926023 让你提前认识软件开发(18):C语言中常用的文件操作函数总结 ...
- Linux C 文件操作函数(~上善止水~)
翻翻笔记,整理一下 C 语言中的文件操作函数 ~~~~~~,多注意细节,maybe 细节决定成败~ 1. fopen /* fopen(打开文件) * * 相关函数 open,fclose * * 表 ...
- 文件操作(FILE)与常用文件操作函数
文件 1.文件基本概念 C程序把文件分为ASCII文件和二进制文件,ASCII文件又称文本文件,二进制文件和文本文件(也称ASCII码文件)二进制文件中,数值型数据是以二进制形式存储的, 而在文本文件 ...
- C语言文件操作函数大全(超详细)
C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下 fopen(打开文件)相关函数 open,fc ...
- PHP常用的文件操作函数集锦
以下是个人总结的PHP文件操作函数.当然,这只是部分,还有很多,我没有列出来. 一 .解析路径: 1 获得文件名:basename();给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件 ...
- 总结文件操作函数(一)-C语言
在进程一開始执行,就自己主动打开了三个相应设备的文件.它们是标准输入.输出.错误流.分别用全局文件指针stdin.stdout.stderr表示,相应的文件描写叙述符为0.1.2:stdin具有可读属 ...
- 总结文件操作函数(二)-C语言
格式化读写: #include <stdio.h> int printf(const char *format, ...); //相当于fprintf( ...
随机推荐
- HDU 2242 考研路茫茫——空调教室(边双连通分量+树形dp+重边标号)
http://acm.hdu.edu.cn/showproblem.php?pid=2242 题意: 思路:首先求一下双连通分量,如果只有一个双连通分量,那么无论断哪根管子,图还是连通的. 最后只需要 ...
- shell printf
printf 可以格式化字符串,还可以制定字符串的宽度.左右对齐方式等.默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n. 例子: $ echo "Hello, ...
- python 斐波那契查找
def fibonacci_search(lis, key): # F = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987 ...
- django字段的参数
所有的模型字段都可以接收一定数量的参数,比如CharField至少需要一个max_length参数.下面的这些参数是所有字段都可以使用的,并且是可选的. null 该值为True时,Django在数据 ...
- HTTP请求GET/POST查看工具
当你有一个http的get请求需要知道结果,可以直接在浏览器上输入,然后等待查看结果. 那如果是一个post请求呢?推荐使用一个国外工具Send HTTP Tool. 传送门:http:/ ...
- C#判断一个字符串是否全部为空格的一个简单方法
string nickName = " "; if (nickName.Trim() == string.Empty) { } else { }
- C#对实体进行JSON序列化时枚举的处理
实体类如下: public enum ESex { Boy, Girl } public class Person { public String Name { get; set; } public ...
- m_Orchestrate learning system---三十二、数据库字段判断为空时容易出现问题,如何从根本上解决这个问题
m_Orchestrate learning system---三十二.数据库字段判断为空时容易出现问题,如何从根本上解决这个问题 一.总结 一句话总结:字段禁止为空,设置默认值0即可 禁止 空 默认 ...
- Java 本地环境设置
如果你希望在你的本地环境中设置 Java 程序环境,下面的这部分将会指导你在你的本地计算机上下载和设置 Java 环境.你可以按照下面的步骤进行. Java SE 目前是免费下载的,你可以通过单击下面 ...
- BOM对象思维导图