C语言| 文件操作详解(一)

目录

一、文件类型指针&文件的打开与关闭

1.1 如何定义文件类型指针变量

1.2 如何获取文件的地址&文件的打开

1.3 文件的关闭

二、流和标准流的介绍 

2.1 流

2.2 标准流

三、文件的顺序读写函数介绍 

3.1 各函数功能与适用范围

3.2 各函数的详细介绍 

3.2.1. fgetc

3.2.2. fputc

3.2.3. fgets

3.2.4. fputs 

3.2.5. fscanf 

3.2.6. fprintf

3.2.7. fread 

3.2.8. fwrite

写文章不易,希望您可以点一个免费的赞,祝您生活愉快! 


 

一、文件类型指针&文件的打开与关闭

文件类型指针变量用于储存文件的地址,以便于后续对文件内容进行访问、修改、删除。

1.1 如何定义文件类型指针变量

示例:

FILE* pf=NULL;

其中,pf是一个文件类型指针变量。FILE中译便是文件。

1.2 如何获取文件的地址&文件的打开

首先介绍本篇文章介绍的第一个函数:fopen,它的函数声明如下:

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

第一个参数接收的是文件名(必须带后缀)字符串的首地址,第二个参数接收的是打开文件的模式。

fopen的返回类型为文件类型指针,返回值是函数得到的文件名的文件地址。

示例:

FILE* pf=fopen("Student information.txt","w");

执行这一行代码的结果是以“写”的方式打开项目所在根目录的名为“Student information.txt”的文件。,并将该文件的地址赋给指针变量pf。

除了“写”,还有其他打开文件的方式,如下图:

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

建立一个新的文件

“rb+”(读写)为了读和写,打开一个二进制文件出错
“wb+”(读写)为了读和写,新建一个新的二进制文件建立一个新的文件
“ab+”(读写)打开一个二进制文件,在文件尾进行读和写建立一个新的文件

1.3 文件的关闭

如果做了打开文件这个指令,就必须关闭文件,这是一个程序员的素养。

介绍本文章的第二个函数:fclose,它的函数声明如下:

int fclose (FILE* stream);

函数参数接收的是打开的文件的文件类型指针。

函数返回类型为int,若文件成功关闭,则返回0;若文件关闭失败,则返回EOF(即-1);

示例:

#include <stdio.h>
int main()
{
    FILE* pf=fopen("Student information.txt","w");
    fclose(pf);
    return 0;
}

二、流和标准流的介绍 

2.1 流

在不同的场景下,程序的数据需要输出到各种外部设备,也需要从各种外部设备中获得数据(输入数据),不同的外部设备的输入输出操作各不相同,为了程序员能够在不同设备之间进行更方便的操作,“流”这一概念便诞生了。

可以将“流”形象成一条流淌着字符的河流。

C程序针对文件、画面、键盘等的数据的输入输出操作都是通过“流”进行的。 

一般情况下,我们向流里写入数据,或者从流中读取数据,都是需要打开流,然后再进行操作。

2.2 标准流

C语言程序启动时,会默认打开三个流:

1.stdin - 标准输入流,在大多数环境中从键盘输入,例如scanf函数便是从标准输入流中读取数据。

2.stdout - 标准输出流,在大多数环境中输出至显示器的界面,例如printf函数便是将信息输出至标准输出流中。

3.stderr - 标准错误流,在大多数环境中输出到显示器界面。

——————————————————————————————————————————

注意:1. stdinstdoutstderr 三个流的类型均为 FILE* 

           2. 三个流可依据std+input、std+output、std+error 进行记忆

——————————————————————————————————————————

 

三、文件的顺序读写函数介绍 

 

3.1 各函数功能与适用范围

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

注意:

———————————————————————————————————————— 

1.以上的所有输入流包括标准输入流和其他输入流(例如文件输入流) ;

   以上的所有输出流包括标准输出流和其他输出流(例如文件输出流);

 

2.为了便于函数功能的记忆,不至于将函数功能搞混,我们可以使用“拆分法”

例如:

fgetc=f+get+c 即从文件(f)中得到(get)字符(c),并将其存于程序中。

fputc=f+put+c 即在文件(f)中放置(put)字符(c),并将其打印在文件中。

 

3.“入”与“出”都是针对程序说的 

————————————————————————————————————————

3.2 各函数的详细介绍 

3.2.1. fgetc

函数声明:

int fgetc ( FILE * stream );

参数:

指向标识输入流的FILE对象的指针;

返回值:

成功则返回读到的值;如果位置指位器位于文件末尾,则返回EOF,并设置流的eof指示符(feof);如果发生读取错误,也会返回EOF,但会设置错误指示器(ferror);

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() 
{
	FILE* pf = fopen("114514.txt", "r");
	char a;
	while ((a=fgetc(pf)) != EOF)
		printf("%c ", a);
	fclose(pf);
	pf = NULL;
	return 0;
}

050fb9f75c6244a291bfdfffc634883f.png

3.2.2. fputc

函数声明:

int fputc ( int character , FILE * stream) ;

参数:

字符;指向标识输入流的FILE对象的指针;

