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除外),集中用一个小程序做进一步说明,代码及注释如下:

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值