C语言从头学46——文件操作(一)

一、文件指针

文件指针是文件操作的基础。这个指针是什么类型的呢?C语言在<stdio.h>中定义了一个结构体,名为FILE,这个结构体可以记录操作文件所需的各种信息,所有文件操作都围绕着这个结构体进行。用这个结构体定义的指针对象,我们称其为文件指针。

声明文件指针的格式:FILE* fp; //fp为文件对象,当然可以起其它名字

有了文件指针,就可以进行文件操作了。

二、打开文件函数fopen()

上一步骤声明的文件指针并没有指向具体的文件,要想通过它操作文件,就需要将它指向某一具体文件。完成这一任务的函数是fopen()。

使用格式:fp=fopen(参1,参2); //注意:参1、参2都是字符串形式的

参1:文件名(字符串形式要有双引号,包含路径时斜杠前还要加一个斜杠称为"转义符";如无路径则指当前目录)

参2:文件打开方式(也是字符串形式,要有双引号)

返回值:成功返回一个可用的文件指针,失败返回NULL。

关于文件打开方式,包括以下几种模式:

r:只读模式,仅用来读取数据。成功打开文件时,指针指向文件开头;如果文件不存在,返回 NULL。

w:只写模式,仅用来写入数据。成功打开文件时,指针指向文件开头,所以一旦开始写入,写进多少原文件原有内容会被覆盖多少。如果文件不存在,则创建一个新文件。

a:追加模式,成功打开时,指针指向文件尾部,故可用来在文件尾部追加数据。如果文件不存在,则创建一个新文件。

r+:读写模式,既可以读又可以写。如果文件打开成功,指针指向文件开始处,可以读取文件内容;也可在文件头部添加数据,但会覆盖原有内容。如果文件不存在,返回NULL。

w+ :写读模式,如果文件存在,打开后指针指向文件开头,边写指针边向后移动,文件内容会被全部覆盖;如果文件不存在,则新建一个文件。

a+:追加写读模式,如果文件存在,指针指向文件结尾,可以且只能在现有文件末尾添加内容。如果文件不存在,则创建一个新文件。移动指针位置,可以读取原有内容。

以上几种文件打开方式,对于初学者而言,常用的是前三种(r、w、a),为防止出错,尽量把读、写分开处理。

说明:fopen函数会为打开的文件创建一个缓冲区。读模式下,创建读缓存区,写模式下,创建写缓存区;读写模式下,会同时创建两个。C语言通过缓存区,以流的形式,向文件读写数据。数据在文件里面,都是以二进制形式存储。但是,读写时,有不同方法:以原本的二进制形式进行,叫"二进制流";将二进制数据转成文本,以文本形式读写,叫做"文本流"。fopen的文件打开模式,默认是以文本流读写。如果添加b(如rb,wb),就会以"二进制流"进行读写。使用二进制方式写的文件我们用文本编辑器打开时,有些内容看起来像乱码。

三、关闭文件函数fclose

文件打开,使用完毕后,一定要记得关闭,以节省内存资源。关闭文件的函数是fclose(),原型也是定义在stdio.h中。

使用格式:fclose(参数); //参数是fopen函数返回的文件指针。

返回值:关闭成功返回0;发生错误失败返回-1。

四、和文件指针位置相关的宏EOF及标准流

C语言在头文件stdio.h定义了一个宏EOF,含义是文件结尾,它的值是 -1。当读取文件过程中遇到这个宏,就说明读取内容到了文件尾了,可以结束了。这个宏一般用于循环读取文件内容时的退出条件。

文件操作过程中,如把写文件名的地方写下面的设备名,则相当于是操作键盘、显示器,读是从键盘读,写是写向显示器。它们也被称为标准流:

stdin--- 标准输入文件指针,默认键盘

stdout---标准输出文件指针,默认显示器

stderr---标准错误文件指针,默认显示器

五、重打开文件函数freopen()

