C/C++文件读写(最全方法,多种实现)

article/2024/7/27 21:41:34

文章目录

  • 前言
  • 一、文件处理过程
  • 二、C处理文件
    • 1.打开文件
    • 2.读文件
    • 4.写文件
    • 5.关闭文件
  • 三、C++处理文件
  • 四、Windows API处理文件
  • 五、ATL处理文件
  • 总结

C/C++实战入门到精通 https://blog.csdn.net/weixin_50964512/article/details/125710864

前言

本章主要详解C/C++对文件的所有常见方法汇总

先要明白一个概念,即几乎在所有编程语言中,文件处理都是一个非常重要的模块

因为文件可以实现对数据大量且长久的存储

一、文件处理过程

无论什么编程语言,处理文件的过程都可以分为以下三步:

  1. 打开文件
  2. 操作文件
  3. 关闭文件

所以当我们操作文件的时候,请务必牢记这三点,因为该逻辑几乎是所有语言通用的,只不过具体实现细节略有差异

二、C处理文件

首先来看C中处理文件的方式,因为C是面向过程的语言,所以使用起来较为繁琐,你需要记住很多函数

而这些函数所在的头文件为:

#include<cstdio> //或者#include<stdio.h>均可

同时需要注意的是:

C语言库中的函数,很多都存在安全隐患,就会存在一个相应的安全函数,一般对应的安全函数名称都是在原函数后添加_s后缀

例如:fopen的安全函数为fopen_s

相比较而言,安全函数会比标准函数使用更繁琐,所以很多情况下我们会习惯于使用标准函数,

但在VS环境下直接使用不安全的函数,会直接报错,编译无法通过,此时就必须要定义对应的宏才能正常使用

而安全函数则无需定义任何宏,可直接使用

具体使用哪一种看个人习惯,官方推荐使用安全函数

1.打开文件

首先是打开文件的函数:

//标准函数:
FILE* fopen(
const char * _FileName,//要打开的文件名,不指定路径,则在当前文件夹找
const char * _Mode //打开的模式 读r 写w 或追加a
);
//返回值:打开失败返回NULL,打开成功则返回指向文件的标识符//安全函数errno_t fopen_s(
FILE**      _Stream, //保存打开文件后的标识符
const char * _FileName, //要打开的文件名,不指定路径,则在当前文件夹找
const char * _Mode //打开的模式 读r 写w 或追加a);//返回值:打开成功返回0,打开失败则返回对应错误代码

两种函数的使用区别:

#define _CRT_SECURE_NO_WARNINGS //vs环境下,必须定义该宏,否则报错
#include<cstdio>
using namespace std;
int main() {FILE* file = fopen("1.txt","r"); //以读的方式打开文件if (file == NULL) { //file为NULL,则打开文件失败,退出程序return -1;}
}
#include<cstdio>
using namespace std;
int main() {FILE* file;errno_t err=fopen_s(&file,"1.txt","r"); //以读的方式打开文件if (err != 0) { //err不为0,则打开文件失败,退出程序return -1;}
}

对于mode参数,有如下选择:
在这里插入图片描述

2.读文件

然后就是文件操作中的读:

//标准函数:
size_t  fread(
void*  _Buffer, //读取到的内容存放空间
size_t _ElementSize, //每次读多少个字节
size_t _ElementCount, //读多少次
FILE*  _Stream //文件标识符
);
//返回值:实际读取的次数,注意,实际的取得字节数应该是该返回值和_ElementSize参数相乘,所以一般_ElementSize参数填1//安全函数:
size_t fread_s(
void*  _Buffer,//读取到的内容存放空间
size_t _BufferSize, //第一个参数指示的缓存区大小
size_t _ElementSize,//每次读多少个字节
size_t _ElementCount,//读多少次
FILE*  _Stream //文件标识符
);
//返回值:实际读取的次数,注意,实际的取得字节数应该是该返回值和_ElementSize参数相乘,所以一般_ElementSize参数填1

两者使用区别:

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
using namespace std;
int main() {FILE* file = fopen("1.txt","r"); //以读的方式打开文件if (file == NULL) { //file为NULL,则打开文件失败,退出程序return -1;}char buf[0xFF]; //定义存放读取内容的缓存区size_t size=fread(buf,1,100, file); //每次读一个字节,读100次
}
#include<cstdio>
using namespace std;
int main() {FILE* file;errno_t err=fopen_s(&file,"1.txt","r"); //以读的方式打开文件if (err != 0) { //err不为0,则打开文件失败,退出程序return -1;}char buf[0xFF];  //定义存放读取内容的缓存区size_t size=fread_s(buf,sizeof(buf),1,100,file);//每次读一个字节,读100次
}

