文件操作(一) 文件的顺序读写

目录

一、文件存在的意义

二、文件及其分类

三、文件的打开和关闭

 1.文件的打开函数

2.文件的关闭函数

四、文件的顺序读写

1.常用函数

2.对比一组函数:

1.fscanf/scanf/sscanf

2.fprintf/printf/sprintf


一、文件存在的意义

  代码运行结果出现在屏幕上后,结束运行,关闭程序,屏幕上的内容也随之消失,无法保存。文件的意义就在于可以保存数据,不会因程序停止运行而删除数据。

二、文件及其分类

  文件可以分为程序文件(即我们平常写的代码)和数据文件(目的是为了保存数据)。

三、文件的打开和关闭

 1.文件的打开函数

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

其中,filename是打开操作对象的文件名,mode是指文件的打开方式。

打开方式整理如下:

文件使用方式                                含义     如果指定文件不存在
“r”(只读)为了输入数据,打开一个已经存在的文本文件                  出错
“w”(只写)为了输出数据,打开一个文本文件          建立一个新的文件
“a”(追加)向文本文件尾添加数据          建立一个新的文件
“rb”(只读)为了输入数据,打开一个二进制文件                    出错
“wb”(只写)为了输出数据,打开一个二进制文件       建立一个新的文件
“ab”(追加)向一个二进制文件尾添加数据                出错
“r+”(读写)为了读和写,打开一个文本文件                出错
“w+”(读写)为了读和写,建议一个新的文件      建立一个新的文件
“a+”(读写)打开一个文件,在文件尾进行读写       建立一个新的文件
“rb+”(读写)为了读和写打开一个二进制文件                 出错
“wb+”(读写)为了读和写,新建一个新的二进制文件     建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写   

     建立一个新的文件 

2.文件的关闭函数

int fclose(FILE* stream);

举例:

/* fopen fclose example */
#include <stdio.h>
int main()
{
    FILE* pFile;
    //打开文件
    pFile = fopen("myfile.txt", "w");//只写,如果该文件已经存在,原来保存的内容会被清空; 
                                     //如果该文件不存在,建立新文件
    //文件操作
    if (pFile != NULL)
    {
        fputs("fopen example", pFile);//像文件中输储字符串"fopen example"
        //关闭文件
        fclose(pFile);
    }
    return 0;
}

四、文件的顺序读写

1.常用函数

                     功能                函数名                适用于
              字符输入函数               fgetc           所有的输入流
             字符输出函数               fputc           所有的输出流
           文本行输入函数               fgets           所有的输入流
           文本行输出函数               fputs           所有的输出流
           格式化输入函数               fscanf           所有的输入流
          格式化输出函数               fprintf           所有的输出流
          二进制输入函数               fread                  文件
          二进制输出函数               fwrite                  文件

1.fgetc()函数

函数原形:int fgetc ( FILE * stream );

函数功能:读取stream指向的输入流中的一个字符,返回这个字符的ASCII值。

2.fputc()函数

函数原形:int fputc ( int character, FILE * stream );

函数功能:输出一个字符到stream指向的文件中,返回这个字符的ASCII值。

3.fgets()函数

函数原形:char * fgets ( char * str, int num, FILE * stream );

函数功能:读取stream指向的输入流的前num-1个字符,第num个为固定的'\0',返回str。

4.fputs()函数

函数原形:int fputs ( const char * str, FILE * stream );

函数功能:将str指向的内容输出到stream指向的输出流中,成功返回非-1(EOF)的值。

5.fread()函数

函数原形:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

函数功能:将stream指向的输入流中读取大小为size的前count个元素放入ptr指向的内存。返回值是成功读取的元素个数,读取失败返回-1。

6.fwrite()函数

函数原形:size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

函数功能:将ptr指向的内存空间的大小为size的前count个元素放入stream指向的输出流中。输出成功返回输出的元素个数,输出失败返回-1。

2.对比一组函数:

1.fscanf/scanf/sscanf

相同点:

fscanf、scanf、sscanf都是是格式化输入函数。

不同点:

1.fscanf适用于读取所有的输入流中的数据。

函数原形:int fscanf(FILE* stream, const char* format, ...);

代码举例:

按照顺序写文本行
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("test.txt", "w");//以只写的方式打开一个已经存在的文件时,文件之前的内容会被清空
//
//	if (NULL == pf)
//	{
//		perror("fopen");
//		return 1;
//	}
//
//	//写文件-一行一行写
//	fputs("hello\n", pf);
//	fputs("bitejiuyeke\n", pf);
//	//文件test.txt中已有内容:
//	// hello
//	// bitejiuyeke
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//
//	return 0;
//}

//可读可写文件,测试fscanf函数
int main()
{
    //打开文件
	FILE* pf = fopen("test.txt", "r+");//读写
	char arr1[20] = "";
	char arr2[20] = "";

	fscanf(pf, "%s", arr1);
	fscanf(pf, "%s", arr2);
	printf("%s\n", arr1);
	printf("%s\n", arr2);

    //关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

2.scanf适用于读取标准输入流中的数据。

函数原形:int scanf(const char* format, ...);

#include <stdio.h>

int main()
{
    int a = 0;
    scanf("%d",&a);
    printf("%d\n",a);
    return 0;
}

3.sscanf适用于在字符串中读取到格式化数据。

函数原形:int sscanf(const char* s, const char* format, ...);

其中,s即为格式化数据来源的字符串。

#include <stdio.h>
//sscanf()函数的应用
int main()
{
	char arr[50] = "18zhangsanman";
	int age = 0;
	char name[20] = "";
	char sex[8] = "";
    
    //读取字符串的内容,赋值给其他变量
	sscanf(arr, "%2d%8s%3s", &age, name, sex);
	printf("%d  %s  %s\n", age, name, sex);
	return 0;
}

2.fprintf/printf/sprintf

相同点:

fprintf、printf、sprintf都是格式化输出函数。

不同点:

1.  fprintf适用于所有输出流。将格式化数据输出到输出流上打印(屏幕/文件)。

函数原形:int fprintf(FILE* stream, const char* format, ...);

#include <stdio.h>
//fprintf()函数的应用
int main()
{
	FILE* pf = fopen("test.txt", "w");//读写
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	char arr[20] = "I love English!\n";

	fprintf(pf, "%s", arr);
	return 0;
}

2.printf适用于标准输出流。将格式化数据打印在屏幕上。 

 函数原形:int printf(const char* format, ...);

#include <stdio.h>

int main()
{
    int a = 5;
    printf("%d\n",a);
    return 0;
}

3.sprintf适用于将格式化数据的内容转化为字符串。

函数原形:int sprintf(char* str, const char* format, ...);

其中,str即为放入将格式化数据转化为字符串的内容的字符串。

#include <stdio.h>

//sprintf()函数的应用
int main()
{
	int year = 2022;
	int month = 10;
	int day = 8;
	char arr[20] = "";
	sprintf(arr, "%d%d%d", year, month, day);
	printf("%s\n", arr);
	return 0;
}

总结理解:输入输出针对的对象是程序文件(即我们写的代码),输入是指从数据文件(fscanf、scanf)或字符串(sscanf)中读取内容格式化后赋值给代码中创建的变量;输出是指将代码中的变量的值格式化后放入数据文件(fprintf、printf)或字符串(sprintf)中。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值