c++标准IO和文件IO

#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;

}

猜你喜欢

转载自blog.csdn.net/tulipless/article/details/81135128