除了上面最基本的读文件数据函数,还有一些其它读操作的函数:

  1. fgetc:从文件中读取一个字符
int fgetc(
FILE* _Stream //文件标识符
);
//返回值:返回读取到的一个字符
#define _CRT_SECURE_NO_WARNINGS //vs环境下必须定义该宏,否则报错
#include<cstdio>
using namespace std;
int main() {FILE* file = fopen("1.txt","r"); //已只读方式打开if (file == NULL) {  //打开失败直接返回return -1;}char c=fgetc(file); //读取一个字符
}
  1. fgets:从文件中读取一个字符串
char* __cdecl fgets(
char* _Buffer, //存放读到的字符缓冲区int   _MaxCount, //该缓存区的大小
FILE* _Stream //文件标识符
);
//返回值:成功为_Buffer指针,失败为NULL

使用:

#define _CRT_SECURE_NO_WARNINGS //vs环境下必须定义该宏,否则报错
#include<cstdio>
using namespace std;
int main() {FILE* file = fopen("1.txt","r"); //已只读方式打开if (file == NULL) {  //打开失败直接返回return -1;}char buf[0xFF];fgets(buf,0xFF,file); //读取一行字符串
}
  1. fscanf:按格式从文件中读取指定内容,与scanf函数类似
int fscanf(FILE*       const _Stream,//文件标识符char const* const _Format, //指定读取格式,与printf格式相同... //存放读取内容的缓存区
)

使用:

#define _CRT_SECURE_NO_WARNINGS //vs环境下必须定义该宏,否则报错
#include<cstdio>
using namespace std;
int main() {FILE* file = fopen("1.txt","r"); //已只读方式打开if (file == NULL) {  //打开失败直接返回return -1;}int d; //存放数字char buf[0xFF]; //存放字符串的缓存区fscanf(file,"%d %s",&d,buf); //按格式读取文件内容
}
  1. fscanf_sfscanf的安全函数,作用相同
int fscanf_s(FILE*       const _Stream,//文件标识符char const* const _Format, //指定读取格式,与printf格式相同... //存放读取内容的缓存区,注意在每个缓存区大小后一个参数为该缓存区的大小
)

使用:

#include<cstdio>
using namespace std;
int main() {FILE* file;errno_t err=fopen_s(&file,"1.txt","r");if (err != 0) {return -1;}int b;char buf[0xFF];fscanf_s(file,"%d %s",&b,buf,sizeof(buf));fclose(file);
}

4.写文件

文件操作主要就两个,上面说了读,下面就是写了:

标准函数:

