上一篇:字符串和字符处理
❤️🔥前情提要❤️🔥
欢迎来到C语言基本语法教程
在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发,在之后的教程中将会不断学习并详细讲解C语言的基本语法
及其高级用法
。
上一节讲了C语言基础中的字符串和字符处理,接下来让我们来一起学习C语言中的文件操作
。
🍪本教程内容干货满满,跟上步伐吧~🍪
作者介绍:
🎓 作者:某不知名编程爱好者📜
🗒️系列文章&专栏推荐: 🔗《华为机试题解析》 、🔗《C语言程序设计》、🔗 《MySQL数据库》
🕸️为大家推荐一款很好用的C语言刷题网站🔗点击跳转
🔖导航小助手🔖
- 📑 文件操作
- 📑 1. 打开文件和关闭文件
- 📑 2. 读写文件
- 🌰 文件读写示例程序
- 📑 3. 文件指针位置
- 📑 4. 文件错误处理
- 📑 5. 文件属性操作
- 📑 6. 文件目录操作
- 🌰 文件操作实例
- 📑 7. 文件操作性能优化
- 📑 8. 文件操作常见问题解决方案
- ⚠️ 注意事项
- 🎀小结
📑 文件操作
文件
是计算机存储设备上存储数据
的一种方式。文件操作
是指C语言程序通过对文件进行读、写等操作
,来实现数据存储
和读取
的功能。文件操作主要包括文件的打开
、读写
、关闭
、文件指针位置
、错误处理
、文件属性操作
、文件目录操作
等。
📑 1. 打开文件和关闭文件
在进行文件操作之前,需要先打开文件
。可以使用fopen
函数打开文件
,使用fclose
函数关闭文件
。fopen函数的原型如下:
FILE *fopen(const char *filename, const char *mode);
具体用法如下:
FILE* fp; // 文件指针
fp = fopen("filename.txt", "mode"); // 打开 filename.txt 文件,mode 表示打开模式
if (fp == NULL) {
printf("文件打开失败!\n");
return -1;
}
// TODO: 操作文件
fclose(fp); // 关闭文件
其中,filename
参数表示要打开的文件名
,mode
参数表示打开文件的模式
。mode参数有以下几种:
r
:只读模式,如果文件不存在则打开失败。w
:只写模式,如果文件不存在则创建文件,如果文件已经存在,则清除原有内容。a
:附加模式,若文件不存在则创建文件,若文件已经存在,则在文件末尾追加新内容。rb
:二进制格式下的只读模式。wb
:二进制格式下的只写模式。ab
:二进制格式下的附加模式。
fopen
函数返回一个指向FILE结构体的指针
,可以通过该指针进行文件操作
。使用完文件后,需要通过fclose函数关闭文件
,fclose函数的原型如下:
int fclose(FILE *stream);
stream
参数表示要关闭的文件指针
。
📑 2. 读写文件
在打开文件之后,可以使用fread
和fwrite
函数进行文件读写
操作。fread函数的原型如下:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
ptr
参数表示要读入的数据存储位置
,size
参数表示要读入的数据单个数据块的大小
,count
参数表示要读入的数据块数量
,stream
参数表示要读取的文件指针
。fread
函数返回实际读取的数据块数量
。
fwrite函数的原型如下:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
ptr
参数表示要写入的数据存储位置
,size
参数表示要写入的数据单个数据块的大小
,count
参数表示要写入的数据块数量
,stream
参数表示要写入的文件指针
。fwrite
函数返回实际写入的数据块数量
。
具体用法如下:
FILE* fp; // 文件指针
char line[MAX_LINE_LENGTH]; // 缓冲区
// 打开文件
fp = fopen("filename.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return -1;
}
// 读取文件内容
while (fgets(line, MAX_LINE_LENGTH, fp)) {
printf("%s", line);
}
// 关闭文件
fclose(fp);
MAX_LINE_LENGTH
指定了缓冲区的最大长度。
文件写入使用fprintf()
或fputs()
函数进行。具体用法如下:
FILE* fp; // 文件指针
// 打开文件
fp = fopen("filename.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return -1;
}
// 写入文件内容
fprintf(fp, "Hello, World!\n");
fputs("This is a test file.\n", fp);
// 关闭文件
fclose(fp);
🌰 文件读写示例程序
下面是一个完整的示例程序,演示了如何打开
、读取
和写入文件
:
#include <stdio.h>
#define MAX_LINE_LENGTH 1024
int main() {
FILE* fp; // 文件指针
char line[MAX_LINE_LENGTH]; // 缓冲区
// 打开文件
fp = fopen("example.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return -1;
}
// 写入文件内容
fprintf(fp, "Hello, World!\n");
fputs("This is a test file.\n", fp);
// 关闭文件
fclose(fp);
// 打开文件
fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return -1;
}
// 读取文件内容
while (fgets(line, MAX_LINE_LENGTH, fp)) {
printf("%s", line);
}
// 关闭文件
fclose(fp);
return 0;
}
📑 3. 文件指针位置
在使用fread
和fwrite
函数进行文件读写操作时,需要注意文件指针的位置
。文件指针用于表示读写数据时的位置
,可以使用ftell
和fseek
函数进行文件指针位置操作
。ftell函数的原型如下:
long int ftell(FILE *stream);
stream
参数表示要获取位置的文件指针
,返回该文件指针的当前位置。
fseek函数的原型如下:
int fseek(FILE *stream, long int offset, int origin);
stream参数表示要进行指针操作的文件指针,offset参数表示要移动的字节数,origin参数表示移动方式,有以下几种:
SEEK_SET
:从文件头开始偏移SEEK_CUR
:从当前位置偏移SEEK_END
:从文件末尾开始偏移
📑 4. 文件错误处理
在进行文件操作时,可能会遇到一些错误
,如文件不存在
、文件只读
等。在C语言中可以使用ferror
和feof
函数进行错误处理。ferror函数的原型如下:
int ferror(FILE *stream);
stream参数表示要检测的文件指针,返回非零值
表示文件操作发生了错误
。
feof函数的原型如下:
int feof(FILE *stream);
stream参数表示要检测的文件指针,返回非零值
表示已经到达文件结尾
。
📑 5. 文件属性操作
使用fstat
函数获取文件的属性信息
。fstat函数的原型如下:
int fstat(int fd, struct stat *buf);
fd
参数表示要获取属性信息的文件指针,buf
参数表示存储文件属性信息的结构体指针。文件属性信息包括文件大小、创建时间、修改时间等。
📑 6. 文件目录操作
使用opendir
和readdir
函数进行文件目录操作
。opendir函数的原型如下:
DIR *opendir(const char *name);
name
参数表示要打开的目录路径,返回一个指向DIR结构体的指针。
readdir函数的原型如下:
struct dirent *readdir(DIR *dirp);
dirp
参数表示要读取的目录指针,返回一个指向dirent结构体的指针
,其中包括读取到的文件名等信息。
🌰 文件操作实例
以下是一个文件操作的实例代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char buffer[80];
/* 打开文件 */
fp = fopen("test.txt", "w");
/* 写入数据 */
fprintf(fp, "Hello, World!");
/* 关闭文件 */
fclose(fp);
/* 重新打开文件 */
fp = fopen("test.txt", "r");
/* 读取数据 */
fgets(buffer, 80, fp);
/* 输出数据 */
printf("%s\n", buffer);
/* 关闭文件 */
fclose(fp);
return 0;
}
该代码可以将字符串"Hello, World!"写入test.txt文件,并读取该文件中的内容输出。
📑 7. 文件操作性能优化
在进行文件操作时,需要注意文件读写速度的性能优化
。可以使用缓冲
机制来提高文件操作速度。使用setvbuf
函数进行文件缓存操作
。setvbuf函数的原型如下:
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
stream
参数表示要进行缓存操作的文件指针,buf
参数表示缓存区地址,可以使用NULL表示由系统自动分配缓存区,mode
参数表示缓存操作方式,有以下几种:
_IOFBF
:全缓冲,即数据存满缓存区才进行I/O操作_IOLBF
:行缓冲,即遇到换行符才进行I/O操作_IONBF
:不带缓冲,即数据立即进行I/O操作
size
参数表示缓存区大小,可以使用默认值BUFSIZ
。
📑 8. 文件操作常见问题解决方案
在进行文件操作时,可能会出现一些常见的问题
,如文件打开失败
、文件读写失败
等。可以使用perror
函数来处理这些问题。perror函数的原型如下:
void perror(const char *s);
s
参数表示在显示错误信息前显示的字符串,一般为程序名。
⚠️ 注意事项
-
在使用文件之前,必须
先打开文件
。 -
操作文件之前,需确保
文件的存在性
。 -
检查文件是否打开成功。
-
操作完成后,需关闭文件指针。
-
对于涉及到数据的操作,务必小心谨慎,
避免破坏文件的完整性
。 -
防止程序中出现
内存泄漏
和未处理
的异常情况。 -
建议在打开文件时使用
二进制模式
,以免在不同平台上出现文件格式的差异
。 -
建议使用
文件流操作
,可以提高文件读写效率
。 -
为了避免文件
打开失败
或者数据操作错误
,应该经常检查错误信息,及时解决错误。 -
对于文件的位置操作,应该掌握文件指针的相关知识。
-
操作文件时应该考虑到文件操作的
并发性
问题,避免多个线程
或进程同时
进行文件操作,引起数据的竞争和冲突
。 -
操作文件时应具备
完整的文件路径和文件名
,以防止误删或误操作。
上一篇:字符串和字符处理
🎀小结
C语言中的文件操作包括了打开文件
和关闭文件
、读写文件
、文件指针位置
、文件错误处理
、文件属性操作
、文件目录操作
等。在进行文件操作时需要注意性能优化
和常见问题
解决方案。
🔚以上就是C语言文件操作
的全部知识了~
🤗感谢大家的阅读~
📬后续还会继续更新💓,欢迎持续关注哟~📌
💫如果有错误❌,欢迎指正呀💫
✨如果觉得收获满满,可以点点赞👍支持一下哟~✨