C++ 读写文件

 

目录

1、stream状态的成员函数

2、操作文件

2.1、搜索文件和文件夹:

2.2、创建文件夹、删除文件夹

2.3 修改文件名字

3、读写文件

3.1 创建文件

3.2 读文件

3.3 写文件

3.4 操纵器

3.5 流的格式

3.6 测试


1、stream状态的成员函数

头文件:<fstream>

与流状态相关的函数表
编号成员函数作用
1

good()

若stream正常,返回true(表示设置了goodbit)
2

eof()

若获取文件至文本尾(end-of-file),返回true(表示设置了eofbit)
3

fail()

若发生错误,返回true(表示设置了failbit)
4

bad()

发生毁灭性错误,如系统崩溃,返回ture(表示设置了badbit)
5

rdstate()

返回当前流的所有状态
6

clear()

清空所有状态
7

clear(state)

清空后,设置状态
8

setstate(state)

追加设置状态

例子检查failbit是否被设置,若设置清除它

    if(stream.rdstate() & std::ios::failbit)
    {
        //清除并设置流的状态
        stream.clear(is.rdstate()&~std::ios::failbit);
    }

2、操作文件

2.1、搜索文件和文件夹:

  1. 头文件:<io.h>
  2. 函数:long handle = _findfirst(parameter1,patameter2);
  3. 参数1:要获取的文件或文件夹属性的路径
  4. 参数2:根据_findfirst匹配的系统类型,创建对应  _finddata32_t,  _finddata32i64_t,                           _finddata64i32_t, __finddata64_t 类型的变量,他们的结构都是一样的。
  5. 返回值:句柄 handle,若handle == 0 ,查找失败
_finddata成员属性表
编号成员作用
1unsigned    attrib;_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)
2__time32_t  time_create;创建的时间(s:从1970-1-1 0::0:0计算)
3__time32_t  time_access;文件或文件夹最后一次被访问的时间
4__time32_t  time_write;文件或文件夹最后一次被修改的时间
5 _fsize_t    size;文件或文件夹的大小
6char        name[260];文件或文件夹的名字

例子:

//创建句柄
long handle;
_finddata64i32_t filedata;
//搜索文件
handle = _findfirst("./test/*.txt", &filedata);
	
vector<string> vecpath;
vecpath.resize(numbers);
//保存文件名
vecpath[0] = filedata.name;
//保存当前路径下所有文件的文件名
for ( int i = 1; i < numbers; ++i)
{
	//搜索下一个文件
	_findnext(handle, &filedata);
	vecpath[i] = filedata.name;
}
//关闭句柄
_findclose(handle);

注意:搜索文件的时候最好确定要搜索文件的类型(*.txt或*.csv等),文件夹下有很多隐藏文件,并不使用,但也会被搜索出来。

2.2、创建文件夹、删除文件夹

  1. 头文件: <direct.h>
  2. 函数名:int returnVal = _mkdir(path);
  3. 作用:创建文件夹
  4. 返回值:0表示创建成功,-1表示创建失败

例子:

if (0 !=_mkdir("./floder"))
{
	cout << "Creating floder is failed" << endl;
}
  1. 头文件: <direct.h>
  2. 函数名:int returnVal = _rmdir(path);
  3. 作用:删除文件夹
  4. 返回值:0表示创建成功,-1表示创建失败

例子:

if (0 != _rmdir("./floder"))
{
	cout << "Deleting floder is failed" << endl;
}

注意:删除文件夹很容易失败,原因有:

  1. 文件夹不是空的
  2. 文件夹内文件正在被使用
  3. 输入路径错误
  4. 要删除的文件不是文件夹

2.3 修改文件名字

rename(char* oldFileName,char* newOldName);

3、读写文件

3.1 创建文件

  1. 头文件:<fstream>
  2. 两种方式:

例一:

//创建流时直接打开文件
fstream is("./test.txt", ios::in);
if (!is.is_open())
{
	cout << "Opening file is failed" << endl;
}

例二:

fstream os;
//使用成员函数open打开文件
os.open("./test.txt", ios::out);
if (!os.is_open())
{
	cout << "Opening file is failed" << endl;
}
C++文件打开模式
编号C++模式c模式含义
1ios::in"r"打开读取
2ios::out"w"打开写入,若存在则删除内容
3ios::out|ios::trune"w"打开写入,若存在则删除内容
4ios::out|ios::app"a"打开写入,追加
5ios::out|ios::out"r+"打开写入
6ios::out|ios::out|ios::trune"w+"打开写入,若存在则删除内容
7c++mode|ios::binary"cmodeb"以c++mode和二进制打开
8c++mode|ios::atecmode"--

seekg():设置输入流位置。

tellg():获取输入流位置。

ios::beg:输入流开始位置。

ios::cur:输入流的当前位置。

ios::end:输入流的结束位置。

3.2 读文件

头文件:<fstream>

 

