12.1 IO(1)

试用一下Markdown编辑器,以及之后的代码都使用微软的Visual Studio编写。
这篇简单说一下C语言中的IO。
内容在书13.1,13.2,13.3章

1.什么是文件

文件就是存储在磁盘上已经命名的存储区域,比如我们每次编写的“.c”文件,引入的“stdio.h”头文件,或者我们电脑中的视频音乐,这些都是一个个的文件.在我们看来,文件就是这样了。

但是在操作系统层面,文件不仅仅是这么简单,有些软件可以查看电脑中的文件存储的位置,比如“UDefrag磁盘整理工具”。可以发现有些文件并不是连续存储的,尤其是那些很大的文件。C语言将文件看做“一系列连续的字节”(413页)。

2 标准IO

IO分为两个级别:底层IO标准高级IO底层IO是操作系统提供的基本IO服务,标准高级IO使用C语言提供的标准包和“stdio.h”头文件定义。这里重点说一下 标准高级IO

标准IO提供了 可移植性 ;提供了很多函数用来 简化不同的问题,比如printf();还有输入和输出都是带有缓冲的,也就是每次都是处理一块信息而不是一个字节信息,这样极大地提高了效率,试想一下是一次吃一粒米方便还是一口饭方便。下面重点说一下缓冲

2.1.1 统计文件字符数

文件内容是26个字母循环6次。

#include 

//统计文件有多少个字节的程序
int main(void) 
{
     
	char path[] = "J:\\IO_Read\\test.txt"; //文件路径
	int c; //存储每个文字
	FILE* fp;//文件指针,
	errno_t e; //fopen_s函数返回值;
	e = fopen_s(&fp, path, "r"); //r代表读模式,VS中使用fopen()会提示不安全。
	unsigned long count = 0;

	while ((c = getc(fp) != EOF)) 
	{
      //EOF代表文件结束。
		count++;
	}
	printf("文件%s的字节数为:[%d]。", path, count);
	return 0;
}

运行结果

文件J:\IO_Read\test.txt的字节数为:[156]。

2.2.2 fopen()与fopen_s()

2.2.2.1 格式说明

上面的程序中使用了r作为格式,下面的表格列出了C语言常见的模式。

模式字符串 含义
r 读模式。
w 写模式,现有文件长度截取为0,即覆盖原文件;如果文件不存在就创建新文件。
a 写模式, 现有文件后追加内容;如果文件不存在就创建新文件。
r+ 更新模式,即可以读写。
w+ 更新模式,如果文件存在就将原文件长度截取为0;不存在就创建新文件。
a+ 更新模式,如果文件存在就在文件后追加内容;不存在就创建新文件。
前面的模式后加b 模式相同,但是是以二进制模式打开。
wx, wbx, w+x, wb+x, w+bx (C11)类似非x模式,但是如果文件已经存在或以独占模式打开文件,则打开文件失败。

与UNIX和Linux一样只有一种文件类型的系统,是否有b没有影响。

关于x模式,对于原来就存在文件并使用w模式的情况,操作是直接覆盖,就会丢失原文件的内容;而加上x之后,即使操作失败,原文件内容也不会丢失。如果使用任意一种w而不带x的模式打开文件,原文件的内容会被直接删除,而加上x之后,将无法打开现有文件

2.2.2.2 参数与返回值

函数 参数 返回值
fopen() 文件路径(字符串),模式(字符串) FILE*
fopen_s() FILE*,文件路径(字符串),模式(字符串) errno_t

2.2.3 getc()与putc()

getc()和putc()是针对文件的两个函数,与getchar()和putchar()类似。
getc():从FILE中指定的文件中获取一个字符。
putc():将char写入FILE
指定的文件中。

函数 参数 返回值
getc() FILE* char
putc() char变量, FILE* int
#include 
int main(void)
{
     
	char path[] = "J:\\IO_Read\\test.txt";
	int c; 
	FILE* fp;
	errno_t e; 
	e = fopen_s(&fp, path, "r"); 

	while ((c = getc(fp) != EOF)) //从fp指向的文件中读取字符
	{
     
		putc(c, stdout); //指定输出为标准输出stdout
	}
	return 0;
}

2.2.3 EOF

C语言使用EOF作为文件结束的标志,定义在stdio.h中。

int main(void)
{
     
	printf("EOF=%d\n", EOF);
	return 0;
}

运行结果

EOF=-1

由于任意字符的值都是大于-1的,所以-1可以作为结束的标志。

2.2.4 fclose()

参数为一个FILE*,作用是关闭这个文件。成功关闭返回0,否则返回EOF。

2.2.5 指向文件的指针

标准文件 文件指针 通常使用的设备
标准输入 stdin 键盘
标准输出 stdout 显示器
标准错误 stderr 显示器

这些文件指针都是指向FILE的指针,stdio.h把3个文件指针与3个标准文件关联,C语言会自动打开这3个标准文件。

3 文件拷贝简单实现

#include 
#include 

#define LENGTH 128

int main(void)
{
     
	char in[] =  "J:\\IO_Read\\test.txt"; //文件路径
	char out[] = "J:\\IO_Write\\test.txt";
	copy(in, out);
	return 0;
}

int copy(char* from, char* to) 
{
     
	char c;
	FILE *in, *out;
	char file_name[LENGTH];
	int count = 0;

	strncpy_s(file_name, LENGTH - 8, from, LENGTH - 8); //将文件名拷贝,也需要使用带_s的函数
	file_name[LENGTH - 8] = '\0'; //字符串结束标志

	errno_t ei = fopen_s(&in,  from, "r");
	errno_t eo = fopen_s(&out, to,   "w");
	while ((c = getc(in)) != EOF)
	{
     
		putc(c, out);
		count++;
	}
	return 0;
}

运行之后就可以在输出路径看到之前的文件。

你可能感兴趣的:(C语言学习)