C语言学习笔记—文件操作
其他
2019-05-14 23:29:20
阅读次数: 0
前言
- 文件是当今计算机系统不可或缺的部分。文件用于储存程序、文档、数据、书信、表格、图片、视频和许多其他种类的信息。作为程序员,必须会编写创建文件和从文件读写数据程序。
- 操作文件的正确流程为:打开文件 --> 读写文件 --> 关闭文件。文件在进行读写操作之前要先打开,使用完毕要关闭。
- 在C语言中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。
fopen和fclose函数
- 主要功能是打开文件。需要头文件:stdio.h
- 函数声明如下:
FILE *fopen(const char *filename, const char *mode); //使用给定的模式 mode 打开 filename 所指向的文件
- filename指要打开的文件名称(可包含相对路径和绝对路径),mode指文件的访问模式。模式如下表:
模式 |
描述 |
r |
打开一个用于读取的文件。该文件必须存在 |
r+ |
打开一个用于更新的文件,可读取也可写入。该文件必须存在 |
rb+ |
读写打开一个二进制文件,允许读写数据。文件必须存在 |
rw+ |
读写打开一个文本文件,允许读和写 |
w |
创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件 |
w+ |
创建一个用于读写的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件 |
a |
追加到一个文件。如果文件存在,写操作向文件末尾追加数据。如果文件不存在,则创建文件 |
a+ |
以附加方式打开可读写的文件。如果文件存在,写操作向文件末尾追加数据。如果文件不存在,则创建文件 |
- fopen打开文件成功,返回有效FILE的有效地址,失败返回NULL。
- 文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的用法如下:
int fclose(FILE *stream); //关闭流 stream,刷新所有的缓冲区
- 如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。
- 例子:
#include <stdio.h>
int main()
{
FILE *fp;
fp = fopen("file.txt", "r");
fprintf("打开一个只读文件file.txt");
fclose(fp);
return(0);
}
文本模式和二进制模式
- 所有文件的内容都以二进制形式(0或1)储存的。
- 文本文件:如果文件最初使用二进制编码的字符(如ASCII或Unicode)表示文本(就像C字符串那样),该文件就是文本文件,其中包含文本内容。
- 二进制文件:如果文件中的二进制代表机器语言代码或数值数据(使用相同的内部表示,假设,用于long或double类型的值)或图片或音乐编码,该文件就是二进制文件,其中包含二进制内容。
- 在二进制模式中,程序可以访问文件的每个字节。而在文本模式中,程序所见的内容和文件的实际内容不同。
- 在windows系统中,文本模式下,文件以" \r\n "代表换行。若以文本模式打开文件,并用fput等函数写入换行符" \n "时,函数会自动在" \n "前面加上" \r "。在windows读写一个二进制文件时,读写模式中参数一定要加" b ",防止系统添加无谓的" \r ",但读写一个文本文件时,就不要加" b ",这样可以不用单独处理" \r "。
- 在类Unix/Linux系统中,文本模式下,文件以" \n "代表换行,所以linux系统中在文本模式和二进制模式下并无区别。linux下读写模式中参数" b "是无效的,可忽略。
getc和putc函数
-
stat函数
- 主要获得文件属性。需要头文件:sys/types.h, sys/stat.h, unistd.h。
- 函数声明如下:
int stat(const char *file_name, struct stat *buf ); // 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
- 执行成功则返回0,失败返回-1,错误代码存于errno,包括:
ENOENT 参数file_name指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目
ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT 参数buf为无效指针,指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数file_name的路径名称太长数值
- stat结构体里面成员信息:
struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //文件的类型和存取的权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变时间(指属性)
- 例子:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main()
{
struct stat st = { 0 };
stat("a.txt", &st);
int size = st.st_size; // 得到文件的大小
printf("%d\n", size);
return 0;
}
- fstat,lstat函数原型:
int fstat(int filedes, struct stat *buf);
int lstat(const char *path, struct stat *buf);
- 这三个函数的功能是一致的,都用于获取文件相关信息,但应用于不同的文件对象。对于stat函数中给出pathname参数,stat函数返回与此命名文件有关的信息结构,fstat函数获取已在描述符fields上打开文件的有关信息,lstat函数类似于stat,但是当命名的文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是由该符号链接引用文件的信息。
fread和fwrite函数
转载自blog.csdn.net/qq_34935373/article/details/88884931