C语言基础学习记录-文件管理

1.C语言输入、输出函数

当我提到输入时,这意味着要向程序(或内存)中写入一些数据。输入的数据来源可以是从 键盘中、从文件 中 或从 网络中。

C语言提供了一系列 内置的函数 来读取给定的输入,并根据需要写入到程序中。

当我们提到输出时,这意味着要在屏幕上、打印机上或任意文件中 显示(或保存)一些数据。 同样,C语言提供了一系列 内置的函数来输出数据到指定的载体上。

1.标准文件 I/o

C语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。

|------|--------|----|
| 标准文件 | 文件指针 | 设备 |
| 标准输入 | stdin | 键盘 |
| 标准输出 | stdout | 屏幕 |
| 标准错误 | stderr | 屏幕 |

文件指针是访问文件的方式,我们会讲解如何从屏幕上读取值以及如何把结果输出到屏幕上。

2.scanf() 和printf() 函数

文件指针是访问文件的方式,我们会讲解 如何从屏幕读取值以及如何把结果输出到屏幕上。

C语言中的I/O(输入/输出)通常使用printf() 和scanf()两个函数。

int scanf(const char *format,...)函数从标准输入流stdin读取输入,并根据提供的格式来浏览输入。

int printf(const char *format,...)函数把输出写入到标准输出流stdout,并根据提供的格式产生输出。

其中,format可以是一个简单的常量字符串,但是您可以分别指定%s、%d 、%c 、%f等来输出或读取字符串、整数、字符或浮点数。如需了解完整的细节,可以查看这些函数的参考手册。

3.getchar() 和 putchar() 函数

int getchar(void)从屏幕上读取字符,只会读取一个字符,返回一个整数。您可以在循环内使用这个方法,以便从屏幕上读取多个字符

int putchar(int c) 并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符

4.gets() 和 puts() 函数

char *gets(char *s) 函数从 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 EOF。

int puts(const char *s) 函数把字符串 s 和一个尾随的换行符写入到 stdout。

2.C文件的读写

一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。c语言不仅提供了访问顶层的函数,也提供了底层调用来处理存储设备上的文件。

//将内存中数据写出到具体的文件中

//1.声明文件的具体路径

//2.创建/打开文件

//3.将内存中的数据写出到文 件中

//4.关闭文件

1.创建/打开文件

使用fopen()函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型FILE的一个对象,类型FILE包含了所有用来控制流的必要的信息。

函数原型: FILE *fopen( const char *filename, const char *mode );

说明:在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个

|----|-------------------------------------------------------------------------------|
| 模式 | 描述 |
| r | 打开一个已有的文本文件,允许读取文件。 |
| w | 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。 |
| a | 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。 |
| r+ | 打开一个文本文件,允许读写文件。 |
| w+ | 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。 |
| a+ | 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 |

|-----|----------------------------------------------------------------------------|
| 模式 | 描述 |
| rb | 只读(二进制)。打开一个二进制文件,只允许读取文件。 |
| wb | 只写(二进制)。打开一个二进制文件,只允许写入文件。如果文件不存在,则会创建一个新文件。如果文件存在,则该会被截断为零长度,重新写入。 |
| ab | 追加(二进制)。打开一个二进制文件,用于写入。如果文件不存在,则会创建一个新文件。如果文件已存在,则将写入的数据追加到文件末尾。 |
| r+b | 或"rb+":读写(二进制)。打开一个二进制文件,允许读取和写入。 |
| w+b | 或"wb+":读写(二进制)。打开一个二进制文件,允许读取和写入。如果文件不存在,则会创建一个新文件。如果文件存在,则该会被截断为零长度。 |
| a+b | 或"ab+":读写(二进制)。打开一个二进制文件,允许读取和写入。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 |

技巧:这些访问模式字符串可以根据需要进行组合使用。例如 "r+"表示读写, "r+b"表示读写(二进制)。

注意:如果处理的是二进制文件(图片、视频),则需使用下面的访问模式:

"rb" "wb""ab+""rb+""wb+""ab+""r+b""w+b""a+b"。

2.关闭文件

用 fclose( ) 函数。函数的原型为:int fclose( FILE *fp );

  • 如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF
  • 这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。
  • EOF 是一个定义在头文件 stdio.h 中的常量。

ps: EOF(‌End of File)‌在C语言中是一个预定义的常量,‌用于表示文件结束的标志

3.写入文件

(1)fputc 的函数:

函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。

int fputc( int c, FILE *fp );

(2)fputs函数:

函数 fputs() 把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。

int fputs( const char *s, FILE *fp );

(3)fprintf 函数

功能与fputs()类似,将一个字符串 写入到文件中。

int fprintf(FILE *fp,const char *format, ...)

4.读取文件

(1)fgetc函数

int fgetc( FILE * fp );

fgetc() 函数从 fp 所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回 EOF。

(2)fgets函数

char *fgets( char *buf, int n, FILE *fp );

此函数按行读取数据,它从文件中读取一行数据(包括换行符'\n'),并将读取的字符串复制到缓冲区 buf中。 参数 中buf是用于存储读取文本的缓冲区,n是缓冲区的大小,fp是文件指针。

如果成功读取,返回参数buf,即读取到的字符串的首地址。如果到达文件末尾或者读取失败,返回NULL.

注意:如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。

(3)fscanf 函数

int fscanf(FILE *fp, const char *format, ...)

参数说明

  • FILE *fp:指向要读取数据的文件的文件指针。
  • const char *format:一个格式字符串,指定了后续参数的类型以及数据在文件中的格式。格式字符串与 scanf 的格式字符串类似。
  • ...:表示可变数量的参数,这些参数用于存储从文件中读取的数据。这些参数的类型和数量必须与格式字符串中指定的类型和数量相匹配

返回值

  • 成功时,返回成功读取并赋值的输入项数。
  • 在读取输入项时遇到文件结束符(EOF)或发生读取错误时,返回 EOF。
相关推荐
阿阳微客1 小时前
Steam 搬砖项目深度拆解:从抵触到真香的转型之路
前端·笔记·学习·游戏
Chef_Chen6 小时前
从0开始学习R语言--Day18--分类变量关联性检验
学习
键盘敲没电6 小时前
【IOS】GCD学习
学习·ios·objective-c·xcode
海的诗篇_7 小时前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
AgilityBaby7 小时前
UE5 2D角色PaperZD插件动画状态机学习笔记
笔记·学习·ue5
AgilityBaby7 小时前
UE5 创建2D角色帧动画学习笔记
笔记·学习·ue5
武昌库里写JAVA8 小时前
iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
java·开发语言·spring boot·学习·课程设计
一弓虽9 小时前
git 学习
git·学习
Moonnnn.11 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
viperrrrrrrrrr712 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习