🚘正片开始
字符串流
字符串流需要包含 头文件#include<sstream>
,字符串流可以做到
- 字符串数据的转换
- 字符串的分割
头文件:
#include<sstream>
void main()
{
stringstream object("我是大帅比"); //用此类创建对象并赋值
cout << object.str(); //输出我是大帅比 返回的是string类的对象
//下面两种输出我是大帅比,返回的是const char*类型
const char* s= object.str().data();
const char* s= object.str().c_str();
}
清空对象内部的字符串
void main()
{
stringstream object("我是大帅比");
cout << object.str(); //这里打印我是大帅比
object.str(""); //这里清空
cout << object.str(); //这里啥都不打印
}
1.1 数据转换成字符串
void main()
{
stringstream stream;
int num = 123456;
char str[20] = { 0 };
stream << num; //将数字输入到对象内
stream >> str; //再由对象输到str数组
cout << str; //打印字符串123456
}
1.2 字符串转换成数据
void main()
{
char str[25] = "3.14";
stringstream stream(str);
double num;
stream >> num; //将字符串3.14输入到num
cout << num; //打印3.14
}
2. 字符串分割
int main()
{
string str = "姓名: 张三 年龄: 18 性别: 男";
stringstream stream(str);
string tmp;
char name[25] = { 0 };
int age=0;
char sex[25] = {0};
stream >> tmp >> name >> tmp >> age >> tmp >> sex;
cout << name << " " << age << " " << sex << endl; //张三 18 男
return 0;
}
文件操作
了解相关的文件操作的函数
对象.get()
:每次获取文件的单个字符并返回其ASCLL码值对象.getline()
:每次获取文件中一行字符并且忽略换行符对象.put()
:每次写入文件一个字符对象.eof()
:判断是否到达文件结束标志,没有到则返回0,到了则返回-1,此函数一般与上面三个函数结合使用对象.is_open()
:此函数可以判断文件是否打开失败,打开失败返回0,成功返回非0对象.fail()
:如果打开失败返回非0,成功返回0
问:
- 如何将字符串写到文件中,又如何将文件的字符串读到程序中?
- 如何将带有格式的数据写到文件中,又如何读出来?
- 如何使用二进制读写?
👇接下来我会逐个解答
✍将字符串写到文件中
fstream out("string.txt", ios::out);
if (!out.is_open())
{
printf("写的方式打开失败");
return;
}
string name = "abcd\nefghd\nqqqqq";
for (auto c : name)
{
out.put(c); //put()只能传字符
}
out.close();
📖将字符串读出来有两种方式
- 用对象访问get()函数读取
fstream i("string.txt", ios::in);
if (!i) //判断文件是否打开失败 如果打开失败i返回0
{
printf("读的方式打开失败\n");
return;
}
//开始读取
while (!i.eof()) //判断是否达到文件结束标志
{
char c = i.get();
cout <<c;
}
i.close();
- 用对象访问getline()函数读取
/*
string.txt内部数据
abcd
efgh
defr
*/
fstream read("string.txt", ios::in);
if (!read) //判断文件是否打开失败 如果打开失败i返回0
{
printf("读的方式打开失败\n");
return;
}
//开始读取
char arr[255] = { 0 }; //读出来放到这里
while (!read.eof()) //判断是否达到文件结束标志
{
read.getline(arr, 255);
cout << arr;
}
//最终输出的结果是abcdefghdefr,很明显getline()忽略了换行符
read.close();
✍将有格式的数据写到文件中
用流的方式写入
struct Player
{
char name[25];
char sex[25];
int age;
char pos[25];
};
Player Info[3] = { {"张三","男",18,"天津"},{"李四","男",20,"北京"},{"王五","男",22,"四川"} };
fstream out("info.txt", ios::out);
if (!out)
{
printf("写的方式打开文件失败\n");
return;
}
for (auto v : Info)
{
out << v.name << "\t" << v.sex << "\t" << v.age << "\t" << v.pos << endl;
}
out.close(); //关闭文件
📖将文件的数据读出
用流的方式流出
struct Player
{
char name[25];
char sex[25];
int age;
char pos[25];
};
//读
fstream i("info.txt", ios::in);
if (!i)
{
printf("读的方式打开文件失败\n");
return;
}
Player data[3] = { 0 };
for (auto& v : data)
{
i >> v.name >> v.sex >> v.age >> v.pos;
}
i.close();
✍用二进制的方式写入
struct Player
{
char name[25];
char sex[25];
int age;
char pos[25];
};
Player Info[3] = { {"张三","男",18,"天津"},{"李四","男",20,"北京"},{"王五","男",22,"四川"} };
fstream out("info.txt", ios::out|ios::binary); //用二进制的方式需要加入二进制模式ios::binary
if (!out)
{
printf("写的方式打开文件失败\n");
return;
}
out.write((char*)Info, sizeof(Info));
out.close()
📖用二进制的方式读出
fstream i("info.txt", ios::in|ios::binary);
if (!i)
{
printf("读的方式打开文件失败\n");
return;
}
Player data[3] = { 0 };
i.read((char*)data, sizeof(data));
i.close();
🎉完结