1、文件大小查询file_size.c

  方法一:fseek + ftell;

  方法二:ftell

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <errno.h>
  6.  
  7. void errHandling(const char *errMsg)
  8. {
  9. printf("%s: %s\n", errMsg, strerror(errno));
  10. exit(-);
  11. }
  12.  
  13. long getFileSize1(FILE *fp)
  14. {
  15. if (fseek(fp, , SEEK_END) != )
  16. {
  17. errHandling("fseek() fail");
  18. }
  19. return ftell(fp);
  20. }
  21.  
  22. long getFileSize2(int fd)
  23. {
  24. struct stat st;
  25. if ((fstat(fd, &st)) != )
  26. {
  27. errHandling("fstat() fail");
  28. }
  29. return st.st_size;
  30. }
  31.  
  32. int main(int argc, char *argv[])
  33. {
  34. if (argc != )
  35. {
  36. printf("Usage: %s <file_name>\n", argv[]);
  37. exit(-);
  38. }
  39.  
  40. FILE *fp = fopen(argv[], "r");
  41. if (NULL == fp)
  42. {
  43. errHandling("open() fail");
  44. }
  45.  
  46. printf("The size of %s: %ld bytes (fseek+ftell)\n", argv[], getFileSize1(fp));
  47. printf("The size of %s: %ld bytes (fstat)\n", argv[], getFileSize2(fileno(fp)));
  48.  
  49. fclose(fp);
  50. exit();
  51. }

2、特定大小文件创建以及读取操作时间测试 read_file_time.c

  描述:创建1G大小文件,并完成顺序、逆序以及随机读取操作

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #include <sys/time.h>
  7.  
  8. #define BUF_SIZE (1024 * 1024)
  9. #define READ_SIZE (BUF_SIZE * 1024)
  10. #define NUM_ROUND 1024
  11.  
  12. void errHandling(const char *errMsg)
  13. {
  14. printf("%s: %s\n", errMsg, strerror(errno));
  15. exit(-);
  16. }
  17.  
  18. long getFileSize(int fd)
  19. {
  20. struct stat st;
  21. if ((fstat(fd, &st)) != )
  22. {
  23. errHandling("fstat() fail");
  24. }
  25. return st.st_size;
  26. }
  27.  
  28. /* in sequence */
  29. unsigned long getReadTimeSeq(char *pbuf, FILE *pf)
  30. {
  31. int readCnt = ;
  32. struct timeval bgn;
  33. struct timeval end;
  34. unsigned long timeCnt = ;
  35.  
  36. memset(&bgn, , sizeof(struct timeval));
  37. memset(&end, , sizeof(struct timeval));
  38. printf("Start read in sequence\n");
  39. gettimeofday(&bgn, NULL);
  40. while (readCnt < READ_SIZE)
  41. {
  42. memset(pbuf, , BUF_SIZE);
  43. readCnt += fread(pbuf, , BUF_SIZE, pf);
  44. //printf("read %d MB\n", readCnt >> 20);
  45. }
  46. gettimeofday(&end, NULL);
  47. return ((end.tv_sec - bgn.tv_sec) * + (end.tv_usec - bgn.tv_usec));
  48. }
  49.  
  50. /* inverted sequence */
  51. unsigned long getReadTimeInvertSeq(char *pbuf, FILE *pf)
  52. {
  53. int readCnt = ;
  54. long shift = READ_SIZE - BUF_SIZE;
  55. struct timeval bgn;
  56. struct timeval end;
  57. unsigned long timeCnt = ;
  58.  
  59. memset(&bgn, , sizeof(struct timeval));
  60. memset(&end, , sizeof(struct timeval));
  61. //printf("Start read in inverted sequence\n");
  62. gettimeofday(&bgn, NULL);
  63. while (readCnt < READ_SIZE)
  64. {
  65. fseek(pf, shift, SEEK_SET);
  66. memset(pbuf, , BUF_SIZE);
  67. readCnt += fread(pbuf, , BUF_SIZE, pf);
  68. shift -= readCnt;
  69. //printf("read %d MB\n", readCnt >> 20);
  70. }
  71. gettimeofday(&end, NULL);
  72. return ((end.tv_sec - bgn.tv_sec) * + (end.tv_usec - bgn.tv_usec));
  73. }
  74.  
  75. /* Random sequence */
  76. unsigned long getReadTimeRandPos(char *pbuf, FILE *pf)
  77. {
  78. int readCnt = ;
  79. long shift = READ_SIZE - BUF_SIZE;
  80. struct timeval bgn;
  81. struct timeval end;
  82. unsigned long timeCnt = ;
  83.  
  84. memset(&bgn, , sizeof(struct timeval));
  85. memset(&end, , sizeof(struct timeval));
  86. srand((int)time());
  87. //int num = 0;
  88. gettimeofday(&bgn, NULL);
  89. while (readCnt < READ_SIZE)
  90. {
  91. //++num;
  92. shift = BUF_SIZE * (rand() % NUM_ROUND);
  93. fseek(pf, shift, SEEK_SET);
  94. memset(pbuf, , BUF_SIZE);
  95. readCnt += fread(pbuf, , BUF_SIZE, pf);
  96. }
  97. gettimeofday(&end, NULL);
  98. //printf("num = %d\n", num);
  99. return ((end.tv_sec - bgn.tv_sec) * + (end.tv_usec - bgn.tv_usec));
  100. }
  101.  
  102. int main(int argc, char *argv[])
  103. {
  104. if (argc != )
  105. {
  106. printf("Usage: %s <file_name>\n", argv[]);
  107. exit(-);
  108. }
  109.  
  110. FILE *pf = fopen(argv[], "w+");
  111. if (NULL == pf)
  112. {
  113. errHandling("open() fail");
  114. }
  115. /*生成大小为1G的文件*/
  116. fseek(pf, READ_SIZE, SEEK_SET);
  117. fputc(, pf);
  118. rewind(pf);
  119.  
  120. char *buf = (char *)malloc(BUF_SIZE * sizeof(char));
  121. if (NULL == buf)
  122. {
  123. errHandling("malloc() fail");
  124. }
  125.  
  126. printf("Time in sequence: timeCnt = %ld us\n", getReadTimeSeq(buf, pf));
  127. printf("Time in inverted sequence: timeCnt = %ld us\n", getReadTimeInvertSeq(buf, pf));
  128. printf("Time in random sequence: timeCnt = %ld us\n", getReadTimeRandPos(buf, pf));
  129.  
  130. fclose(pf);
  131. free(buf);
  132. exit();
  133. }

