fopen函数的type字段


标准库中打开文件函数的原型:

#include <stdio.h>
FILE *fopen(const char *restrict pathname, const char *restrict type);
FIEL *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp);
FILE *fdopen(int filedes, const char *type);
//三个函数返回值:若成功返回文件指针,出错返回NULL

fopen函数打开pathname指定的文件,打开类型为type
type参数指定对该IO流的读写方式,但这里却是很容易搞混淆的地方。
首先说几种常用的情形:
1.文件是存在硬盘上的公共资源,一个用户创建的每个进程都可以打开该文件,都可以读写该文件,这容易造成文件访问的冲突
2.文件的操作就两种,读或者写,大多数场景只使用其中的一种,例如:cat命令是只读文件,管道就是一个读一个写,同时读写的情况比较少
3.文件是否存在是一个问题?当只读而打开一个文件时,若文件不存在,就更别谈读取了,这个肯定是个错误;当只写而打开一个文件,若文件不存在,就可以创建一个文件,然后再往文件内写,但读却不能够创建一个文件,再从文件内读,就算读也只是读到文件尾。例如 echo “hello” > hello.txt 这样的一个命令,文件不存在是常有的事,此时就会创建文件
4.文件写的时候也会出问题?若文件存在,只写而打开,必定会覆盖写如的位置的文件内容,同时还会有多个进程同时写的冲突。
5.文件还分为二进制文件和文本文件
由上述原因,就衍生出了文件的操作方法:

type
rrb为读而打开;此打开的权限只能读,单个读和单个写的文件应用的比较多,但若文件不存在就会打开失败
wwb为写而打开;此打开的权限只能写,若文件不存在则创建,新创建的文件长度本就是0,若文件存在就将其截短为0,是在文件头写
aab为追加而打开;只能在文件尾写,同写权限一样,文件不存在则创建,存在却不截短为0,定位到文件尾写
r+r+b+是为读写而打开,默认的附加操作为r的操作,文件不存在则打开失败
w+w+b+是为读写而打开,默认的附加操作为w的操作,文件不存在则创建,存在则截短为0
a+a+b+是为读写而打开,默认的附加操作为a的操作,文件不存在则创建,存在则定位到文件尾

注:b表示是二进制文件
所以基本的操作方式是rwa,读写追加,但type类型是字符串指,只能取这里列出来的几种,却没有这样的调用fopen("test","rw"),想为读写而打开,但却不能用rw作为类型值,C编译器是不判断字符串的值,这里不会报错,但rw却是得不到我们想要的为读写而打开的文件,读写打开只能用+,然后附加基本的文件判断操作。
type = "r" | "w" | "a" | "rb" | "wb" | "ab" | "r+" | "w+" | "a+" | "r+b" | "w+b" | "a+b" | "rb+" | "wb+" | "ab+"
type只能取这15个值,其他的值得不到期望的文件操作权限

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_LINE_LEN 1024 #define MAX_DATA_POINTS 1024 enum { SENSOR_TYPE_YULV = 0, SENSOR_TYPE_DIANDAO, SENSOR_TYPE_PH, SENSOR_TYPE_ORP, SENSOR_TYPE_ZHOUDU, NUM_SENSOR_TYPES }; typedef struct { int point_id; int sensor_type; float value; } data_point_t; data_point_t data_points[MAX_DATA_POINTS]; int num_data_points = 0; char *sensor_type_names[NUM_SENSOR_TYPES] = { "余氯", "电导率", "PH", "ORP", "浊度" }; void save_data_points() { FILE *fp = fopen("C:\\Users\\pc\\Desktop\\test.txt", "w"); if (fp == NULL) { printf("保存数据失败\n"); return; } fprintf(fp, "检测点 传感器 数值\n"); for (int i = 0; i < num_data_points; i++) { data_point_t *p = &data_points[i]; fprintf(fp, "%d (%d) %.2f\n", p->point_id, p->sensor_type, p->value); } fclose(fp); printf("数据已保存\n"); } void load_data_points() { FILE *fp = fopen("C:\\Users\\pc\\Desktop\\test.txt", "r"); if (fp == NULL) { printf("没有找到数据文件\n"); return; } char line[MAX_LINE_LEN]; while (fgets(line, MAX_LINE_LEN, fp) != NULL) { char *fields[3]; int num_fields = 0; char *tok = strtok(line, ","); while (tok != NULL) { fields[num_fields++] = tok; tok = strtok(NULL, ","); } if (num_fields != 3) { printf("数据文件格式错误\n"); fclose(fp); return; } int point_id = atoi(fields[0]); int sensor_type = atoi(fields[1]); float value = atof(fields[2]); data_point_t *p = &data_points[num_data_points++]; p->point_id = point_id; p->sensor_type = sensor_type; p->value = value; } fclose(fp); printf("数据已加载,共%d条\n", num_data_points); }
05-22

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值