C++中文件操作头文件:fstream
文件类型:文件文件和二进制文件
文件操作三大类:
ofstream 写操作
ifstream 读操作
fstream:读写操作
文件打开方式:
标志 | 说明 |
ios::in | 只读 |
ios::out | 只写,文件不存在则创建,存在则打开并截断原内容 |
ios::ate | 打开一个已有的文件,并指向文件读指针指向文件尾,若文件不存在,则打开出错 |
ios::app | 打开文件,从文件尾添加内容,若文件不存在则创建 |
ios::trunc | 打开文件同时会截断原内容,单独使用时与ios::out相同 |
ios::binary | 以二进制方式打开 |
ios::in|ios::out | 打开文件,可读也可写,文件打开时原内容保持不变,若不存在则打开出错 |
ios::in|ios::out|ios::trunc | 打开文件,可读写,会截断原内容,文件不存在则创建 |
1.文本方式写入示例
#include < iostream >
#include < fstream >
using namespace std;
int main()
{
/*1.创建文件*/
ofstream fp;
fp.open("test.txt",ios::out);//创建文件,会截断原内容
if (!fp.is_open())//文件打开失败返回false
{
cout < < "文件打开失败!" < < endl;
return 0;
}
fp < < "C++文件操作示例!" < < endl;
fp < < "写入数据测试" < < endl;
fp < < "姓名:IT_阿水" < < "t工作方向:" < < "嵌入式开发" < < "t工作时间:" < < "6年" < < endl;
fp.close();//关闭文件
system("pause");
}
2.文本方式读取示例
C++中读取数据有多种方式实现。
2.1 示例1:重载>>读取
#include < iostream >
#include < fstream >
using namespace std;
int main()
{
ifstream ifs;
ifs.open("test.txt",ios::in);//只读方式打开
if (!ifs.is_open())
{
cout < < "文件打开失败!" < < endl;
return 0;
}
string str;
while (ifs >> str)//以字符串方式读取
{
cout < < "str=" < < str < < endl;;
}
//关闭文件
ifs.close();
system("pause");
}
2.2 利用成员函数getline读取
#include < iostream >
#include < fstream >
using namespace std;
int main()
{
ifstream ifs;
ifs.open("test.txt",ios::in);//只读方式打开
if (!ifs.is_open())
{
cout < < "文件打开失败!" < < endl;
return 0;
}
//第二种:getline()
char buff[1024];
while (ifs.getline(buff, sizeof(buff)))
{
cout < < "buff=" < < buff < < endl;
}
//关闭文件
ifs.close();
system("pause");
}
2.3 单个字符方式读取get()
#include < iostream >
#include < fstream >
using namespace std;
int main()
{
ifstream ifs;
ifs.open("test.txt",ios::in);//只读方式打开
if (!ifs.is_open())
{
cout < < "文件打开失败!" < < endl;
return 0;
}
//第三种:单个字符方式读取
char c;
while ((c = ifs.get()) != EOF)
{
cout < < c;
}
//关闭文件
ifs.close();
system("pause");
}
3.二进制方式读写示例
- 二进制数据写入文件
函数:write(const _Elem* _Str, streamsize _Count)
形参:_Str --写入的内容的起始地址
_Count --写入的字节数
- 二进制数据读取文件
read(_Elem* _Str, streamsize _Count) ;
形参:_Str --读取内容存放缓冲区
_Count --要读取的字节数
#include < iostream >
#include < fstream >
#include < cstring >
using namespace std;
class Person
{
public:
Person() {}
Person(const char* name, int age)
{
strcpy_s(this->name, name);
this->age = age;
}
char name[20];//姓名
int age;//年龄
};
int main()
{
/*二进制写入数据示例*/
fstream fs("test.doc", ios::out | ios::binary);
if (!fs.is_open())
{
cout < < "文件创建失败" < < endl;
return 0;
}
Person p("小王", 18);
fs.write((const char *) & p, sizeof(p));//写入内容
fs.close();//关闭文件
/*二进制读取数据示例*/
fs.open("test.doc", ios::in | ios::binary);
if (!fs.is_open())
{
cout < < "文件打开失败" < < endl;
return 0;
}
Person p2;
fs.read((char *) & p2, sizeof(p2));
cout < < "读取的内容:" < < endl;
cout < < "姓名:" < < p2.name < < "t年龄:" < < p2.age < < endl;
fs.close();
system("pause");
}
4.C++指针偏移
C++文件指针偏移
seekg(pos_type _Pos,ios_base::seekdir _Way) --用于输入流,偏移位置指针到指定位置
seekp(pos_type _Pos,ios_base::seekdir _Way) --用于输出流,偏移位置指针到指定位置
第一个参数:偏移量
第二个参数:基于哪个位置
ios::beg --文件头
ios::end --文件尾
ios::cur --当前位置
streamoff tellg() --用于输入流,返回当前指针位置,streamoff 是一个long long类型
streamoff tellp() --用于输出流,返回当前指针位置
返回值返回基于文件头的偏移量,字节为单位。失败则返回-1
示例:
#include < iostream >
#include < fstream >
using namespace std;
int main()
{
ifstream fs;
fs.open("test.txt", ios::in );//打开文件,不存在则打开失败,不会截断原内容
if (!fs.is_open())
{
cout < < "文件打开失败" < < endl;
return 0;
}
fs.seekg(0,ios::end);//将文件指针偏移到文件末尾
char buff[1024];
streamoff size = fs.tellg();//获取文件大小
cout < < "文件大小:" < < size < < "字节" < < endl;
fs.seekg(0, ios::beg);//将输入流偏移到文件头
while (fs >> buff)
{
cout < < buff < < endl;
}
fs.close();
system("pause");
return 0;
}
5.C++中使用fopen系列函数示例
#define _CRT_SECURE_NO_DEPRECATE
#include < iostream >
using namespace std;
int main()
{
cout < < "写入数据示例:" < < endl;
string file = "1.txt";
FILE* fp = fopen(file.c_str(),"w+b");
if (fp == NULL)
{
cout < < "创建文件失败" < < endl;
}
char buff[] = "C语言格式文件读写操作示例!";
size_t size=fwrite(buff,1,sizeof(buff),fp);
cout < < "文件写入成功!size=" < < size < < endl;
fclose(fp);
cout < < "读取数据示例:" < < endl;
fp = fopen(file.c_str(), "rb");
if (fp == NULL)
{
cout < < "打开文件失败" < < endl;
}
char data[200];
size=fread(data, 1, sizeof(data), fp);
data[size] = '�';
cout < < "读取内容:" < < data < < "t字节数:" < < size < < endl;
fclose(fp);
system("pause");
}
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
函数
+关注
关注
3文章
4294浏览量
62347 -
C++
+关注
关注
21文章
2104浏览量
73461 -
文件操作
+关注
关注
0文章
7浏览量
5334 -
头文件
+关注
关注
0文章
25浏览量
9843
发布评论请先 登录
相关推荐
MSP430之裸奔框架C++程序源码(菜农C++裸奔大法系列之一) 转载
/*------------------------------------------------------------------------MSP430之裸奔框架C++程序源码(菜农C++裸奔大法)本程序主要表现了
发表于 02-01 11:06
在main文件中怎样去使用C++呢
ESP32 之 ESP-IDF 学习笔记(五 - 2)【使用C++的工程】文章目录ESP32 之 ESP-IDF 学习笔记(五 - 2)【使用C++的工程】1、导言2、在main
发表于 01-07 07:44
C++之操作符重载学习的总结
操作符重载是c++的强大特性之一;操作符重载的本质是通过函数扩展操作符的功能;operator 关键字是实现操作符重载的关键。
C++入门之表达式
C++中提供了很多操作符且定义了什么时候可以用于操作基本类型,其还允许我们定义用于操作class类型的操作符,接下来几篇文章将会介绍
C++学习笔记之c++的基本认识
自这篇文章我们即将开始C++的奇幻之旅,其内容主要是读C++ Primer的总结和笔记,有兴趣可以找原版书看看,对于学习C++还是有很大帮助的。这篇文章将从一个经典的程序开始介绍C++
C++之父新作带你勾勒现代C++地图
为了帮助大家解决这些痛点问题,让大家领略现代C++之美,掌握其中的精髓,更好地使用C++,C++之父Bjarne Stroustrup坐不住了,他亲自操刀写就了这本《
评论