stdio.h中包含了声明FILE结构

  1. struct _iobuf {
  2. char *_ptr; //文件输入的下一个位置
  3. int _cnt; //当前缓冲区的相对位置
  4. char *_base; //指基础位置(应该是文件的其始位置)
  5. int _flag; //文件标志
  6. int _file; //文件的有效性验证
  7. int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
  8. int _bufsiz; //文件的大小
  9. char *_tmpfname; //临时文件名
  10. };

FILE作为一种结构,用于访问一个流,如果激活了好几个流,那么每个流都有一个对应的FILE与他关联。当需要对流执行一些操作,调用一些函数,并向他们提供一个相关联的FILE参数。

对于ansi c运行时至少有三个流,标准输入stdin,标准输出stdout,标准错误stderr,他们都是指向FILE结构的指针。标准输入一般是键盘设备,输出是屏幕终端,一般错误和输出都是相同的,也可通过系统的输入\输出重定向进行指定输入输出。

  1. $: program < source > output

从source输入,输出到output。

流I/O总览

通过fopen函数打开一个流,指定读写模式,如果成功打开返回一个FILE *,打开失败返回NULL。

  1. FILE *fopen(char *const *name, char const *mode);

下面是fopen的常用模式

  读取 写入 添加
文本 r w a
二进制 rb wb ab

如果模式是a+,那么表示打开文件更新,可读可写。

fclose关闭流,关闭流可以防止文件被再次访问,保证储存于缓冲区的数据被正确的写入到文件。释放的FILE结构体,可以用于其他另外的文件。

  1. int fclose(FILE *f);

执行成功返回0,否则返回EOF。

文本IO:

文本I/O函数包括三种基本的形式处理数据:单个字符,字符串,格式输入输出

1.字符IO:

fgetc和fputc是真正的函数,其他的都是通过#define指令定义的宏

  1. int getchar()
  2. /*说明:从stdin读取1个字符
  3. 返回值:成功,返回该字符;出错,返回EOF;*/
  4.  
  5. int fgetc(FILE fp)
  6. /*说明:功能同getchar,默认从文件fp读取;
  7. 返回值:成功,返回该字符;出错,返回EOF;
  8. 可以重定向 */
  9.  
  10. int getc(FILE fp)
  11. /*说明:功能与fgetc相同,但getc既可以被用作
  12. 函数实现,也可以被用作宏实现,并且它的编码效率
  13. 可能会更高.
  14. 可以重定向 */
  15.  
  16. int putchar(int ch)
  17. /*说明:向stdout输出字符ch;
  18. 返回值:成功,返回该字符;出错,返回EOF*/
  19.  
  20. int fputc(int c, FILE fp)
  21. /*说明:功能同putchar,默认向fp输出字符ch;
  22. 返回值:成功,返回该字符;出错,返回EOF */
  23.  
  24. int putc(int c , FILE fp)
  25. /*说明:功能与fputc相同,但putc与getc一样既可能被用作
  26. 函数实现,也可能被用作宏实现,并且它的编码效率可能会更高;
  27. 可以重定向 */

下面的代码用于从命令行中读取输入,写入到文本中

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char input;
  5. //D盘新建文件写入命令行输入
  6. FILE *file = fopen("D:/c.txt", "w");
  7. //读取输入
  8. while ((input = getchar()) != EOF) {
  9. //输入q结束
  10. if (input != 'q') {
  11. //打印输入字符,putc和fputc储存输入字符
  12. putchar(input);
  13. fputc(input, file);
  14. putc(input, file);
  15. }else{
  16. fclose(file);
  17. break;
  18. }
  19. }
  20. return 0;
  21. }

执行:

打开文件D:/c.txt,每个字符被fputc和putc输出两遍

撤销字符IO

  1. int ungetc(int character, FILE *stream);

把先前读入的字符返回到流中,这样可以重新被读取。下面的代码读入字母,遇到数字重新换行读取:

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. int main()
  5. {
  6. int input;
  7.  
  8. while((input = getchar()) != EOF && !isdigit(input)){
  9. putchar(input);
  10. }
  11.  
  12. //将数字放回标准输入
  13. ungetc(input, stdin);
  14. puts("\n\ndigit:");
  15. while((input = getchar()) != EOF && isdigit(input)){
  16. putchar(input);
  17. }
  18.  
  19. return 0;
  20. }