3、编译

  1. EXES := read size
  2.  
  3. .PHONY : all
  4. all : $(EXES)
  5.  
  6. read : read_file_time.o
  7. gcc -o read read_file_time.o
  8. read_file_time.o : read_file_time.c
  9. gcc -c read_file_time.c
  10.  
  11. size : file_size.o
  12. gcc -o size file_size.o
  13. file_size.o : file_size.c
  14. gcc -c file_size.c
  15.  
  16. clean :
  17. rm -f *.o $(EXES)

  统一编译以上两个源文件,并生成两个对应的可执行文件

fopen & fcolse & fseek & ftell & fstat 文件操作函数测试的更多相关文章

  1. C语言样式的文件操作函数

    使用C语言样式的文件操作函数,需要包含stdio.h头文件. 1.打开文件的函数: //oflag的取值为“w”或“r”,分别表示以写或读的方式打开 FILE* fd = fopen(filename ...

  2. C语言文件操作函数

    C语言文件操作函数大全 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * str ...

  3. 【阅读笔记】《C程序员 从校园到职场》第六章 常用文件操作函数 (Part 1)

    参考链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/24926023 让你提前认识软件开发(18):C语言中常用的文件操作函数总结 ...

  4. Linux C 文件操作函数(~上善止水~)

    翻翻笔记,整理一下 C 语言中的文件操作函数 ~~~~~~,多注意细节,maybe 细节决定成败~ 1. fopen /* fopen(打开文件) * * 相关函数 open,fclose * * 表 ...

  5. 文件操作(FILE)与常用文件操作函数

    文件 1.文件基本概念 C程序把文件分为ASCII文件和二进制文件,ASCII文件又称文本文件,二进制文件和文本文件(也称ASCII码文件)二进制文件中,数值型数据是以二进制形式存储的, 而在文本文件 ...

  6. C语言文件操作函数大全(超详细)

    C语言文件操作函数大全(超详细) 作者: 字体:[增加 减小] 类型:转载 本篇文章是对C语言中的文件操作函数进行了详细的总结分析,需要的朋友参考下   fopen(打开文件)相关函数 open,fc ...

  7. PHP常用的文件操作函数集锦

    以下是个人总结的PHP文件操作函数.当然,这只是部分,还有很多,我没有列出来. 一 .解析路径: 1 获得文件名:basename();给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件 ...

  8. 总结文件操作函数(一)-C语言

    在进程一開始执行,就自己主动打开了三个相应设备的文件.它们是标准输入.输出.错误流.分别用全局文件指针stdin.stdout.stderr表示,相应的文件描写叙述符为0.1.2:stdin具有可读属 ...

  9. 总结文件操作函数(二)-C语言

    格式化读写: #include <stdio.h> int printf(const char *format, ...);                   //相当于fprintf( ...

随机推荐

  1. HDU 2242 考研路茫茫——空调教室(边双连通分量+树形dp+重边标号)

    http://acm.hdu.edu.cn/showproblem.php?pid=2242 题意: 思路:首先求一下双连通分量,如果只有一个双连通分量,那么无论断哪根管子,图还是连通的. 最后只需要 ...

  2. shell printf

    printf 可以格式化字符串,还可以制定字符串的宽度.左右对齐方式等.默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n. 例子: $ echo "Hello, ...

  3. python 斐波那契查找

    def fibonacci_search(lis, key): # F = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987 ...

  4. django字段的参数

    所有的模型字段都可以接收一定数量的参数,比如CharField至少需要一个max_length参数.下面的这些参数是所有字段都可以使用的,并且是可选的. null 该值为True时,Django在数据 ...

  5. HTTP请求GET/POST查看工具

    当你有一个http的get请求需要知道结果,可以直接在浏览器上输入,然后等待查看结果.    那如果是一个post请求呢?推荐使用一个国外工具Send HTTP Tool.    传送门:http:/ ...

  6. C#判断一个字符串是否全部为空格的一个简单方法

    string nickName = " "; if (nickName.Trim() == string.Empty) { } else { }

  7. C#对实体进行JSON序列化时枚举的处理

    实体类如下: public enum ESex { Boy, Girl } public class Person { public String Name { get; set; } public ...

  8. m_Orchestrate learning system---三十二、数据库字段判断为空时容易出现问题,如何从根本上解决这个问题

    m_Orchestrate learning system---三十二.数据库字段判断为空时容易出现问题,如何从根本上解决这个问题 一.总结 一句话总结:字段禁止为空,设置默认值0即可 禁止 空 默认 ...

  9. Java 本地环境设置

    如果你希望在你的本地环境中设置 Java 程序环境,下面的这部分将会指导你在你的本地计算机上下载和设置 Java 环境.你可以按照下面的步骤进行. Java SE 目前是免费下载的,你可以通过单击下面 ...

  10. BOM对象思维导图