1.文件的概念
文件是当今计算机系统不可或缺的一部分。文件用于存续我们自己写的程序,创建的文档、照片、视频等一些信息。作为程序员必须要熟悉文件的创建、从文件读取数据等操作。例如对一个txt文件操作要经过几个步骤:创建、打开、读取显示内容、关闭txt文件。
2.文件通信和写文件的流程
c语言提供I/O函数可以进行文件通信,读取文件信息或者把信息写入文件中。
流程:应用程序空间->内核空间->驱动程序->硬盘上。从用户态到内核态的过程。
3.什么是文件
文件通常是在磁盘或者固态硬盘上的一段已命名的存储区。C语言把文件看作是一系列连续的字节,每个字节都能被单独读取。C语言提供两种文件模式:文件模式和文本模式。
4.什么是行缓冲/全缓冲/无缓冲
行缓冲:就是缓冲区碰到碰到换行符的时候才刷新缓冲区。
全缓冲:如果缓冲区写满了就写回内核。在磁盘上的文件通常是由标准I/O库实施全缓冲的。
无缓冲:在读写文件的时候通过系统调用I/O (read write),对文件进行读写数据,是无缓冲。
5.fopen/fclose
FILE *fopen( const char *restrict filename, const char *restrict mode );
参数
filename - 打开 filename 所指示的文件,并返回指向关联到该文件的文件流的指针。
mode - 用于确定文件访问模式。
int fclose( FILE *stream );
参数:
stream - 需要关闭的文件流
#include <stdio.h> //FILE是定义在stdio.h上的派生类型
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int ch;//用int 类型变量存储EOF
FILE *fp = fopen("test.txt","r");
if (!fp)
{
perror("file opening fileed");
return 0;
}
//如果fgetc函数在读取一个字符时发现是文件结尾,它将返回一个特殊值EOF
while ((ch = fgetc(fp)) != EOF)
{
putchar(ch);
}
fclose(fp);
return 0;
}
6.fputc/putc
int fputc( int ch, FILE *stream );
int putc( int ch, FILE *stream );
参数
ch - 要被写入的字符
stream - 输出流
#include <stdio.h> //FILE是定义在stdio.h上的派生类型
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int ch;
FILE *fp = fopen("test.txt","r");
if (!fp)
{
perror("File opening failed");
return 0;
}
while ((ch = fgetc(fp)) != EOF)
{
fputc(ch,stdout);
}
fclose(fp);
return 0;
}
7.fwirte/fread
size_t fread( void *restrict buffer, size_t size, size_t count,FILE *restrict stream );
参数:
buffer - 指向要读取的数组中首个对象的指针
size - 每个对象的字节大小
count - 要读取的对象数
stream - 读取来源的输入文件流
size_t fwrite( const void *restrict buffer, size_t size, size_t count,FILE *restrict stream );
参数:
buffer - 指向数组中要被写入的首个对象的指针
size - 每个对象的大小
count - 要被写入的对象数
stream - 指向输出流的指针
将一个文件拷贝到另一个文件里
#include<stdio.h>
#include<stdlib.h>
#define READ_BUFF 100
int main()
{
FILE *fp1, *fp2;
int c = 0;
char buf[READ_BUFF] = {0};
if ((fp1 = fopen("menu.tab.out.txt", "rb")) == NULL)
{
printf("get menu.tab.out.txt fp fail");
return -1;
}
if ((fp2 = fopen("myfile.txt", "wb")) == NULL)
{
printf("get myfile.txt fp fail\n");
return -1;
}
while((c = fread(buf, sizeof(char), READ_BUFF, fp1)) > 0)
{
fwrite(buf, sizeof(char), c, fp2);
}
if(fclose(fp1) != 0)
{
puts("close fp1 fail");
}
if(fclose(fp2) != 0)
{
puts("close fp2 fail");
}
return 0;
}
扫二维码关注微信公众号,获取技术干货