2.文本行(字符串) I/O

  1. char gets(char str)
  2. /*说明:从stdin读取字符串(不包括'n')写入到字符串str中;
  3. 返回值:成功,返回str首地址;错误,返回NULL*/
  4.  
  5. char fgets(char str, int N, FILE fp)
  6. /*说明:默认从文件fp中读取N个字符(包括'n')写入到字符串str中,
  7. 如果实际输入字符串小于N, fgets自动添加'n',
  8. 返回值:成功,返回字符串首地址;错误或遇到EOF,返回NULL;
  9. 可以重定向 */
  10.  
  11. int puts(const char str)
  12. /*说明:向stdout输出字符串str,然受输出一个'n',
  13. 返回值:成功,返回非负值;错误,EOF*/
  14.  
  15. int fputs(const char str, FILE fp)
  16. /*说明:功能同puts,默认向文件fp写入字符串str;
  17. 返回值:成功,返回非负值;错误,EOF;
  18. 可以重定向 */

下面的代码用于,从标准输入读取字符串到buffer中,注意buffer的大小可能导致溢出,因为gets没有限定读入的长度。

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define BUFFER_SIZE 100
  5. int main()
  6. {
  7. char buffer[BUFFER_SIZE];
  8. //D盘新建文件写入命令行输入
  9. FILE *file = fopen("D:/c.txt", "w");
  10. //读取输入,注意gets读取输入对长度没有限制,可能会造成溢出
  11. while (gets(buffer) != NULL) {
  12. //只输入一个q结束
  13. if (strlen(buffer) == 1 && buffer[0] == 'q') {
  14. fclose(file);
  15. puts("Bye Bye");
  16. break;
  17. }else{
  18. //将输入字符串打印,然后写入文件中
  19. puts(buffer);
  20. fputs(buffer, file);
  21. }
  22. }
  23.  
  24. puts("------------------------------------------------");
  25. file = fopen("D:/c.txt", "r");
  26. //从文件中每次读取5个字符到buffer中,然后打印
  27. while (fgets(buffer, 10, file) != NULL) {
  28. puts(buffer);
  29. }
  30.  
  31. while (1)
  32. ;
  33.  
  34. return 0;
  35. }

 运行:

3.格式化I/O

当格式化字符串到达末尾或者读取的输入不在匹配格式字符串所指定的类型是,输入就停止,在任何情况下,被转换的输入值的数目作为函数的返回值返回,如果在任何输入值被转换之前就到达末尾,函数就返回常量EOF。

  1. int scanf(const char format, ...)
  2. /*说明:根据format从stdin格式化读取N个值,并输入到...
  3. 返回值:成功,返回读取的项数;出错,返回EOF */
  4.  
  5. int fscanf(FILE fp, const char format, ...)
  6. /*说明:功能同scanf,默认从文件fp读取,
  7. 返回值:成功,返回读取的项数;出错或遇到文件尾,返回EOF */
  8. 可以重定向 */
  9.  
  10. /*int sscanf(const char buf, const char format, ...)
  11. 说明:根据format从buf格式化读取N个值,并输入到...
  12. 返回值:成功,返回读取的项数;出错,返回EOF */
  13.  
  14. int printf(const char format, ...)
  15. /*说明:根据format格式化数据,并输出到stdout
  16. 返回值 成功,返回输出字符数;错误,返回负数; */
  17.  
  18. int fprintf(FILE fp, const char format, ...)
  19. /*说明:功能同printf,默认向文件fp写入;
  20. 可以重定向 */
  21.  
  22. int sprintf(char buf, const char format, ...)
  23. /*说明:根据format格式化数据,并输出到buf,
  24. 返回值:成功,返回输出字符数;错误,返回负数 */

下面的代码从文件中格式化读入,然后提取内容,格式化写入到字符串和文本中

  1. #include <stdio.h>
  2.  
  3. #define BUFFER_SIZE 100
  4. int main()
  5. {
  6. char string[100];
  7. char tmp[100];
  8. int num;
  9. //D盘打开文件
  10. FILE *readFile = fopen("D:/read.txt", "r");
  11. FILE *writeFile = fopen("D:/write.txt", "w");
  12.  
  13. //格式化读入文件内容
  14. while (fscanf(readFile, "%3d,,,%s", &num, &string) != EOF) {
  15. //格式化写入字符串tmp中
  16. sprintf(tmp, "id: %d type: %-10s\n", num, string);
  17. printf("%s\n", tmp);
  18. //格式化写入文件中
  19. fprintf(writeFile, "id: %-4d type: %s\n", num, string);
  20. }
  21.  
  22. return 0;
  23. }

