#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
#include <fstream>//文件读写头文件
using namespace std;
int main()
{
char a;
char buf[256] = { 0 };
//下面一段代码表示从缓冲区中读一个写入变量a中
/*
while (1)
{
cin.get(a);
if (a != EOF)//EOF表示资料源无更多可读资料,即读完了,在我们键盘上EOF等价于ctrl+z
{
cout << a;
}
}
*/
//从缓存区读取256个字符到buf中,如果没到256个,读到\n结束,不会读取\n
//整个的运行流程是:
//1.你输入一个字符串并按回车结束,这时你的缓冲区中是这一段字符串加一个\n,因为cin.get()不论是哪种都遇回车结束,因此此时缓存区中还留有一个\n
//2.当第二个cin.get()去读取缓冲区的内容时,读到的是\n,直接结束,因此第二个cin不会阻塞,这是需要用cin.ignore()函数去吃掉这个\n
cin.get(buf, 256);
cout << buf <<endl;
cin.ignore();//吃掉当前缓冲区的一个字符
//cin.ignore(2, '\n');//吃掉两个字符,但如果到2个字符之前遇到\n,则自动结束,不再继续吃字符
cin.getline(buf, 256);//读取一行,读256个,只读到\n之前,不会读取\n
cout << buf <<endl;
a = cin.peek();//只能写成这种形式,读取缓冲区的内容,并返回第一个字符,并不拿走,只是拷贝
if (a >= '0'&&a <= '9')
{
int number;
cin >> number;//很巧妙的用法,因为cin.peek()只是偷窥,并不是读取,因此就相当于常规的标准输入,cin与cin.get()不同,它会自动舍弃\n
cout << "您输入的数字是:" << number << endl;
}
else
{
char buf[1024] = { 0 };
cin >> buf;
cout << "您输入的字符串是:" << buf << endl;
}
cout << "请输入一个数字或字符串:" << endl;
cin.get(a);
if (a >= '0'&&a <= '9')
{
cin.putback(a);//把cin.get取出来的重新放回缓冲区中
int number;
cin >> number;
cout << "您输入的数字是:" << number << endl;
}
else
{
cin.putback(a);
char buf[1024] = { 0 };
cin >> buf;
cout << "您输入的字符串是:" << buf << endl;
}
//标准输出流
cout.flush();//刷新输出流
cout.put('a').put('b').put('c') <<endl;//输出字符'a','b','c'
//格式化输出
int number = 10;
cout.unsetf(ios::dec);//写在当前默认的10进制输出方式
cout.setf(ios::oct);//设置为八进制输出
cout.setf(ios::showbase);//显式八进制数钱的0和十六进制钱的0x
cout << number << endl;
cout.unsetf(ios::oct);
cout.setf(ios::hex);
cout << number << endl;
cout.unsetf(ios::hex);
cout.setf(ios::dec);
cout << number << endl;
//也可以通过控制符进行格式化输入输出
cout << hex
<< setiosflags(ios::showbase)
<< number
<< endl;
/*
int u1 = 0x01020304;
char u2;
u2 = u1;
if (u2 == 1)
{
cout << "大端" << endl;
}
if (u2 == 4)
{
cout << "小端" << endl;
}
*/
//判断数据大小端
//文本文件读写
const char *sourceFileName = "C:\\Users\\ts\\Desktop\\source.txt";//windows下路径为反斜杠,需要把一个反斜杠变为两个,linux下路径为正斜杠则不需要变为两个
ifstream ism(sourceFileName, ios::in);//只读方式打开文件,从文件中输入到流中
ofstream osm("C:\\Users\\ts\\Desktop\\target.txt", ios::out | ios::app);//只写方式打开文件
//下面两段代码的写法也是可以的
//ifstream ism;
//ism.open(sourceFileName, ios::in);
if (!ism)//本质是重写了!符号,类对象ism取反为真则表明文件打开失败
{
cout << "源文件打开失败" << endl;
}
if (!osm)
{
cout << "目标文件打开失败" << endl;
}
char buf1[1024] = { 0 };
while (ism.getline(buf1, 1024))//把读出的内容存放在程序的变量buf1中,读到没资源可读时会返回EOF,即为假
{
//总结:
//标准IO时:
//cin.get(a)是读\n的, cin.get(buf, 1024), cin.getline(buf, 1024)遇\n结束,遇到\n会直接结束,get()与getline()效果完全相同
//文件IO时:
//ism.get(a)是读\n的,ism.get(buf, 1024)遇\n结束,循环读取只能读一行,读的数据不包含\n,ism.getline(buf, 1024)遇\n结束,但循环读可以读所有行,读取每一行内容都不包含\n
cout << buf1 <<endl;
osm << buf1 << endl;//向osm对象写入数据时,直接用<<操作符就可以,因为它的<<操作符被重写了,且后面带一个endl,即把\n也输入进去,这样就相当于完整的输入一行的,且带有\n
}
//ism.get(buf1, 1024);
//cout << buf1;
ism.close();
osm.close();
return 0;
}