size_t fwrite(
void const* _Buffer, //要写入的内容
size_t _ElementSize, //元素大小
size_t  _ElementCount, //元素个数
FILE*   _Stream //文件标识);

使用:

#define _CRT_SECURE_NO_WARNINGS //vs环境下必须定义该宏,否则报错
#include<cstdio>
using namespace std;
int main() {FILE* file = fopen("1.txt","w"); //已只读方式打开if (file == NULL) {  //打开失败直接返回return -1;}char buf[] = "test"; //要写入的内容fwrite(buf,1,sizeof(buf),file); //写入操作
}

该函数无安全函数

除了最基本的写入函数,还有一些其它的常用写操作函数:

  1. fputc:向文件中写入一个字符
int  fputc(
int   _Character,//要写入的字符
FILE* _Stream //文件标识符
);

使用:

#include<cstdio>
using namespace std;
int main() {FILE* file;errno_t err=fopen_s(&file,"1.txt","w");if (err != 0) {return -1;}int ret=fputc('c',file);//向file标识的文件写入一个c字符
}
  1. fputs:向文件中写入一个字符串
int fputs(
char const* _Buffer,//要写入的内容
FILE* _Stream //文件标识符
);

使用:

int main() {FILE* file;errno_t err=fopen_s(&file,"1.txt","w");if (err != 0) {return -1;}char buf[] = "test";int ret = fputs(buf,file); //将buf内的内容写入到file标识的文件
}
  1. fprintf:向文件中写入指定格式字符串,与pritnf函数类似
int fprintf(FILE* _Stream, //文件标识符
char const* const _Format, //写入格式 与printf使用方式相同...
)

使用:

#include<cstdio>
using namespace std;
int main() {FILE* file;errno_t err=fopen_s(&file,"1.txt","w");if (err != 0) {return -1;}fprintf(file,"%d %s",4,"test");  //向fille标识的文件写入数字4和字符串test
}
  1. fprintf_sfprintf的安全函数

fprintf没什么区别,不再讲解

5.关闭文件

最后是关闭文件

int fclose(
FILE* _Stream //文件标识符
);

使用:

#include<cstdio>
using namespace std;
int main() {FILE* file;errno_t err=fopen_s(&file,"1.txt","w");if (err != 0) {return -1;}fclose(file);//关闭文件
}

三、C++处理文件

C++使用了面向对象对文件处理进行了封装,所以处理文件会比C方便很多

为了方便使用,C++封装了三个文件操作类

头文件:

#include<fstream> //处理文件的头文件
using namespace std; //引用该命名空间,不引用将必须使用std::fstring 的方式使用该类

代码:

首先是最通用的类fstream

#include<fstream>
using namespace std;
int main() {fstream file;file.open("1.txt",ios::out); //以只写模式打开文件char buf[] = "test";file.write(buf,sizeof(buf));//写入文件file.close(); //关闭文件file.open("1.txt", ios::app); //以追加模式打开文件char buf1[] = "test1";file.write(buf1, sizeof(buf));//写入文件末尾file.close(); //关闭文件file.open("1.txt",ios::in); //以只读方式打开文件char buf2[0xFF]; //存储读取的内容file.read(buf2,0xFF); //读文件file.close(); //关闭文件
}

模式选择:
在这里插入图片描述
但既然已经封装成为了类,那么在特定需求下,打开文件这个操作也是可以省略的

首先是读文件的类ifstream

#include<iostream>
#include<fstream>
using namespace std;
int main() {ifstream f("1.txt");char buf[0xFF];f.read(buf,0xFF); //普通读取char c=f.get(); //读取一个字符char bufLine[0xFF];f.getline(bufLine,0xFF); //读取一行
}

然后是写文件的类ofstream

#include<iostream>
#include<fstream>
using namespace std;
int main() {ofstream f("1.txt");char buf[0xFF];f.write("hello world",12); //普通写f.put('c'); //写入一个字符
}

四、Windows API处理文件

如果是在windows系统,那么还可以直接调用系统api完成文件读写操作

但会更加复杂

需要头文件:

#include<Windows.h>

首先是打开文件的函数:CreateFileA或CreateFileW

HANDLE CreateFileA(
LPCSTR lpFileName, //要打开的文件名
DWORD dwDesiredAccess, //访问文件权限
DWORD dwShareMode, //文件共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //安全模式,一般填0,默认
DWORD dwCreationDisposition, //打开方式
DWORD dwFlagsAndAttributes, //打开文件的属性和标志,一般为FILE_ATTRIBUTE_NORMAL
HANDLE hTemplateFile //模板文件句柄,一般为NULL
);

然后读文件函数:ReadFile

BOOL ReadFile(
HANDLE       hFile, //要读取的文件句柄,CreateFileA的返回值,相当于c中的FILE
LPVOID       lpBuffer, //存储读取内容的缓存区
DWORD        nNumberOfBytesToRead, //要读取的字节数
LPDWORD      lpNumberOfBytesRead, //接收读到的字节数
LPOVERLAPPED lpOverlapped //重叠结构,一般填NULL
);

还有写文件函数:WriteFile

BOOL WriteFile(
HANDLE       hFile,//要写入的文件句柄,CreateFileA的返回值,相当于c中的FILE
LPCVOID      lpBuffer,//要写入文件的缓存区
DWORD        nNumberOfBytesToWrite, //要写入的字节数
LPDWORD      lpNumberOfBytesWritten, //接收已经写入的字节数
LPOVERLAPPED lpOverlapped //重叠结构,一般填NULL
);

最后是关闭文件函数:CloseHandle

BOOL CloseHandle(
HANDLE hObject  //要关闭的文件句柄
);

示例:

#include<Windows.h>
int main() {HANDLE hFile=CreateFileA("1.txt", GENERIC_READ | GENERIC_WRITE,0,0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); //打开读写模式打开文件if (hFile == NULL) { //打开文件失败,退出return -1;}DWORD len;WriteFile(hFile,"test",sizeof("test"),&len,NULL); //写文件char buf[0xFF];ReadFile(hFile,buf,0xFF,&len,NULL); //读文件CloseHandle(hFile);//关闭文件
}

五、ATL处理文件

如果你觉得直接使用win API操作文件太麻烦,那就可以尝试自己将其封装一个类

而ATL就帮我们把这一个工作给做了,在VS环境下,可以直接包含这个头文件:

#include<atlfile.h>

该头文件中有一个CAtlFile类,就是简洁的将上面的win API函数封装了一下

其使用方式比win API会简洁很多

#include<atlfile.h>
int main() {CAtlFile file;file.Create(L"text.txt", GENERIC_ALL, 0, CREATE_NEW);char buf[20] = "hello world";file.Write(buf, 20);file.Read(buf, 20);file.Close();
}

正如你所看到的,它仅仅只是简单的封装了一下,其参数依旧是win API对应的参数,需要经常查询文档

其优点就是提高了我们的开发速度,而且最终生成的目标程序与直接使用win API进行开发相差不大

总结

如果你希望提高开发速度,跨平台,那么我推荐你使用C++方式

如果在意目标程序的大小,但想要跨平台,那么我推荐你使用C方式

如果你只是想要在windows平台开发程序,很在意程序的大小,那么我就推荐你使用win API

在此基础上如果你还想要提高开发速度,那么就可以使用一下ATL里面封装好的文件类

想要深入学习C/C++的同学,可以点击下方链接查看一份详细的C/C++教程,以项目为主导,从入门到精通!

C/C++实战入门到精通 https://blog.csdn.net/weixin_50964512/article/details/125710864

http://chatgpt.dhexx.cn/article/j67U48uy.shtml

相关文章

FTP如何设置用户名密码

1、新建FTP站点&#xff0c;指定名称和物理路径 2、“身份验证”选择 基本&#xff0c;“允许访问”选择 指定用户&#xff0c;下面文本框中输入“本地用户和组”中现有的一个用户名即可。 注意&#xff1a;只能是“本地用户和组”中的用户&#xff0c;自己指定的其他用户名无…

win10系统连接服务器的用户名多少,win10 ftp服务器 用户名和密码

win10 ftp服务器 用户名和密码 内容精选 换一换 CDM支持周期性自动将新增文件上传到OBS&#xff0c;不需要写代码&#xff0c;也不需要用户频繁手动上传即可使用OBS的海量存储能力进行文件备份。这里以CDM周期性备份FTP的文件到OBS为例进行介绍。例如&#xff1a;FTP服务器的to…

Windows下如何搭建FTP服务并且设置其用户名和密码

1. 为了设置用户名和密码&#xff0c;要做一些准备工作&#xff1a; 打开 右键 计算机-》管理-》本地用户和组 右键之后点击新用户&#xff1a; 设置你自己的用户名和密码&#xff0c;这个就是之后给ftp服务用的。 2. 控制面板-》程序和功能-》打开或关闭Windows功能&am…

win10 FTP服务器设置用户名和密码

设置FTP用户及密码之前,请先给电脑添加新的本地账户以及搭建本地ftp服务器。FTP用户及密码就是win10的账户名和密码。 win10添加新的本地账户:https://jingyan.baidu.com/article/b0b63dbf3b38d54a49307046.html 搭建本地FTP服务器:https://blog.csdn.net/feifei_Tang/arti…

用Metasploit破解ftp用户名和密码

Metasploit是渗透测试人员在世界各地的资源和工具&#xff0c;比较常用的命令&#xff1a; msfconsole——直接进入 show options——查看 set RHOSTS ip地址/段 use 路径 需要在虚拟机的2003版本下创建FTP服务 将字典密码文件加入到虚拟机的系统里边 命令 ——rz 查看ftp是…

win7修改ftp服务器密码,win7ftp服务器设置用户名密码设置

win7ftp服务器设置用户名密码设置 内容精选 换一换 登录云服务器的用户名和密码&#xff1a;Windows操作系统用户名&#xff1a;AdministratorLinux操作系统用户名&#xff1a;root如忘记登录密码&#xff0c;可通过 “ 重置密码 ” 功能设置新密码。 代码迁移工具进行代码迁移…

linux下的ftp登陆用户名和密码,Linux下实现ftp普通账号和vip账号限速

ftp工作流程: ftp回话包含了两个通道,控制通道和数据通道,ftp的工作有两种模式,一种是主动模式,一种是被动模式,以ftpserver为参照物,主动模式,服务器主动连接客户端传输,被动模式,等待客户端的连接 主动模式: ftp客户端连接到ftp服务器的21端口,发送用户名和密码,…

抓取FTP登录名和密码

R1配置IP地址 <H3C>system-view [H3C]sysname R1 [R1]int g0/0 [R1-GigabitEthernet0/0]ip address 1.1.1.1 24 R2配置IP地址 <H3C>system-view [H3C]sysname R2 [R1]int g0/1 [R2-GigabitEthernet0/0]ip address 1.1.1.2 24 R2开启FTP服务&#xff0c;创建用…

CentOS 7如何找回用户名和密码

当我们在使用CentOS 7系统时忘记了账号密码怎么办呢&#xff1f; 第一步 进入选择系统界面 选择你的操作系统 然后按e键进入 第二步 进入界面后添加代码并执行 如图所示 在UTF-8后面添加 init/bin/sh这段代码 之后按cltr x 执行进入命令行界面 第三步 如何查看你的用户名和…

用户名密码方式访问 FTP

前言 用户名密码方式访问 FTP。 简介 场景&#xff1a;ftp 和 www web 服务器相结合 公司内部现在有一台 FTP 和 WEB 服务器&#xff0c;FTP 的功能主要用于维护公司的网站内容&#xff0c;包括上传文件、创建目录、更新网页等等。公司现有两个部门负责维护任务&#xff0c…

Windows10系统怎么在电脑上搭建ftp服务器?ftp用户名密码忘了怎么查看?

1.从程序面板中选择:打开或关闭windows功能,勾选下面标红选框点击确定 2.我的电脑,鼠标右击选择【管理】,点击服务和应用程序,intent information services, 3.点击【网站】鼠标右击选择添加FTP站点管理,站点名称自己定义,物理路径自定义,点击下一步 4选择自己的IP

用户自己修改ftp服务器默认密码是什么,ftp服务器 改默认用户名和密码

ftp服务器 改默认用户名和密码 内容精选 换一换 支持2.2.T1、2.2.T2、2.2.T2.SPC100、2.2.T2.SPC200、2.2.T2.SPC300版本升级到2.2.T3版本。支持2.2.T3升级到2.2.1版本。支持2.2.T3、2.2.1升级到2.2.T4版本。支持2.2.T4、2.2.1升级到2.3.T10版本。联网状态下,系统会自动下载鲲…

实验二 简单网络命令和wireshark捕获FTP用户名密码

实验二 简单网络命令和wireshark捕获FTP用户名密码 预备知识 Wireshark&#xff08;前称Ethereal&#xff09;是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口&#xff0c;直接…

FTP-用户名密码明文传输

一、实验原理 FTP协议用于用户认证的过程中&#xff0c;客户端与服务器是通过明文进行交互信息的。 二、实验环境 目标主机&#xff1a;Win2K3 192.168.20.145 攻击主机&#xff1a;Kali2 192.168.20.133 三、实验过程 在Kali2上开启wireshark软件&#xff0c;抓取FTP数据…

python ftplib模块 爆破ftp登录用户名和密码

1.连接ftp服务器 import ftplib ftp ftplib.FTP() ftp.connect(192.168.50.130, 21) ftp.login("anonymous","") #用户为匿名&#xff0c;密码为空 list ftp.retrlines(list) #此时可以获得当前ftp目录下的所有文件的信息 print(list)运行结果&a…

FTP-用户名密码暴力破解

一、实验环境 目标主机&#xff1a;Win2K3 192.168.20.145 攻击主机&#xff1a;Kali2 192.168.20.133 二、实验过程 创建一个名为admin1的administrators的用户 使用medusa暴力破解ftp密码 -h&#xff1a;靶机的IP地址 -u&#xff1a;靶机用户名 -P&#x…

搭建ftp并设置用户名和密码

第一步&#xff1a;启用 IIS 服务 步骤一 : 打开控制面板 点击 "开始" &#xff08;或者按键盘上的微软徽标键&#xff0c;通常在左侧 Ctrl 键和 Alt 键之间&#xff09;&#xff0c;在打开的 "开始菜单" 中&#xff0c;点击 "控制面板"&#x…

WIN10 配置FTP服务器 加 用户名密码,本地用FileZila访问

步骤分两部&#xff1a;创建FTP服务器、设置用户名密码 一 创建FTP服务器&#xff1a; #1.控制面板>程序>启用或关闭Windows功能>… (控制面板可在 桌面右键>个性化>主题>桌面图标设置>勾选控制面板>确定) #2.搜索IIS打开IIS #3.右击网站添加FTP站点…

FTP设置用户名和密码

第一步新建用户: 1.电脑右键管理--> 2.本地用户和组--> 3.新建用户,设置密码成功 第二步:开启FTP服务 1.控制面板-->程序-->启用或关闭Windows功能-->开启FTP相关服务 第三步:打开IIS管理器 1.搜索输入IIS打开iis管理器--> 2.右键添加FTP站点-->(站点名称…

基于神经网络算法LSTM模型对股票指数进行预测

资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/86813208 资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/86813208 神经网络算法对股票的预测 背景 在复杂的股票市场环境中&#xff0c;神经网络算法在股票预测中已经得到…