C语言 File 简单使用

这篇博客详细介绍了如何使用C语言进行文件的读取和写入操作,特别是二进制文件的读写。通过示例代码展示了如何打开、读取、写入和计算文件大小,以及使用fread和fputs函数的区别。内容涵盖了错误处理和文件指针的使用,对于理解底层文件操作非常有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读取配置文件:

FILE* config;
char buffer[255];
config = fopen(argv[1],"rb+"); //读二进制文件和可写,如没有权限写或者读为NULL
if(config == NULL)
		printf("oncething open config error");
fread(buffer,1,255,config);
//1位数量
fclose(config);

fread 和 gets:

fread:全读

gets:读取字符串,遇到回车键会退出,不好用。

输出文件:

FILE* out_custom = fopen("./custom.bin", "wb+"); //写入二进制和可读
if(out_custom == NULL)
		printf("oncething write config error");
fwrite(encrypt_buffer,1,final_length,out_custom);
// encrypt_buffer:文本buffer,1个数量, 每个数量的大小,file*
fclose(out_custom);

文件大小:

int length
fseek(config,0,SEEK_END);//先把下标移到最后
length = ftell(config);//统计开头到下标的偏移量  字节为单位

fseek(config,0,SEEK_SET);//移到开头复原

### C语言中的FILE结构体及相关文件操作 #### FILE结构体的概念 在C语言中,`FILE` 是一个由 `stdio.h` 定义的结构体类型[^2]。它主要用于表示文件及其相关属性,例如文件的状态、缓冲区信息等。尽管不同编译器可能对 `FILE` 的具体实现有所差异,但其核心功能保持一致。 以下是标准C中常见的 `FILE` 结构体定义的一部分: ```c typedef struct _iobuf { char* _ptr; // 当前读/写的下一个字符的位置 int _cnt; // 缓冲区剩余可用字节数 char* _base; // 缓冲区起始地址 int _flag; // 文件模式标志(如只读、写入等) int _file; // 文件描述符或句柄 } FILE; ``` 通过上述字段可以看出,`FILE` 主要封装了文件的操作细节,使得开发者可以通过高级接口来管理文件资源[^4]。 --- #### 常见的文件操作函数 C语言提供了丰富的文件操作函数,这些函数通常围绕 `FILE *` 类型展开: 1. **打开文件** 使用 `fopen()` 函数可以创建或打开一个文件。 ```c FILE *fopen(const char *filename, const char *mode); ``` 参数说明: - `filename`: 要打开的文件名称。 - `mode`: 打开方式,常见值有 `"r"` (只读)、`"w"` (写入,覆盖原有内容) 和 `"a"` (追加)[^1]。 2. **关闭文件** 使用 `fclose()` 关闭已打开的文件。 ```c int fclose(FILE *stream); ``` 3. **读取文件** 可以使用多种方法从文件中读取数据,比如 `fgets()` 或 `fscanf()`。 ```c char *fgets(char *str, int n, FILE *stream); // 逐行读取字符串 int fscanf(FILE *stream, const char *format, ...); // 按格式化方式读取 ``` 4. **写入文件** 向文件写入数据常用的是 `fprintf()` 或 `fwrite()`。 ```c int fprintf(FILE *stream, const char *format, ...); // 格式化写入 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); // 写入二进制数据 ``` 5. **定位文件指针** 使用 `fseek()` 设置文件内部指针的位置。 ```c int fseek(FILE *stream, long offset, int whence); ``` 6. **获取文件大小** 组合使用 `ftell()` 和 `fseek()` 来测量文件长度。 ```c long ftell(FILE *stream); ``` 7. **错误处理** 如果发生异常情况,可通过以下函数检测错误状态: ```c int ferror(FILE *stream); // 判断是否有I/O错误 void clearerr(FILE *stream); // 清除错误标记 ``` --- #### 示例代码:将结构体写入文件并读回 下面是一个完整的例子,展示如何利用 `FILE` 将结构体保存到磁盘上,并重新加载它们。 ```c #include <stdio.h> #include <stdlib.h> // 定义一个简单的员工结构体 struct Employee { int id; char name[50]; float salary; }; int main() { struct Employee emp = {1, "Alice", 5000}; // 创建文件并将结构体写入其中 FILE *fp = fopen("employees.dat", "wb"); if (!fp) { perror("无法打开文件"); return EXIT_FAILURE; } fwrite(&emp, sizeof(struct Employee), 1, fp); fclose(fp); // 从文件中读取结构体 fp = fopen("employees.dat", "rb"); if (!fp) { perror("无法打开文件"); return EXIT_FAILURE; } struct Employee read_emp; fread(&read_emp, sizeof(struct Employee), 1, fp); printf("ID: %d\nName: %s\nSalary: %.2f\n", read_emp.id, read_emp.name, read_emp.salary); fclose(fp); return 0; } ``` 此程序展示了如何使用 `fwrite` 和 `fread` 对象进行序列化和反序列化的操作[^5]。 --- #### 总结 通过对 `FILE` 结构体的学习,能够更好地掌握C语言下的文件管理和IO控制能力。无论是文本还是二进制形式的数据交换,都可以借助这一工具完成高效开发任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值