C primer plus 学习笔记 第13章 文件输入/输出

简介: C primer plus 学习笔记 第13章 文件输入/输出

第13章 文件输入\输出

13.1 与文件进行通信

13.1.1 文件是什么

C把文件看作是一系列连续的字节。C提供两种文件模式:文本模式和二进制模式。

13.1.2 文本模式和二进制模式

13.1.3 I/O的级别

13.1.4 标准文件

C程序会自动打开3个文件:标准输入,标准输出和标准错误输出。

 

13.2 标准I/O

/*count.c */
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>  //提供exit()函数
int main(int argc, char* argv[])
{
  int ch;
  FILE *fp; //文件指针
  unsigned long count = 0;
  if (argc != 2)
  {
    printf("Usage: %s filename\n", argv[0]);
    exit(EXIT_FAILURE);
  }
  if ((fp = fopen(argv[1], "r")) == NULL)
  {
    printf("Can't open %s\n", argv[1]);
    exit(EXIT_FAILURE);
  }
  while ((ch = getc(fp)) != EOF)
  {
    putc(ch, stdout);
    count++;
  }
  fclose(fp);
  printf("\nFile %s has %lu characters\n", argv[1], count);
 
  return 0;
 
}


13.2.1 检查命令行参数

13.2.2 fopen()函数  程序使用fopen()函数打开文件,(函数声明在stdio.h)。

fopen()的第一个参数是待打开文件的名称,第2个参数是一个字符串,指定打开文件的模式(见f表open()的模式字符串)。

fopen()的返回值是一个文件指针(file pointer),文件指针的类型是指向FILE的指针(FILE定义在stdio.h中)

13.2.3 getc()和putc()函数

类似与getchar(),但getc()是从文件中获取一个字符。

ch = getc(fp); //fp是FILE类型的指针。

putc()是将字符放在指针指向的文件中:

putc(ch, fp);

13.2.4 文件结尾

如果getc()读取字符数发现它是文件结尾,它会返回一个值“EOF"。

13.2.5 fclose()函数

fclose(fp)函数关闭fp指定的文件。

成功关闭时返回0,否则返回EOF。借此可以检测文件是否成功关闭:

if (fclose(fp)!=0)

 printf("Error in closeing file \n");

13.2.6 指向标准文件的指针

13.3 一个简单的文件压缩程序

(将某个文本文件的内容”压缩“,压缩方法是每3个字符只保留第一个,剩下两个丢弃)

//reducto.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 40
int main(int argc, char * argv[])
{
  FILE * in, *out;
  int ch;
  char name[LEN];
  int count = 0;
 
  if (argc < 2)
  {
    fprintf(stderr, "Usage: %s filename\n", argv[0]);
    exit(EXIT_FAILURE);
  }
  //设置输入
  if ((in = fopen(argv[1], "r")) == NULL)
  {
    fprintf(stderr, "I couldn't open the file \"%s\"\n ", argv[1]);
    exit(EXIT_FAILURE);
  }
  //设置输出
  strncpy(name, argv[1], LEN - 5); // 拷贝文件名
  name[LEN - 5] = '\0';
  strcat(name, ".red");
  if ((out = fopen(name, "w")) == NULL)
  {
    fprintf(stderr, "Can't create output file.\n");
    exit(3);
  }
  //拷贝数据
  while ( (ch=getc(in))!=EOF)
  {
    if (count++ % 3 == 0)
      putc(ch, out);
  }
  if (fclose(in) != 0 || fclose(out) != 0)
    fprintf(stderr, "Error in closing files.\n");
 
  return 0;
}

13.4 文件I/O:fprintf()、fscanf()、fgets()、fputs()

/*addaword.c --fprintf() fscanf() rewind()*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 41
 
int main(void)
{
  FILE *fp;
  char words[MAX];
  if ((fp = fopen("wordy", "a+")) == NULL)
  {
    fprintf(stdout, "Can't open \"wordy\" file.\n");
    exit(EXIT_FAILURE);
  }
  puts("Enter words to add to the file; press the #");
  puts("key at the beginning of a line to terminate.");
  while ((fscanf(stdin, "%40s", words) == 1) && (words[0] != '#'))
    fprintf(fp, "%s\n", words);
  puts("File contents:");
  rewind(fp);//回到文件开始处。
  while (fscanf(fp, "%s", words) == 1)
    puts(words);
  puts("Done!");
  if (fclose(fp) != 0)
    fprintf(stderr, "Error closing file\n");
 
  return 0;
}

13.4.1 fprintf()和fscanf()函数

13.4.2 fgets()和fputs()函数

 

13.5 随机访问:fseek()和ftell()

有了fseek()函数,便可把文件看作时数组,移动到文件的任意字节处。ftell()函数返回一个long类型的值,表示文件中的当前位置。

 

13.6 标准I/O 的机理

13.7 其他标准I/O函数

相关文章
|
JavaScript
Vue的自定义事件是什么?如何使用?
Vue的自定义事件是什么?如何使用?
178 1
|
消息中间件 运维 Kafka
Apache Flink 实践问题之达到网卡的最大速度如何解决
Apache Flink 实践问题之达到网卡的最大速度如何解决
188 2
|
存储 Java
心得经验总结:浅谈Java类中的变量初始化顺序
心得经验总结:浅谈Java类中的变量初始化顺序
155 1
|
安全 Android开发 iOS开发
安卓与iOS的较量:技术深度与用户体验的平衡艺术
在智能手机操作系统的大舞台上,安卓和iOS一直是两位重量级选手。它们各自拥有独特的技术架构、开发模式和用户群体。本文将深入探讨这两个系统在技术实现和用户体验方面的差异,以及开发者如何在这两个平台上进行优化,从而为用户提供更加流畅、高效的使用体验。
|
存储 XML 缓存
Base64图片是什么?原理是什么?优缺点是什么?
Base64图片是什么?原理是什么?优缺点是什么?
692 0
|
SQL 安全 数据库
Android -SQLite 的增删改查(CRUD)
Android -SQLite 的增删改查(CRUD)
314 0
|
PyTorch 调度 算法框架/工具
MMDetection系列 | 5. MMDetection运行配置介绍
MMDetection系列 | 5. MMDetection运行配置介绍
1442 0
|
存储 SQL 分布式计算
|
运维 监控 安全
实时数仓入门训练营:实时计算Flink版总体介绍
实时计算Flink版(Alibaba Cloud Realtime Compute for Apache Flink,Powered by Ververica)是阿里云基于 Apache Flink 构建的企业级、高性能实时大数据处理系统,由 Apache Flink 创始团队官方出品,拥有全球统一商业化品牌,完全兼容开源 Flink API,提供丰富的企业级增值功能。
实时数仓入门训练营:实时计算Flink版总体介绍
|
云安全 数据采集 运维
招聘网站的流量隐忧:恶意BOT与流量黑盒
对人力资源服务行业来说,流量犹如一把双刃剑。涌动的流量如同黑盒,在繁荣的背后,各种恶意机器流量、黑产SEO、数据黑手和僵尸程序暗潮涌动,想要看清它们绝非易事。
411 0
招聘网站的流量隐忧:恶意BOT与流量黑盒