读取时,对读取字符操作的相关函数

  1. streamsize istream::gcount() const ;    //返回上一次“非格式化读取操作”所读的字符个数
  2. istream& istream::ignore() ;    //舍弃一个字符
  3. istream& istream::ignore(streamsize count) ;    //舍弃coumt个字符
  4. istream& istream::ignore(streamsize count,char) ;    //舍弃count个字符,char 是分隔符

例子:

舍弃当前一行的剩余部分:
is.ignore(numeric_limits<std::streamsize>::max(),’\n’);
舍弃所有的剩余部分:
is.ignore(numeric_limits<std::streamsize>::max());
  1. int istream::peek();    //返回下一个要读取的字符,但不会真的把它读出来;
  2. istream& istream::unget();     //将上一次读取的字符,放回流中
  3. istream& istream::putback(char c);     //将上一次读取的字符,放回流中

区别,putback会检查待放的字符是否是上一次读取的字符,若不是,设置badbit。

3.3 写文件

  1. variable >> ostream;    //将变量variable写入stream中
  2. ostream& ostream::put(char c);    //将实参c写至stream
  3. ostream& ostream::write(const char* str, streamsize count);    //将str中的count个字符写入stream
  4. ostream&  ostream::flush();    //刷新stream缓冲区。
  5. seekp():设置输出流位置; tellp():获取输出流位置。

3.4 操纵器

头文件:<iomanip>

操纵器
编号操作器效果
1endl换行符并清空输出
2ends 
3flush清空输出流
4ws读入并忽略空格
5skipws执行operator>>时跳过前导空格
6noskipws执行operator>>时不跳过前导空格
7unitbuf每次写操作write后,清空缓存区
8nounitbuf每次写操作write后,不清空缓存区
9setiosflags(flags)设置格式
10resetiosflags(m)清空m标志的一组flag
11setw(val)设置下一次输入和输出的宽度
12set·fill(c)填充字符
13left靠左
14right靠右
15internal正负号靠左,数值靠右
16boolalpha对bool值强制使用文本表示
17noboolalpha对bool值强制使用数值表示
18showpos对正值强制写出正号
19noshowpos对正值强制不写出正号
20uppercase对数值强制使用大写字母
21nouppercase 
22oct以八进制读写整数值
23dec以十进制读写整数值
24hex以十六进制读写整数值
25showbase显示数值的基数
26noshowbase 
27showpoint总是为浮点数写出小数点
28noshowpoint不要求为浮点数写出小数点
29setprecision(val)设置浮点数的精度
30fixed对浮点数使用十进制便是发
31scientific对浮点数使用科学计数法
32hexfloat对浮点数使用十六进制科学计数法
33defaultfloat使用常规浮点数表示法
34put_time(val,fmt)根据格式fmt写出date/time值
35get_time(val,fmt)根据格式fmt读入date/time值
36put_money(val)使用本地货币符号写出货币值
37put_money(val,intl)根据intl的货币符号写出货币值
38get_money(val)使用本地货币符号读入货币值
39get_money(val,intl)根据intl的货币符号读入货币值

3.5 流的格式

流格式设置相关的函数
编号函数含义
1setf(flags)添设额外的flags,返回所有flag的之前状态
2setf(flags,grp)添设分组grp中的flag,返回所有flag的之前状态
3unsetf(flags)清除flags
4flags()返回所有当前设置的format flag
5flags(flags)将flags设为型的flag,返回所有flag的之前状态
6copyfmt(stream)从stream中复制所有的格式定义
7boolalpha若被设置,便以文本表示,否则以数字表示
8width()返回当前栏位的宽度
9width(val)设置val为当前栏位宽度,并返回之前的栏位宽度
10fill()返回当前的填充字符
11fill(c)定义c为当前的填充字符,并返回之前的填充字符
12precision()返回当前的浮点数精度
13precision(val)两val为型的浮点数精度,并返回原设定值
14skipws调用>>读取数值时,自动跳过起始的空白字符
15unitbuf每次输出后,刷清output缓冲区
编号maskflag含义
1adjustfieldleft靠左
right靠右
internal正负号靠左,数值靠右
wu靠右
2basefieldoct以八进制进行读写
dec以十进制进行读写
hex以十六进制进行读写
wu以十进制进行输出,读取时则视起始字符而决定进制
3floatfieldfixed使用小数计数法
Scientific使用科学计数法
None使用上述两者中最合适者
Fixed|Scientific十六进制科学计数法

3.6 测试

#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

int main()
{
	//输出字符格式:十进制,靠右,显示正负号,显示小数点,小数点计数
	ios_base::fmtflags ouputStyle = cout.flags(ios::hex | ios::right | ios::showpos |ios::showpoint | ios::fixed);

	cout.setf(ouputStyle);

	double dTemp = 0.0000008;
	//设置宽度和填充,每次都要重新设置
	cout << setw(20)<< setfill(' ')<< "0xFFFF" << endl;
	cout << setw(20) << setfill(' ') << dTemp << endl;
	//精度设置一次即可,就有效
	cout << setw(20) << setfill(' ') << setprecision(10) << dTemp << endl;

	system("pause");
}

//0xFFFF
//+ 0.000001
//+ 0.0000008000
//请按任意键继续. . .

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值