c语言文件读写

文本文件和二进制文件

文本文件

  • 基于字符编码,常见编码有ASCII、UNICODE等
  • 一般可以使用文本编辑器直接打开
  • 数5678的值以ASCII存储形式为:00110101 00110110 00110111 00111000

二进制文件

  • 基于值编码,自己根据具体应用,指定某个值是什么意思
  • 把内存中的数据按其在内存中的储存形式原样输出到磁盘上
  • 数5678的存储形式(二进制码)为:00010110 00101110

fopen()打开文件

#include 
FILE * fopen(const char *filename,const char *mode);

参数:

filename:需要打开的文件名,根据需要加上路径
mode:打开文件的模式设置 

返回值:

返回值:
成功:文件指针
失败:NULL(找不到文件、没有权限、程序打开文件超出上限)

例:

FILE *fp = fopen("F:\\baidu\\hello.txt","w");

filename取值:

绝对路径:

文件路径加文件全名(含后缀)

相对路径

..\..\文件全名(含后缀)

mode取值范围:

r\rb:只读,不创建文件,若文件不存在则报错
w\wb:写,如果文件存在则清空文件,文件不存在创建文件
r+\rb+:以可读可写方式打开文件,不创建新文件
w+\wb+:以可读可写方式打开文件,如果文件存在则清空文件,不存在,创建一个文件
a\ab:以追加方式打开文件,在末尾添加内容,若文件不存在则创建
a+\ab+:以添加文件方式打开文件,打开文件并在末尾更改文件,若文件不存在,则添加一个文件
注意:b是二进制模式的意思,b只在windows有效,在linux用r和rb的结果一样
unix和linux下所有的文本文件行都是\n结尾,而windows所有的文本文件行都是\r\n结尾

fclose()关闭文件

#include 
int fclose(FILE*stream)

功能:

关闭先前fopen()打开的文件,此动作让缓冲区的数据写入文件中,并释放系统所提供的文件资源

参数:

stream:文件指针

返回值:

成功:0

失败:-1

fputc()

#include 
int fputc(int ch,FILE*stream);

功能:

将ch转换为unsigeed char后写入stream指定的文件中

参数:

ch:需要写入文件的字符

stream:文件指针

返回值:

成功:成功写入文件的字符

失败:返回-1

例:

	int i = 0;
	char fileName[256];
	printf("请输入一个需要创建的文件名\n");
	scanf("%s", fileName);
	
	FILE* file = fopen(fileName, "w");
	if (file == NULL)
		return -1;
	char bus[1024];
	memset(bus, 0, 1024);
	scanf("%s", bus);
		/*
	gets(bus);
	同:
	fgets(bus,1024,stdin);
	同:
	scanf("%s", bus);
	*/
	while (bus[i]!='\0')
	{
		fputc(bus[i], file);
		++i;
	}
	
	fclose(file);
}

fgetc()

#include 
int fgetc(FILE*stream)

功能:

从stream指定的文件中读取一个字符

参数:

stream:文件指针

返回值:

成功:返回读取到的字符

失败:-1

例:

	char fileName[256];
	printf("请输入要查看的文件名\n");
	scanf("%s", fileName);
	FILE* file = fopen(fileName,"r");
	if (!file)
		return -1;
	char ch;
	while ((ch = fgetc(file)) != EOF)

	{
		printf("%c", ch);
	}

	fclose(file);

feof()

当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志,为解决这一个文件,ANSI C提供一个feof函数,用来判断文件是否结束。feof函数即可用以判断二进制文件又可用以判断文本文件。

#include 
int feof(FILE* stream)

功能:

检测是否读取到了文件结尾,判断的是最后一次“读操作的内容”,不是当前位置内容(上一个内容)

参数:

stream:文件指针

返回值:

非0值:已经到文件结尾

0:没有到文件结尾

按行(块)读写

fgets()

char* fgets(char* s,int size,FILE*stream)

功能:

从steam指定的文件内读入字符,保存到s所指定的内存空间,直到出现换行符、读到文件结尾或是已读了sizeof-1个字符为止,最后会自动加上字符’\0‘作为字符串结束标志

参数:

s:字符串
size:指定最大读取字符串的长度(size-1)
stream:文件指针,如果读键盘输入的字符串,固定写为stdin

返回值:

成功:成功读取到字符串

读到文件尾或出错:NULL

例:

		char fileName[256];
	printf("请输入查看的文件名");
	scanf("%s", fileName);
	FILE* file = fopen(fileName, "r");
	char ch[5];
	if(!file)

		return -1;
	while (!feof(file))
	{
		memset(ch, 0, 5);
		fgets(ch, 5, file);
		printf("%s", ch);
		
	}

	fclose(file);

fputs()

int fputs(const char* str,FILE* stream)

功能:

将str所指定的字符串写入到stream指定的文件中,字符串结束符“\0"不写入文件

参数:

str:字符串

stream:文件指针,直接输出固定写为stdout

返回值:

该函数返回一个非负值,如果发生错误则返回 EOF

例:

	char fileName[256];
	printf("请输入一个需要创建的文件名");
	scanf("%s", fileName);
	FILE* file = fopen(fileName, "w");
	char ch[1024];
	if(!file)

		return -1;
	while (1)
	{
		memset(ch, 0, 1024);
		fgets(ch, 1024, stdin);
		if (strncmp("exit", ch, 4) == 0)
		{
			break;
		}
		

		fputs(ch, file);
	}
	
	

	fclose(file);

fprintf()

#includen
int fprintf(FILE*stream,const char*format,...);

功能:

根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符‘\0’为止

参数:

stream:已经打开的文件

formar:

字符串格式,用法和printf()一样

返回值:

成功:实际写入文件的字符个数

失败:返回一个负数

fscanf()

#includen
int fscanf(FILE*stream,const char*format,...);

功能:

从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与[fgets](https://baike.baidu.com/item/fgets)有区别,fgets遇到空格不结束。

参数:

stream:已经打开的文件

formar:

字符串格式,用法和scanf()一样

返回值:

成功:返回成功匹配和赋值的个数

失败:到达文件末尾或发生读错误,返回EOF

你可能感兴趣的:(c\c++,c++)