[源码下载]

不可或缺 Windows Native (10) - C 语言: 文件

作者:webabcd

介绍
不可或缺 Windows Native 之 C 语言

  • 文件

示例
cFile.h

  1. #ifndef _MYHEAD_FILE_
  2. #define _MYHEAD_FILE_
  3.  
  4. #ifdef __cplusplus
  5. extern "C"
  6. #endif
  7.  
  8. char *demo_cFile(char *rootPath);
  9.  
  10. #endif

cFile.c

  1. /*
  2. * 文件
  3. *
  4. * 从用户角度讲,文件可分为普通文件和设备文件两种
  5. * 1、普通文件是指保存在磁盘或其它外部介质上的一段数据
  6. * 2、设备文件是指与主机相联的各种外部设备,操作系统会把各种外部设备也看作是一个文件来进行管理。比如:通常把显示器定义为标准输出文件,键盘定义为标准输入文件
  7. *
  8. * 从文件编码的方式来看,文件可分为 ASCII 码文件(文本文件)和二进制文件
  9. * 1、ASCII 文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的 ASCII 码。比如:字符串 1234567 按字符存放成文本文件,占用 7 个字节
  10. * 2、二进制文件是按二进制的编码方式来存放文件的。比如:数字 1234567 按整型存放成二进制文件,占用 4 个字节
  11. *
  12. * 关于 mkdir(make directory) - 创建目录,rmdir(remove directory) - 删除目录 之类的函数,以后再写
  13. *
  14. *
  15. * 注:EOF(end of file) - 文件的结束标志
  16. */
  17.  
  18. #include "pch.h"
  19. #include "cFile.h"
  20. #include "cHelper.h"
  21.  
  22. void file_demo1();
  23. void file_demo2();
  24. void file_demo3();
  25. void file_demo4();
  26. void file_demo5();
  27.  
  28. char *_rootPath;
  29.  
  30. char *demo_cFile(char *rootPath)
  31. {
  32. _rootPath = rootPath;
  33.  
  34. // 写入文本文件
  35. file_demo1();
  36.  
  37. // 读取文本文件
  38. file_demo2();
  39.  
  40. // 以格式化的方式读写文本文件
  41. file_demo3();
  42.  
  43. // 读写二进制文件
  44. file_demo4();
  45.  
  46. // 文件的内部定位(随机读写,即任意位置读写)
  47. file_demo5();
  48.  
  49. return str_concat2("演示文件的保存路径:", rootPath);
  50. }
  51.  
  52. // 写入文本文件
  53. void file_demo1()
  54. {
  55. // 文件指针 - 指向文件的指针(FILE *指针变量标识符)
  56.  
  57. // 需要访问的文件路径
  58. char *fileName = str_concat2(_rootPath, "\\c_file_demo1.txt");
  59.  
  60. // fopen - 用指定的方式打开指定路径的文件,并返回文件指针(FILE 是由系统定义的结构体,fp 是指向 FILE 的文件指针)
  61. FILE *fp = fopen(fileName, "wt+"); // 第 2 个参数是文件打开方式,其说明参见后面的注释
  62. if (fp == NULL)
  63. {
  64. // 如果 fopen 返回空指针,则说明文件打开失败(errno 中保存着最近一次的错误)
  65. int errNum = errno; // 关于 errno 的预定义参见 errno.h
  66. }
  67. else
  68. {
  69. // rewind - 让指定的文件指针所指文件的内部位置指针移到文件头
  70. rewind(fp);
  71.  
  72. // fputc - 向指定的文件写入字符(这里的 EOF 代表写入失败)
  73. if (fputc('w', fp) == EOF)
  74. {
  75. // ferror - 检查文件在读写时是否出错,返回值为 0 表示正常,否则表示有错
  76. int errNum = ferror(fp); // 关于 errno 的预定义参见 errno.h
  77.  
  78. // clearerr - 清除出错标志,使它为 0 值。
  79. clearerr(fp);
  80. }
  81.  
  82. // fputs - 向指定的文件写入字符串(这里的 EOF 代表写入失败)
  83. if (fputs("ebabcd\nwanglei", fp) == EOF)
  84. {
  85. // ferror - 检查文件在读写时是否出错,返回值为 0 表示正常,否则表示有错
  86. int errNum = ferror(fp); // 关于 errno 的预定义参见 errno.h
  87.  
  88. // clearerr - 清除出错标志,使它为 0 值。
  89. clearerr(fp);
  90. }
  91.  
  92. // fclose - 打开文件后,必须要用 fclose 关闭文件,返回 0 则说明文件正常关闭了
  93. int fcloseResult = fclose(fp);
  94. }
  95.  
  96. free(fileName);
  97. }
  98.  
  99. // 读取文本文件
  100. void file_demo2()
  101. {
  102. char *fileName = str_concat2(_rootPath, "\\c_file_demo1.txt");
  103.  
  104. FILE *fp = fopen(fileName, "rt");
  105. if (fp == NULL)
  106. {
  107. int errNum = errno;
  108. }
  109. else
  110. {
  111. rewind(fp);
  112.  
  113. // fgetc - 一个字符一个字符地读,如遇到 EOF 则文件读完或出错(每个文件末尾都有结束标志 - EOF)
  114. char ch = fgetc(fp);
  115. while (ch != EOF)
  116. {
  117. // 每读一个字符,则内部位置指针会向后移动一个字节
  118. ch = fgetc(fp);
  119. }
  120.  
  121. // feof - 检查文件是否结束(即内部位置指针是否指向 EOF),如结束,则返回非零值,否则返回 0
  122. int isEnd = feof(fp); // 非零值
  123.  
  124. rewind(fp);
  125.  
  126. // feof - 检查文件是否结束(即内部位置指针是否指向 EOF),如结束,则返回非零值,否则返回 0
  127. isEnd = feof(fp); //
  128.  
  129. /*
  130. * fgets(str, n, fp) - 读取字符串函数
  131. * str - 字符数组名,由于保存读取到的字符串
  132. * n - 读出 n-1 个字符并送入字符数组 str 中,然后在结尾加'\0'(在读出 n-1 个字符之前,如遇到了换行符或 EOF,则读取结束)
  133. * fp - 文件指针
  134. */
  135. char str[];
  136. while (fgets(str, , fp) != NULL)
  137. {
  138. // 本例会循环 2 次
  139. // 第 1 次 str 的结果为:webabcd\n
  140. // 第 2 次 str 的结果为:wanglei
  141. }
  142.  
  143. fclose(fp);
  144. }
  145.  
  146. free(fileName);
  147. }
  148.  
  149. // 以格式化的方式读写文本文件
  150. void file_demo3()
  151. {
  152. char *fileName = str_concat2(_rootPath, "\\c_file_demo2.txt");
  153.  
  154. FILE *fp = fopen(fileName, "wt+");
  155. if (fp == NULL)
  156. {
  157. int errNum = errno;
  158. }
  159. else
  160. {
  161. // fprintf(file print formatted) - 以格式化的方式写入字符串(返回值为写入的字节数)
  162. int fprintfResult = fprintf(fp, "%s %d %d\n", "webabcd", , ); //
  163.  
  164. rewind(fp);
  165.  
  166. int num;
  167. int age;
  168. char name[];
  169.  
  170. // fscanf(file scan formatted) - 以格式化的方式读取字符串(返回值为读取的成员数)
  171. int fscanfResult = fscanf(fp, "%s %d %d\n", name, &num, &age); //
  172.  
  173. fclose(fp);
  174. }
  175.  
  176. free(fileName);
  177. }
  178.  
  179. // 读写二进制文件
  180. void file_demo4()
  181. {
  182. struct employee
  183. {
  184. int num;
  185. char name[];
  186. } w[] = { { , "wanglei" }, { , "webabcd" } }, r[], *ww, *rr;
  187.  
  188. ww = w;
  189. rr = r;
  190.  
  191. char *fileName = str_concat2(_rootPath, "\\c_file_demo3.b");
  192.  
  193. FILE *fp = fopen(fileName, "wb+");
  194. if (fp == NULL)
  195. {
  196. int errNum = errno;
  197. }
  198. else
  199. {
  200. /*
  201. * fwrite(buffer, size, count, fp) - 写入二进制数据(返回值为成功写入的数据块数)
  202. * buffer - 需要写入的数据的指针
  203. * size - 每一个数据块的字节数
  204. * count - 需要写入的数据块数
  205. * fp - 文件指针
  206. */
  207. int fwriteResult = fwrite(ww, sizeof(struct employee), , fp); //
  208.  
  209. rewind(fp);
  210.  
  211. /*
  212. * fread(buffer, size, count, fp) - 读取二进制数据(返回值为成功读取的数据块数)
  213. * buffer - 需要保存读取数据的指针
  214. * size - 每一个数据块的字节数
  215. * count - 需要读取的数据块数
  216. * fp - 文件指针
  217. */
  218. int freadResult = fread(rr, sizeof(struct employee), , fp);
  219.  
  220. fclose(fp);
  221. }
  222.  
  223. free(fileName);
  224. }
  225.  
  226. // 文件的内部定位(随机读写,即任意位置读写)
  227. void file_demo5()
  228. {
  229. struct employee
  230. {
  231. int num;
  232. char name[];
  233. } w[] = { { , "wanglei" }, { , "webabcd" } }, r[], *ww, *rr;
  234.  
  235. ww = w;
  236. rr = r;
  237.  
  238. char *fileName = str_concat2(_rootPath, "\\c_file_demo4.b");
  239.  
  240. FILE *fp = fopen(fileName, "wb+");
  241. if (fp == NULL)
  242. {
  243. int errNum = errno;
  244. }
  245. else
  246. {
  247. int fwriteResult = fwrite(ww, sizeof(struct employee), , fp);
  248.  
  249. /*
  250. * rewind(fp) - 把文件内部位置指针移到文件头
  251. * fp - 文件指针
  252. */
  253. rewind(fp);
  254.  
  255. /*
  256. * fseek(fp, offset, origin) - 移动文件内部位置指针
  257. * fp - 文件指针
  258. * offset - 相对于 origin 的位移字节数(长整形,如果用常量的话记得加“L”)
  259. * origin - 位移起始点
  260. * SEEK_SET(0) - 文件头
  261. * SEEK_CUR(1) - 当前位置
  262. * SEEK_END(2) - 文件尾
  263. */
  264. fseek(fp, sizeof(struct employee), SEEK_SET);
  265.  
  266. int freadResult = fread(rr, sizeof(struct employee), , fp); // 200, "webabcd"
  267.  
  268. fclose(fp);
  269. }
  270.  
  271. free(fileName);
  272. }
  273.  
  274. /*
  275. * 关于文件打开方式的说明,即 fopen 的第 2 个参数
  276. * rt 只读打开一个文本文件,只允许读数据
  277. * wt 只写打开或建立一个文本文件,只允许写数据
  278. * at 追加打开一个文本文件,并在文件末尾写数据
  279. * rb 只读打开一个二进制文件,只允许读数据
  280. * wb 只写打开或建立一个二进制文件,只允许写数据
  281. * ab 追加打开一个二进制文件,并在文件末尾写数据
  282. * rt+ 读写打开一个文本文件,允许读和写
  283. * wt+ 读写打开或建立一个文本文件,允许读写
  284. * at+ 读写打开一个文本文件,允许读,或在文件末追加数据
  285. * rb+ 读写打开一个二进制文件,允许读和写
  286. * wb+ 读写打开或建立一个二进制文件,允许读和写
  287. * ab+ 读写打开一个二进制文件,允许读,或在文件末追加数据
  288. *
  289. * 关于上面字符的说明
  290. * r(read) 读
  291. * w(write) 写
  292. * a(append) 追加
  293. * t(text) 文本文件,可省略不写
  294. * b(binary) 二进制文件
  295. * + 读和写
  296. */

