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;

}

 一、ASCII 输出   为了使用下面的方法, 你必须包含头文件(译者注:在标准C++中,已经使用取 代,所有的C++标准文件都是无后缀的。)。这是 的一个扩展集, 提供有缓 冲的文件输入输出操作. 事实上, 已经被包含了, 所以你不必包含所有这两个 文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O 操作。如果你猜是"fstream," 恭喜你答对了! 但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。   如果你用过标准控制台流"cin"?和 "cout," 那现在的事情对你来说很简单。 我们现在开始讲输出部 分,首先声明一个类对象。 ofstream fout;   这就可以了,不过你要打开一个文件的话, 必须像这样调用ofstream::open()。 fout.open("output.txt");   你也可以把文件名作为构造参数来打开一个文件. ofstream fout("output.txt");   这是我们使用的方法, 因为这样创建和打开一个文件看起来更简单. 顺便说一句, 如果你要打开的文 件不存在,它会为你创建一个, 所以不用担心文件创建的问题. 现在就输出到文件,看起来和"cout"的操 作很像。 对不了解控制台输出"cout"的人, 这里有个例子。 int num = 150; char name[] = "John Doe"; fout << "Here is a number: " << num << " "; fout << "Now here is a string: " << name << " ";   现在保存文件,你必须关闭文件,或者回写文件缓冲. 文件关闭之后就不能再操作了, 所以只有在你 不再操作这个文件的时候才调用它,它会自动保存文件。 回写缓冲区会在保持文件打开的情况下保存文 件, 所以只要有必要就使用它。回写看起来像另一次输出, 然后调用方法关闭。像这样: fout << flush; fout.close();    现在你用文本编辑器打开文件,内容看起来是这样:   Here is a number: 150 Now here is a string: John Doe   很简单吧! 现在继续文件输入, 需要一点技巧, 所以先确认你已经明白了流操作,对 "<>" 比较熟悉了, 因为你接下来还要用到他们。继续…   二、ASCII 输入   输入和"cin" 流很像. 和刚刚讨论的输出流很像, 但你要考虑几件事情。在我们开始复杂的内容之前 , 先看一个文本:   12 GameDev 15.45 L This is really awesome!   为了打开这个文件,你必须创建一个in-stream对象,?像这样。 ifstream fin("input.txt");   现在读入前四行. 你还记得怎么用"<<" 操作符往流里插入变量和符号吧?好,?在 "<>" (提取) 操作符. 使用方法是一样的. 看这个代码片段.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值