服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言实现对文件进行操作的示例详解

C语言实现对文件进行操作的示例详解

2023-04-10 17:24悲伤的猪大肠9 C/C++

这篇文章主要为大家详细介绍了C语言实现对文件进行操作的相关知识,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,需要的可以参考一下

前言

文件操作

在运行程序的时候,此时数据是存放在内存中,当程序退出的时候,程序中的数据自然就不存在了,等下次运行程序的时候,数据又得重新录入,我们可以用文件的办法,把程序中的数据保存下来,只有我们自己选择删除数据的时候,数据才不复存在。 这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。

文件指针

向文件里输出或读取数据需要使用文件指针的形式,每个文件指针可以用来打开一个文件,这个文件指针指向文件的文件信息区。

FILE * 变量名

文件的打开和关闭

文件使用完之后要记得关闭,不让会占用资源,文件关闭掉之后要记得把指针置空以免出现野指针

?
1
2
3
4
//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );

文件的打开方式

文件使用方式    文件使用方式    如果指定文件不存在

文件使用方式 文件使用方式 如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”(追加) 向文本文件尾添加数据 建立一个新的文件
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件

代码示例

?
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main()
{
    FILE *pf = fopen("test.txt",'w');
    if(pf==NULL)
    {
        perror("FOPEN:");        //对文件指针进行判断以免返回空指针;
    }
    fput("haohaoxuexi,tiantianxiangshang",pf);
    fclose(pf);
    pf=NULL;            //文件关闭之后把指针置为空,以免出现野指针
}

‘ w ’ 没有文件的情况下会新建一个文件在此程序文件夹下,可以看到文件已经生成了。

文件读写函数

功能 函数名 适用于
字符输入函数 fgetc 所有输入流
字符输出函数 fputc 所有输出流
文本行输入函数 fgets 所有输入流
文本行输出函数 fputs 所有输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
二进制输入 fread 文件
二进制输出 fwrite 文件

二进制方式存储文件

二进制存储在文件内是查看不到具体信息的,要想在文件内查看具体信息要选择其他函数。

二进制形式存储代码示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
struct student
{
    char name[20];
    int age;
    char adress[20];
}*s1;
int main()
{
    s1 = (struct student*)malloc(sizeof(struct student));
    if (s1 == NULL)
    {
        perror("malloc:");
        return 0;
    }
    FILE* pf = fopen("test.txt", "wb");
    if (pf == NULL)
    {
        perror("FOPEN:");   //对文件指针进行判断以免返回空指针;
        return 0;
    }
    strcpy(s1->name, "陈独秀");
    s1->age = 18;
    strcpy(s1->adress,"东城区箭杆胡同20号");
    fwrite(s1, sizeof(struct student), 1, pf);
    fclose(pf);
    pf = NULL;
}

结果:

C语言实现对文件进行操作的示例详解

可以看到文件已经出现了部分乱码,还能看到文字的原因是文本文件打开的时候默认以一种编码形式打开,将本来存到文本里的二进制信息进行了解码。

对文件进行拷贝

这里要注意\需要再用\转义,否则是转义字符的意思

  • 先打开要拷贝的文件,再打开新建拷贝后的文件进行拷贝
  • 如果是图片视频等文件,要使用二进制的方式打开、读取和存储,否则文件会损坏
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
int main()
{
    FILE* pfr = fopen("C:\\Users\\22763\\Pictures\\Saved Pictures\\QQ图片20211001085735.jpg", "rb");      //要拷贝的文件目录
    FILE* pfw = fopen("CopyPic.jpg", "wb");
    char temp;
    if (pfw == NULL||pfr==NULL)
    {
        perror("FOPEN:");   //对文件指针进行判断以免返回空指针;
        return 0;
    }
    while (fread(&temp, sizeof(char), 1, pfr))
    {
        fwrite(&temp, sizeof(char), 1, pfw);
    }
    fclose(pfw);
    fclose(pfr);
    pfw = NULL;
    pfr = NULL;
}

文件随机读写函数

这三个函数并不常用,所有只要知道有这三个函数就行了以及他们是干什么的就可以了,用的时候再查。

fseek

?
1
int fseek(FILE stream,long offset,int origin );

根据文件指针的位置和偏移量来定位文件指针。

ftell

?
1
long ftell( FILE *stream );

返回文件指针相对于起始位置的偏移量

rewind

?
1
void rewind( FILE *stream );

让文件指针的位置回到文件的起始位置

文件缓冲区

文件在读或者写的时候存在一个文件缓冲区,因为与磁盘交互,需要一定时间(尽管很短),但是为了尽可能的节省时间,系统自动地在内存中设立了文件缓冲区,等攒够一定的数据,或者程序结束,一起读或写,这样大大提高读写速度,避免每个字符都要进行一次读或写。

以上就是C语言实现对文件进行操作的示例详解的详细内容,更多关于C语言文件操作的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/qq_65596720/article/details/130026982

延伸 · 阅读

精彩推荐
  • C/C++C语言数据的存储超详细讲解中篇练习

    C语言数据的存储超详细讲解中篇练习

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保...

    初学C语言者10702022-11-08
  • C/C++主流操作系统平台的宏定义

    主流操作系统平台的宏定义

    这篇文章主要介绍了主流操作系统平台的宏定义,最近正在学习C++程序从Windows 平台向Unix 平台移植,参考了 qt 的宏定义文件,需要的朋友可以参考下...

    C语言程序设计5982021-01-16
  • C/C++C语言实现C++继承和多态的代码分享

    C语言实现C++继承和多态的代码分享

    本文主要给大家简单讲诉了C和C++的区别以及如何使用C语言模拟实现C++继承和多态,并附上示例代码,是篇相当不错的文章,推荐给喜欢C语言的小伙伴们...

    name_文强12222021-05-26
  • C/C++C++ explicit关键字讲解

    C++ explicit关键字讲解

    这篇文章主要介绍了C++ explicit关键字讲解,++提供了explicit关键字,相对于implicit而言,他默认关闭了隐式类型转换方法。至于两者有什么区别,看下面文章...

    龙小5432022-07-27
  • C/C++一文带你深入了解C++中音频PCM数据

    一文带你深入了解C++中音频PCM数据

    PCM(Pulse Code Modulation)也被称为脉冲编码调制,是数字通信的编码方式之一。这篇文章主要和大家聊聊C++中音频PCM数据的相关操作,需要的可以参考一下...

    很久没安静的回忆了9302023-02-28
  • C/C++使用C++程序获取新浪行情数据的方法

    使用C++程序获取新浪行情数据的方法

    这篇文章介绍了在一定的周期范围内去抓取新浪中行情数据,通过更新数据来缓解构造模拟数据与真实数据差异性,感兴趣的朋友可以了解一下...

    邵明9192021-03-03
  • C/C++QT实现用户登录注册

    QT实现用户登录注册

    这篇文章主要为大家详细介绍了QT实现用户登录注册,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    阿宁(xin)。7532022-12-24
  • C/C++教你分辨C++堆与栈的区别

    教你分辨C++堆与栈的区别

    堆与栈的区别有:1、栈由系统自动分配,而堆是人为申请开辟;2、栈获得的空间较小,而堆获得的空间较大;3、栈由系统自动分配,速度较快,而堆一般...

    恋喵大鲤鱼11232021-11-17