OK
[源码下载]

不可或缺 Windows Native (10) - C 语言: 文件的更多相关文章

  1. 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出

    [源码下载] 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 预处理命令 输入 ...

  2. 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域

    [源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...

  3. 不可或缺 Windows Native (1) - C 语言: hello c

    [源码下载] 不可或缺 Windows Native (1) - C 语言: hello c 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 在 Windows Sto ...

  4. 不可或缺 Windows Native (2) - C 语言: 常量,变量,基本数据类型

    [源码下载] 不可或缺 Windows Native (2) - C 语言: 常量,变量,基本数据类型 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 常量 变量 基本 ...

  5. 不可或缺 Windows Native (5) - C 语言: 数组

    [源码下载] 不可或缺 Windows Native (5) - C 语言: 数组 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 数组 示例cArray.h #ifn ...

  6. 不可或缺 Windows Native (6) - C 语言: 函数

    [源码下载] 不可或缺 Windows Native (6) - C 语言: 函数 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 函数 示例cFunction.h # ...

  7. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

  8. 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等

    [源码下载] 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等 作者:webabcd 介绍不可或缺 Windows Native  ...

  9. 不可或缺 Windows Native (7) - C 语言: 指针

    [源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...

随机推荐

  1. 防抖(Debounce)与节流( throttle)区别

    http://www.cnblogs.com/ShadowLoki/p/3712048.html http://blog.csdn.net/tina_ttl/article/details/51830 ...

  2. Hadoop - Kylin On OLAP

    1.概述 Apache Kylin是一个开源的分布式分析引擎,提供SQL接口并且用于OLAP业务于Hadoop的大数据集上,该项目由eBay贡献于Apache. 2.What is Kylin 在使用 ...

  3. CentOS6下Haproxy的安装配置

    Haproxy 是一个开源的负载均衡和反向代理软件,其提供了高可用的网络服务.其一般是应用于web服务,但同时也能为SMTP和终端服务等提供可靠的支持. 1.下载安装haproxy wget ftp: ...

  4. STAF自动化测试框架

    STAF自动化测试框架介绍 http://baike.baidu.com/link?url=9oPZN3JntRakidI7xizqCbyGRISMvCKGfXHBB_WH7OAkKjAKZjq88q ...

  5. 基于HTML5的Web跨设备超声波通信方案

    前言:Chirp在iPhone上掀起了有声传输文件的序幕,我们再也不需要彩信.蓝牙配对.IM来传送数据.它通过“叽叽喳喳”的小鸟叫声来分享数据,简单有趣,而且可以快速的实现一对多的分享. 此外支付宝曾 ...

  6. 再谈LRU双链表内存管理

    N年前我写了个双链表也发了博客,还添了代码.但是那个代码不但复杂,而且还有有问题的,一直懒得整理,放在空间误导别人.最近在写服务端,今天抽点空补一篇. 关于LRU网上随便搜,有过后端经验的人应该很多都 ...

  7. java nio 网络框架

    https://github.com/solq360/common 主要运行在android 平台 解决自动化编/解码,等等.. 模块 解决问题/实现处理 备注 负责人 进度 录音播放 AudioRe ...

  8. C++输入输出

    i. C++如何输入一行,按回车键结束 #include <sstream>1 getline(cin, line); istringstream input(line); ii. C++ ...

  9. 清除SQL数据库的日志

    ALTER DATABASE [Fuliu_Test] SET RECOVERY SIMPLEALTER DATABASE [Fuliu_Test] SET RECOVERY FULLDBCC SHR ...

  10. 12306外包给阿里巴巴/IBM到底是否可行?

    春运开始以后 12306 免不了要罢工几次,毕竟人民群众买票回家的热情实在是高涨,12306 很难承受如此大的压力.每次 12306 网站罢工以后都会有人忍不住对其进行吐槽,而还有人认为如果把 123 ...