C语言 文件输入/输出(fopen、fread、fwirte、fclose)

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;
}

在这里插入图片描述

扫二维码关注微信公众号,获取技术干货

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值