每打开一个文件就需要一个打开文件指针,用完还得想着关闭;如果觉得太麻烦,想重复使用文件指针操作另外一个文件可以吗?函数freopen()可以执行这个工作;这个函数的定义也是在stdio.h中。

使用格式:freopen(参1, 参2, 参3);

参1:文件名字符串(含路径,写路径时注意斜杠前再加一斜杠,另加的斜杠称为转义符)

参2:文件打开方式字符串(虽然只写一个字母,不要忘记引号)(参1、参2与fopen函数完全相同)

参3:打开文件指针(准备复用的文件指针)

返回值:复用成功,返回打开文件指针(参3);失败返回NULL;由于参3 已知,故接收这个函数的返回值的作用只是判断是否成功。

说明:

a.使用freopen()函数系统会报警不够安全影响编译,故需使用宏#define _CRT_SECURE_NO_WARNINGS屏蔽报警。

b.函数freopen()将文件指针与新文件关联后,原来打开的文件被自动关闭。

六、下面将本文涉及的内容(宏EOF除外),集中用一个小程序做进一步说明,代码及注释如下:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
//用FILE结构体声明文件指针并用fopen函数打开文件
    FILE* fp; 
    fp = fopen("temp.txt", "w"); 
    if (fp != NULL)
    {
        printf("temp.txt文件已按W模式打开或创建...\n");
    }
    else
    {
        printf("文件打开失败,程序即将结束...\n");
        getchar();
        return 0;
    }
//重复使用标准文件指针stdout(将指向屏幕的指针关联到文件)
    FILE* p=freopen("temp.txt","w",stdout);
    if (p == NULL)
    {
        printf("标准文件指针重新指向失败...\n");
        return 0;
    }
    printf("复用标准文件指针stdout指向文件temp.txt\n");
    //运行结果:上面输出内容没有显示到屏幕,而是被写入temp.txt文件中。(打开文件可看到)
    fflush(fp);//将输出缓冲区清空(后边的学习中会遇到此函数)
    p=freopen("CON", "w", stdout); //重新将标准文件指针stdout指向屏幕
    if (p == NULL)
    {
        printf("恢复标准文件指针指向屏幕失败...\n");
        return 0;
    }
    //说明:freopen函数把本应指向屏幕的标准文件指针stdout关联到文件temp.txt,
    //而printf默认是指向屏幕的,如此关联后,应当显示到屏幕的内容就被写入了temp.txt文件中。
    //如果没有重新将stdout与屏幕关联,那程序所有显示到屏幕的内容都会写入temp.txt中。
    printf("标准文件指针stdout重新指向屏幕\n");
 //关闭文件
    int ret=fclose(fp);
    if (ret == -1)printf("文件关闭失败,请妥善处理...\n");
    fclose(p);
    getchar();
    return 0;
}
相关推荐
PAK向日葵1 小时前
【C/C++】面试官:手写一个memmove,要求性能尽可能高
c语言·c++·面试
siy23333 小时前
[c语言日记] 数组的一种死法和两种用法
c语言·开发语言·笔记·学习·链表
rit84324995 小时前
基于灰狼算法(GWO)优化支持向量回归机(SVR)参数C和γ的实现
c语言·算法·回归
饭碗的彼岸one6 小时前
C++设计模式之单例模式
c语言·开发语言·c++·单例模式·设计模式·饿汉模式·懒汉模式
hope_wisdom6 小时前
C/C++数据结构之栈基础
c语言·数据结构·c++··stack
劲镝丶8 小时前
malloc概述
c语言·开发语言·c++
努力努力再努力wz9 小时前
【C++进阶系列】:万字详解红黑树(附模拟实现的源码)
java·linux·运维·c语言·开发语言·c++
路弥行至9 小时前
从0°到180°,STM32玩转MG996R舵机
c语言·数据库·stm32·单片机·嵌入式硬件·mcu·mongodb
王璐WL9 小时前
【C语言入门级教学】内存函数
c语言·开发语言·算法
Want59511 小时前
C/C++圣诞树②
c语言·c++·算法