所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件(头文件)等。
文件操作
通过程序,操作文件
读 文件->内存
写 内存->文件
在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。
定义说明文件指针的一般形式为:
FILE *指针变量标识符;
其中FILE应为大写,它实际上是由系统定义的一个结构,该结构中含有文件名、文件状态和文件当前位置等信息。在编写源程序时不必关心FILE结构的细节。例如:
FILE *fp;
表示fp是指向FILE结构的指针变量,通过fp即可找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件,实施对文件的操作。习惯上也笼统地把fp称为指向一个文件的指针。
//FILE * fopen(<#const char *restrict#>, <#const char *restrict#>)
//sodo whoami 用户权限变成root chmod -r file取消用户对file文件的读权限
FILE *fp=fopen("./file", "r");
if (!fp) {
perror("fopen error");
exit(-1);
}
// size_t fread(<#void *restrict#>, <#size_t#>, <#size_t#>, <#FILE *restrict#>)
char buf[64] ={};
// 任意变量类型的地址,只要是空间就行。 一次单位的信息是多少字节,所以单位的信息占一字节,这们的信息最多读63个,fp代表文件
//假如我们的file文件存的是hello World! 则打印出的ret有13个字节
size_t ret = fread(buf, 1, 63, fp);
printf("%s %ld\n",buf ,ret);
fclose(fp);
最后别忘记要对文件关闭,不然可能会出现一些不安全因素。
可能报错的有:
fopen error: No such file or directory
Program ended with exit code: 255 找不到该文件 或目录
FILE *fp2=fopen("./file", "w"); //如果文件不存在,会创建文件 ,如果已经存在,则清空
// 如果是“a”,则代表追加,原文件内容还在,只是在其后面添加内容
if (!fp2) {
perror("fopen error");
exit(-1);
}
// size_t 类型是什么呢。官方给出的解释是:typedef __SIZE_TYPE__ size_t; 我们把他看作字节数就可。
// size_t fwrite(<#const void *restrict#>, <#size_t#>, <#size_t#>, <#FILE *restrict#>)
fwrite("hello world!!", 1, strlen("hello world!!"), fp2);
fwrite("hello world!!", 1, strlen("hello world!!"), fp2);//如果写两个fwrite则有两个文件产生
fclose(fp2);
使用文件的方式共有12种,下面给出了它们的符号和意义。
文件使用方式 | 意义 |
---|---|
rt | 只读打开一个文本文件,只允许读数据 |
wt | 只写打开或建立一个文本文件,只允许写数据 |
at | 追加打开一个文本文件,并在文件末尾写数据 |
rb | 只读打开一个二进制文件,只允许读数据 |
wb | 只写打开或建立一个二进制文件,只允许写数据 |
ab | 追加打开一个二进制文件,并在文件末尾写数据 |
rt+ | 读写打开一个文本文件,允许读和写 |
wt+ | 读写打开或建立一个文本文件,允许读写 |
at+ | 读写打开一个文本文件,允许读,或在文件末追加数据 |
rb+ | 读写打开一个二进制文件,允许读和写 |
wb+ | 读写打开或建立一个二进制文件,允许读和写 |
ab+ | 读写打开一个二进制文件,允许读,或在文件末追加数据 |
简要说明:文件使用方式由r、w、a、t、b 和 + 六个字符拼成,各字符的含义是:
r(read):读
w(write):写
a(append):追加
t(text):文本文件,可省略不写
b(banary):二进制文件
+:读和写
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
void readwitre(){
FILE *fp =fopen("./file1", "r"); //r+为读的权限上加上写的权限
if (!fp) {
perror("fopen error file1");
exit(-1);
}
char buf[20];
FILE *fp2 =fopen("./file2", "w");//w+为在写的权限上加上读的权限
if (!fp2) {
perror("fopen error file2");
exit(-1);
}
while (1) {
size_t ret = fread(buf, 1, 20, fp);
if (ret<=0) {
break; //如果读完,则退出
}
fwrite(buf, 1, ret, fp2);//否则读到字节,则写入多少字节到flie 中 注意ret不能写成20
}
//如file1文件中有61个字节。则每次读20个字节,读三次,第四次读1个字节,然后程序结束,每次写入的内容会追加到文件内容后面。
fclose(fp2);
fclose(fp);
}
补充:
移动文件内部位置指针的函数主要有两个,即rewind()和fseek()。
rewind函数前面已多次使用过,其调用形式为:
rewind(文件指针);
它的功能是把文件内部的位置指针移到文件首。
下面主要介绍fseek函数。fseek函数用来移动文件内部位置指针,其调用形式为:
fseek(文件指针,位移量,起始点);
fseek(fp,100L,0);
其意义是把位置指针移到离文件首100个字节处。