C语言基础-访问文件

C语言标准库stdio.h中也提供了文件访问相关的函数和宏定义,方便程序中对文件进行读写。

FILE结构类型

stdio.h中定义的描述文件的结构类型,包含文件读写状态,缓冲区中字符位置,当前是否到文件末尾等信息。

打开文件

stdio.h中提供了和操作系统连接操作文件的函数fopen.

  • 接收文件名和操作文件的模式
  • 返回包含文件信息结构的指针
FILE * fopen(char *filename, char *mode);
  • mode
    • “r” 读文件模式,如果文件不存在或者文件没有读权限,则返回NULL
    • “w” 写文件模式,如果文件不存在,则创建新文件;如果文件存在则覆盖原文件内容
    • “a” 追加写文件模式,如果文件不存在,则创建新文件;如果文件存在则在文件中追加新内容
    • “*b” 如果访问的是二进制文件,可以在上述三种模式中加b
对文件进行简单读写
  1. stdio.h中提供了getc和putc对文件进行读写
int getc(FILE *fp);
int putc(int c, FILE *fp);
  • getc返回fp指向的输入流中的下一个字符,如果到达文件结尾返回EOF
  • putc将字符c输出到fp指向的输出文件中,如果写入错误,返回EOF
  1. 对文件格式化读写,可以使用fscanf和fprintf
int fscanf(FILE *fp, char *format,...);
int fprintf(FILE *fp, char *format,...);
  1. 按行进行读写
char *fgets(char *line, int maxline, FILE *fp);
int fputs(char *line, FILE *fp);
  • fgets读取fp指向的文本信息中的一行,包含换行符,放到line数组中,maxline指定一次读取的最大字符数,读取错误时返回NULL
  • fputs将一个字符串写到fp指向的文本中,不需要包含换行符,发生错误返回EOF
关闭文件释放文件指针

使用fclose关闭文件,当文件不需要再使用时,释放文件指针

int fclose(FILE *);
代码示例

实现文件复制,将文件1的内容复制到文件2中

#include <stdio.h>

int copyTwo(char *text1, char *text2);

int main(int argc, char const *argv[])
{
	if(copyTwo("text1.txt", "text2.txt") == 1){
		printf("copy success!\n");
	}else {
		printf("copy failed!\n");
	}
	
	return 0;
}

int copyTwo(char *text1, char *text2){
	FILE *fp1 = fopen(text1, "r"); //读文件1
	FILE *fp2 = fopen(text2, "w"); //写模式打开文件2
	int c;
	
	while((c = getc(fp1)) != EOF){ //读文件1
		if(putc(c, fp2) == EOF){//写文件2
			fclose(fp1); //遇到写异常返回,并关闭文件释放文件指针
			fclose(fp2);
			return 0;
		}
	}
	fclose(fp1); //读写结束,释放文件指针
	fclose(fp2);
	return 1;
}

运行结果:

copy success!

text1.txt是提前准备好的文件:

cat text1.txt //查看文件内容
abcdedffff
数字墨翰

text2.txt是复制的文件:

cat text2.txt 
abcdedffff
数字墨翰
标准输入输出和错误

启动c语言程序后,操作系统会打开三个文件并返回指向这三个文件的指针供系统使用。

  • stdin 标准输入FILE指针,一般指向键盘
  • stdout 标准输出FILE指针,一般指向显示器
  • stderr 标准错误FILE指针,一般指向显示器
    如果文件读写失败,可以将错误信息打印到标准输出,标准错误中显示。
    代码示例
#include <stdio.h>

int main(int argc, char const *argv[])
{
	FILE *fp = fopen("text3.txt", "r");//读一个不存在的文件
	if(fp == NULL){
		fprintf(stderr, "打开文件失败!\n");
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值