试用一下Markdown编辑器,以及之后的代码都使用微软的Visual Studio编写。
这篇简单说一下C语言中的IO。
内容在书13.1,13.2,13.3章。
文件就是存储在磁盘上已经命名的存储区域,比如我们每次编写的“.c”文件,引入的“stdio.h”头文件,或者我们电脑中的视频音乐,这些都是一个个的文件.在我们看来,文件就是这样了。
但是在操作系统层面,文件不仅仅是这么简单,有些软件可以查看电脑中的文件存储的位置,比如“UDefrag磁盘整理工具”。可以发现有些文件并不是连续存储的,尤其是那些很大的文件。C语言将文件看做“一系列连续的字节”(413页)。
IO分为两个级别:底层IO和标准高级IO,底层IO是操作系统提供的基本IO服务,标准高级IO使用C语言提供的标准包和“stdio.h”头文件定义。这里重点说一下 标准高级IO。
标准IO提供了 可移植性 ;提供了很多函数用来 简化不同的问题,比如printf();还有输入和输出都是带有缓冲的,也就是每次都是处理一块信息而不是一个字节信息,这样极大地提高了效率,试想一下是一次吃一粒米方便还是一口饭方便。下面重点说一下缓冲
文件内容是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]。
上面的程序中使用了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之后,将无法打开现有文件。
函数 | 参数 | 返回值 |
---|---|---|
fopen() | 文件路径(字符串),模式(字符串) | FILE* |
fopen_s() | FILE*,文件路径(字符串),模式(字符串) | errno_t |
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;
}
C语言使用EOF作为文件结束的标志,定义在stdio.h中。
int main(void)
{
printf("EOF=%d\n", EOF);
return 0;
}
运行结果
EOF=-1
由于任意字符的值都是大于-1的,所以-1可以作为结束的标志。
参数为一个FILE*,作用是关闭这个文件。成功关闭返回0,否则返回EOF。
标准文件 | 文件指针 | 通常使用的设备 |
---|---|---|
标准输入 | stdin | 键盘 |
标准输出 | stdout | 显示器 |
标准错误 | stderr | 显示器 |
这些文件指针都是指向FILE的指针,stdio.h把3个文件指针与3个标准文件关联,C语言会自动打开这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;
}
运行之后就可以在输出路径看到之前的文件。