如何系统学习C 语言(下)之 文件篇

我们所编写的程序源代码以及编译生成的可执行文件都属于文件。所以文件的实质就是存储在外部存储介质上的一段连续的二进制数据。

c 语言程序对文件的处理采用文件流的形式,程序运行在内存中,而文件是存储在外部存储介质上,例如硬盘、U盘等。

一,文件的打开与关闭

在程序运行时,就会在指定的文件之上建立一条管道,当读取文件时,数据就会像流水一样从文件端流向程序端,而写入文件时,数据就会像流水一样从程序端流向文件端。从文件端向程序端的文件流称为输入流,从程序端向文件端的文件流称为输出流。如下图:

只要打开一个文件就会得到一个文件流。有了文件流之后,就可以对文件进行相应的读写操作。

在c语言的标准库中,有一系列和文件相关的库函数,要想使用这些库函数只需要在程序中包含“stdio.h”这个头文件就可以了。

1,文件的打开

打开文件使用的函数为 fopen 函数,该函数原型为:

FILE *fopen(const char *fname,const char *mode);

fopen函数的返回值是一个文件流,其实就是一个FILE结构体类型的指针。这个结构体变量中包含了文件的名称、大小、属性等相关信息;若执行失败,则返回空指针。

下面举一个用fopen函数来打开文件的例子:

FILE *pfile=fopen("D:\\test.txt","r");//以“r”只读模式打开D盘下的test.txt文件
if(pfile!=NULL)
	printf("File opened successfully.\n");
else
	printf("Failed to open file.\n");

同时也需注意,“D:\test.txt" 使用的是绝对路径,由于斜杆

" \ "在c语言中作为转义字符来使用,因此必须使用" \ \ " ,才能表示一个斜杠字符本身。

2,文件的关闭

关闭文件使用"fclose"函数,函数原型如下:

int fclose(FILE *stream);

fclose 函数的功能就是将该函数所指定的文件流关闭。函数的返回值为int 类型,当函数执行成功,返回整型值1,当函数执行失败,返回一个EOF(文件终点),通常定义为-1.

二,文件的读写

打开文件、创建文件流的主要目的是对文件进行数据的读取或数据的写入。下面列举几个和文件读写相关的库函数及其应用实例。

1,以字符的方式读写文件

标准库提供的fgetc函数和fputc 函数,以字符的方式对文件进行读写操作。

案例:编写程序,将“I love you” 以字符的方式写入D盘的test.txt文件中。代码如下:

#include<stdio.h>
int main(){
    char str[]="I love you";
    FILE *pfile=fopen("D:\\test.txt","w");
    if(pfile){
        char *ptmp=str;//临时指针,指向数组str的首字符
        while(*ptmp){	//对ptmp解引用,检查指向的字符是否为空字符
            fputc(*ptmp,pfile);	//将ptmp指向的字符写入pfile关联的文件
            ++ptmp;	//移动指针,指向数组中下个字符
        }
        fclose(pfile);	//关闭文件
        puts("Write to complete.");
    }
    else
        puts("File opening failed.");
    return 0;
}

以字符的方式读取D盘test.txt文件中的内容,将其存储到字符数组中,并打印输出,程序如下:

#include<stdio.h>
int main(){
    char buf[128];	//字符数组
    FILE *pfile=fopen("D:\\test.txt","r");	//以只读模式打开
    if(pfile){
        char *p=buf;	//指向数组的首地址的指针p
        while((*p=fgetc(pfile))!=EOF)//从文件读取一个字符并存储到数组中
            ++p;	//移动指针
        *p='\0';	//将数组中的EOF字符修改为空字符
        fclose(pfile);
        printf("The read content is:%s\n",buf);
    }
    else
        puts("File opening failed.");
    return 0;
}

2,依行的方式读写文件

fgets函数和fputs函数,可以非常方便的对文本文件进行一行字符的读取或写入。

案例:编写程序,将“I love you” 以行的方式写入D盘的test.txt文件中。代码如下:

#include<stdio.h>
int main(){
    FILE *pfile=fopen("D:\\test.txt","w");
    if(pfile){
        if(fputs("I love you",pfile)!=EOF)
            printf("File writen successful.\n");
        else
            printf("Failed to write file.\n");
        fclose(pfile);
    }
    else
        printf("File opening failed.\n");
    return 0;
}

若将“I love you” 以行的方式读取D盘的test.txt文件。代码如下:

#include<stdio.h>
int main(){
    char buf[128];	//字符数组
    FILE *pfile=fopen("D:\\test.txt","r");	
    if(pfile){
        if(fgets(buf,128,pfile))
            printf("The read contend is:%s\n",buf);
        else 
            printf("Failed to read file.\n");
        fclose(pfile);
    }
    else
        printf("File opending failed.\n");
    return 0;
}

上面这两种方式的写入和读取方式已经给出了完整的代码,可以自行选择性的复制到本地自行验证并体会

一般情况下,文件的操作我们平时用的比较少,所以一些其他的高阶操作我们就得在实际应用中去学习—— 需要用到某个知识点,我们就立即去学习它就行了,完全没必要把所有的知识都学完了在去应用!

posted @ 2021-11-13 15:39  Charmchin  阅读(367)  评论(0编辑  收藏  举报