目录
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、搜索文件和文件夹:
- 头文件:<io.h>
- 函数:long handle = _findfirst(parameter1,patameter2);
- 参数1:要获取的文件或文件夹属性的路径
- 参数2:根据_findfirst匹配的系统类型,创建对应 _finddata32_t, _finddata32i64_t, _finddata64i32_t, __finddata64_t 类型的变量,他们的结构都是一样的。
- 返回值:句柄 handle,若handle == 0 ,查找失败
编号 | 成员 | 作用 |
1 | unsigned 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; | 文件或文件夹的大小 |
6 | char 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、创建文件夹、删除文件夹
- 头文件: <direct.h>
- 函数名:int returnVal = _mkdir(path);
- 作用:创建文件夹
- 返回值:0表示创建成功,-1表示创建失败
例子:
if (0 !=_mkdir("./floder"))
{
cout << "Creating floder is failed" << endl;
}
- 头文件: <direct.h>
- 函数名:int returnVal = _rmdir(path);
- 作用:删除文件夹
- 返回值:0表示创建成功,-1表示创建失败
例子:
if (0 != _rmdir("./floder"))
{
cout << "Deleting floder is failed" << endl;
}
注意:删除文件夹很容易失败,原因有:
- 文件夹不是空的
- 文件夹内文件正在被使用
- 输入路径错误
- 要删除的文件不是文件夹
2.3 修改文件名字
rename(char* oldFileName,char* newOldName);
3、读写文件
3.1 创建文件
- 头文件:<fstream>
- 两种方式:
例一:
//创建流时直接打开文件
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模式 | 含义 |
1 | ios::in | "r" | 打开读取 |
2 | ios::out | "w" | 打开写入,若存在则删除内容 |
3 | ios::out|ios::trune | "w" | 打开写入,若存在则删除内容 |
4 | ios::out|ios::app | "a" | 打开写入,追加 |
5 | ios::out|ios::out | "r+" | 打开写入 |
6 | ios::out|ios::out|ios::trune | "w+" | 打开写入,若存在则删除内容 |
7 | c++mode|ios::binary | "cmodeb" | 以c++mode和二进制打开 |
8 | c++mode|ios::ate | cmode" | -- |
seekg():设置输入流位置。
tellg():获取输入流位置。
ios::beg:输入流开始位置。
ios::cur:输入流的当前位置。
ios::end:输入流的结束位置。
3.2 读文件
头文件:<fstream>
读取时,对读取字符操作的相关函数
- streamsize istream::gcount() const ; //返回上一次“非格式化读取操作”所读的字符个数
- istream& istream::ignore() ; //舍弃一个字符
- istream& istream::ignore(streamsize count) ; //舍弃coumt个字符
- istream& istream::ignore(streamsize count,char) ; //舍弃count个字符,char 是分隔符
例子:
舍弃当前一行的剩余部分:
is.ignore(numeric_limits<std::streamsize>::max(),’\n’);
舍弃所有的剩余部分:
is.ignore(numeric_limits<std::streamsize>::max());
- int istream::peek(); //返回下一个要读取的字符,但不会真的把它读出来;
- istream& istream::unget(); //将上一次读取的字符,放回流中
- istream& istream::putback(char c); //将上一次读取的字符,放回流中
区别,putback会检查待放的字符是否是上一次读取的字符,若不是,设置badbit。
3.3 写文件
- variable >> ostream; //将变量variable写入stream中
- ostream& ostream::put(char c); //将实参c写至stream
- ostream& ostream::write(const char* str, streamsize count); //将str中的count个字符写入stream
- ostream& ostream::flush(); //刷新stream缓冲区。
-
seekp():设置输出流位置; tellp():获取输出流位置。
3.4 操纵器
头文件:<iomanip>
编号 | 操作器 | 效果 |
1 | endl | 换行符并清空输出 |
2 | ends | |
3 | flush | 清空输出流 |
4 | ws | 读入并忽略空格 |
5 | skipws | 执行operator>>时跳过前导空格 |
6 | noskipws | 执行operator>>时不跳过前导空格 |
7 | unitbuf | 每次写操作write后,清空缓存区 |
8 | nounitbuf | 每次写操作write后,不清空缓存区 |
9 | setiosflags(flags) | 设置格式 |
10 | resetiosflags(m) | 清空m标志的一组flag |
11 | setw(val) | 设置下一次输入和输出的宽度 |
12 | set·fill(c) | 填充字符 |
13 | left | 靠左 |
14 | right | 靠右 |
15 | internal | 正负号靠左,数值靠右 |
16 | boolalpha | 对bool值强制使用文本表示 |
17 | noboolalpha | 对bool值强制使用数值表示 |
18 | showpos | 对正值强制写出正号 |
19 | noshowpos | 对正值强制不写出正号 |
20 | uppercase | 对数值强制使用大写字母 |
21 | nouppercase | |
22 | oct | 以八进制读写整数值 |
23 | dec | 以十进制读写整数值 |
24 | hex | 以十六进制读写整数值 |
25 | showbase | 显示数值的基数 |
26 | noshowbase | |
27 | showpoint | 总是为浮点数写出小数点 |
28 | noshowpoint | 不要求为浮点数写出小数点 |
29 | setprecision(val) | 设置浮点数的精度 |
30 | fixed | 对浮点数使用十进制便是发 |
31 | scientific | 对浮点数使用科学计数法 |
32 | hexfloat | 对浮点数使用十六进制科学计数法 |
33 | defaultfloat | 使用常规浮点数表示法 |
34 | put_time(val,fmt) | 根据格式fmt写出date/time值 |
35 | get_time(val,fmt) | 根据格式fmt读入date/time值 |
36 | put_money(val) | 使用本地货币符号写出货币值 |
37 | put_money(val,intl) | 根据intl的货币符号写出货币值 |
38 | get_money(val) | 使用本地货币符号读入货币值 |
39 | get_money(val,intl) | 根据intl的货币符号读入货币值 |
3.5 流的格式
编号 | 函数 | 含义 |
1 | setf(flags) | 添设额外的flags,返回所有flag的之前状态 |
2 | setf(flags,grp) | 添设分组grp中的flag,返回所有flag的之前状态 |
3 | unsetf(flags) | 清除flags |
4 | flags() | 返回所有当前设置的format flag |
5 | flags(flags) | 将flags设为型的flag,返回所有flag的之前状态 |
6 | copyfmt(stream) | 从stream中复制所有的格式定义 |
7 | boolalpha | 若被设置,便以文本表示,否则以数字表示 |
8 | width() | 返回当前栏位的宽度 |
9 | width(val) | 设置val为当前栏位宽度,并返回之前的栏位宽度 |
10 | fill() | 返回当前的填充字符 |
11 | fill(c) | 定义c为当前的填充字符,并返回之前的填充字符 |
12 | precision() | 返回当前的浮点数精度 |
13 | precision(val) | 两val为型的浮点数精度,并返回原设定值 |
14 | skipws | 调用>>读取数值时,自动跳过起始的空白字符 |
15 | unitbuf | 每次输出后,刷清output缓冲区 |
编号 | mask | flag | 含义 |
1 | adjustfield | left | 靠左 |
right | 靠右 | ||
internal | 正负号靠左,数值靠右 | ||
wu | 靠右 | ||
2 | basefield | oct | 以八进制进行读写 |
dec | 以十进制进行读写 | ||
hex | 以十六进制进行读写 | ||
wu | 以十进制进行输出,读取时则视起始字符而决定进制 | ||
3 | floatfield | fixed | 使用小数计数法 |
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
//请按任意键继续. . .