返回值:

成功则返回所写字符;如果发生写入错误,则返回EOF 并设置错误指示器 (ferror);

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    FILE* pf= fopen("alphabet.txt", "w");
    char c;
    if (pf != NULL) {

        for (c = 'A'; c <= 'Z'; c++)
            fputc(c, pf);
        fclose(pf);
    }
    pf = NULL;
    return 0;
}

c002c2f90f8c410981d6598d52ea7940.png

3.2.3. fgets

函数声明:

char* fgets ( char* str, int num, FILE* stream );

参数:

指向字符串的指针,复制到str的最大字符数(包括\0);指向标识输入流的FILE对象的指针

返回值:

成功则返回str;如果尝试读取字符时遇到文件末尾,则设置 feof ;如果在读任何字符之前发生这种情况,则返回空指针NULL;如果发生读取错误,则设置ferror,并返回空指针NULL,此时str指向的内容可能已被更改;

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    FILE* pf = fopen("114514.txt", "r");
    char arr[8];
    fgets(arr, sizeof(arr) / sizeof(arr[0]), pf);
    printf(arr);//因为num接收的数为8,所以少了S
    fclose(pf);
    pf = NULL;
    return 0;
}

36b8c579b3294ac58b9011a6182af76c.png

3.2.4. fputs 

函数声明:

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

参数:

包含要写入流的内容的字符串;指向标识输入流的FILE对象的指针

返回值:

成功则返回一个非负值;失败则返回EOF并设置ferror;

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdio.h>
int main()
{
	FILE* pf;
	char sentence[256];
	printf("请输入要打印到txt文本的句子: ");
	fgets(sentence, 256, stdin);//stdin是标准输入流,即读取键盘输入的字符串
	pf = fopen("114514.txt", "a");
	fputs(sentence, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

8c72fb59843144538ff4795fd965c5a7.png

 

3.2.5. fscanf 

函数声明:

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

参数:

指向FILE对象的指针;该对象标识要从中读取的数据流,可包含嵌入的格式说明符(占位符);

返回值:

成功则返回占位符的个数;如果在读取时发生读取错误或到达文件末尾,则设置正确的指示器( feof或ferror);如果在读取之前发生错误,则返回EOF;

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdio.h>
int main()
{
	FILE* pf=fopen("114514.txt","r");
	char arr[256];
	int a;
	fscanf(pf,"%s %d",arr,&a);
	fclose(pf);
	pf = NULL;
	printf("%s\n%d\n", arr, a);
	return 0;
}

b157f257d9344cb181740015d6cdecce.png

3.2.6. fprintf

函数声明:

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

参数:

指向FILE对象的指针;要写入流的文本的C字符串,可选择包含嵌入的格式说明符(占位符);

返回值:

 成功则返回写入字符总数;如果发生写入错误,则设置错误指示符(ferror)并返回负数

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdio.h>
int main()
{
	FILE* pf=fopen("114514.txt","w");
	char arr[256];
	int a;
	printf("请输入您的名字与年龄:");
	fscanf(stdin, "%s %d", arr, &a);
	fprintf(pf, "您的名字与年龄分别是:\n");
	fprintf(pf,"%-15s%-4d",arr,a);
	fclose(pf);
	pf = NULL;
	return 0;
}

5b926990e8d648ab8f428cf47568d043.png

3.2.7. fread 

函数声明:

size_t  fread ( void* ptr, size_t size, size_t count, FILE* stream ) ;

参数:

指向大小至少为size*count字节的内存块的指针,并将其类型转化为void*;要读取的每个元素的大小;要读取的次数;指向指定输入流的FILE对象的指针;

返回值:

成功则返回读取元素总数;如果返回值与count参数不符,则表明读取时发生错误或到达文件末尾,可使用ferror和feof进行检查;

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdio.h>
int main()
{
	FILE* pf=fopen("114514.txt","r");
	char arr[9];
	char* str = arr;
	fread(str, sizeof(arr[0]),sizeof(arr)/sizeof(arr[0]), pf);
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
		printf("%c ",arr[i]);
	fclose(pf);
	pf = NULL;
	return 0;
}

 

e96832b4df4e46d5bd6d408b7099a6c7.png

 

 

3.2.8. fwrite

函数声明: 

size_t  fwrite ( const void* ptr, size_t size, size_t count, FILE* stream );

参数:

指向要写入的元素数组的指针,并将其类型转换为const void*;要写入的每个元素的大小;写入的个数;指向指定输出流的FILE对象的指针;

返回值:

成功则返回写入元素总数;如果返回值与count参数不符,则会写入错误并阻止函数完成,将流设置错误指示器ferror;

使用示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdio.h>
int main()
{
	FILE* pf=fopen("114514.txt","w");
	char arr[]="玩原神玩的";
	fwrite(arr, sizeof(arr),1, pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

6b2484824a244010bd8d600f9f5aa5eb.png

—————————————————————————————————————————— 

本文完! 

封面:

 

如发现错误,敬请在评论区指正。

——————————————————————————————————————————

写文章不易,希望您可以点一个免费的赞,祝您生活愉快! 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值