read.txt文件内容:

  1. 255,,,棉衣
  2. 255,,,毛呢大衣
  3. 255,,,风衣
  4. 255,,,打底衫
  5. 255,,,情侣装
  6. 255,,,毛呢短裤
  7. 255,,,牛仔裤
  8. 255,,,加绒打底裤
  9. 255,,,小脚裤
  10. 255,,,半身裙
  11. 255,,,毛呢连衣裙
  12. 255,,,长袖连衣裙

运行:

write.txt文件内容:

  1. id: 255 type: 棉衣
  2. id: 255 type: 毛呢大衣
  3. id: 255 type: 风衣
  4. id: 255 type: 打底衫
  5. id: 255 type: 情侣装
  6. id: 255 type: 毛呢短裤
  7. id: 255 type: 牛仔裤
  8. id: 255 type: 加绒打底裤
  9. id: 255 type: 小脚裤
  10. id: 255 type: 半身裙
  11. id: 255 type: 毛呢连衣裙
  12. id: 255 type: 长袖连衣裙

C和指针 第十五章 文件I/O的更多相关文章

  1. C和指针 第十五章 二进制I/O

    二进制I/O 数据写入到文件效率最高的是用二进制形式写入,二进制输出避免了在数值转换为字符串过程中,所涉及的开销和精度损失,但而精致并非人眼所能阅读,所以这个技巧只有当数据被另一个程序按顺序读取才能使 ...

  2. C和指针 第十五章 习题

    15.8 十六进制倾印码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...

  3. C和指针 第十五章 输入输出缓冲

    对于C,所有的I/O操作都只是简单的从程序移进或移出字节,这种字节流便成为流(stream),我们需要关心的只是创建正确的输出字节数据,以及正确的输入读取数据,特定的I/O设备细节都是对程序隐藏的. ...

  4. C和指针 第十五章 错误报告perror和exit

    15.1 错误报告 perror 任何一种程序都存在出错的可能,包括系统的函数库,当出现错误时,系统提示发生错误,标准库函数在一个外部整型变量中保存错误代码,然后把错误代码传给用户程序,提示错误原因. ...

  5. 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记

    第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...

  6. perl5 第五章 文件读写

    第五章 文件读写 by flamephoenix 一.打开.关闭文件二.读文件三.写文件四.判断文件状态五.命令行参数六.打开管道 一.打开.关闭文件   语法为open (filevar, file ...

  7. Gradle 1.12用户指南翻译——第四十五章. 应用程序插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  8. Gradle 1.12 翻译——第十五章. 任务详述

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  9. Gradle 1.12用户指南翻译——第二十五章. Scala 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

随机推荐

  1. 【Unity Shaders】学习笔记

    http://www.cnblogs.com/-867259206/p/5596698.html

  2. java util 下的concurrent包

    ------------------------------------------java util 下的concurrent包--------并发包--------------------.jav ...

  3. channel Golang

    Golang, 以17个简短代码片段,切底弄懂 channel 基础 (原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的 ...

  4. [LeetCode] Contains Duplicate II 包含重复值之二

    Given an array of integers and an integer k, return true if and only if there are two distinct indic ...

  5. [LeetCode] Rank Scores 分数排行

    Write a SQL query to rank scores. If there is a tie between two scores, both should have the same ra ...

  6. [转]CSS如何设置html table表格边框样式

    原文地址:http://www.divcss5.com/wenji/w503.shtml 对table设置css样式边框,分为几种情况: 1.只对table设置边框 2.对td设置边框 3.对tabl ...

  7. mybatis返回数据类型为map,值为null的key没返回

    创建mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

  8. win10使用技巧之如何打出偏僻字母

    一.背景 有时需要在打出一些希腊字母,诸如ɛ.μ等字符,如果输入法不支持该怎么办呢?在很多国产拼音软件中,都会提供扩展方便用户寻找这类字符,但是如果用户换过一款软件,可能要在一定时间找到这些字符就没那 ...

  9. StringTokenizer类的使用

    StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数. 1.构造函数 public StringTokenizer(String str) public Str ...

  10. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...