目录
一、文件类型指针&文件的打开与关闭
文件类型指针变量用于储存文件的地址,以便于后续对文件内容进行访问、修改、删除。
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. stdin、stdout、stderr 三个流的类型均为 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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
——————————————————————————————————————————
本文完!
封面:
如发现错误,敬请在评论区指正。
——————————————————————————————————————————
写文章不易,希望您可以点一个免费的赞,祝您生活愉快!