C++ 文件操作
输入输出流
C++
输入输出包含以下三个方面的内容:
- 对 系统指定的标准设备的输入和输出。 即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准 I /O。
- 以外存磁盘文件为对象进行输入和输出, 即从磁盘文件输入数据, 数据输出到磁盘文件。 以外存文件为对象的输入输出称为文件的输入输出,简称文件 I /O。
- 对 内存中指定的空间进行输入和输出。通常指定一个字符数组作为存储空间( 实际上可以利用该空间存储任何信息) 。 这种输入和输出称为字符串输入输出,简称串 I /O。
缓冲区的概念:
- 要注意;
- 读和写是站在应用程序的角度来看的;
标准输入流对象 cin
, 重点函数:
cin.get() // 一次只能读取一个字符
cin.get(一个参数) // 读 一个字符
cin.get(两个参数) // 可以读字符串
cin.getline()
cin.ignore()
cin.peek()
cin.putback()
测试 cin.get()
、 cin.getline()
的简单使用:
#include <iostream>
#include <iomanip>
using namespace std;
int main(int argc, char const **argv)
{
char ch;
//while( (ch = cin.get()) != EOF)
// cout << ch << endl;
//char ch; cin.get(ch); //same as above
char buf[256] = { 0 };
cin.get(buf, 256); // 两个参数,从缓冲区读取一个字符串指定长度
cout << buf;
cin.get(buf, 256, '\n'); //三个参数,指定终止的字符
cout << buf;
cin.getline(buf, 256); //读取一行数据,不读换行符
cout << buf;
return 0;
}
测试 cin.ignore()
使用:
#include <iostream>
using namespace std;
int main(int argc, char const **argv)
{
char ch;
cin.get(ch); //从缓冲区要数据 阻塞
cout << ch << endl;
cin.ignore(1); //忽略当前字符 从缓冲区取走了
cin.get(ch);
cout << ch << endl;
return 0;
}
运行效果:
测试 cin.peek()
函数的使用:
#include <iostream>
using namespace std;
int main(int argc, char const** argv)
{
cout << "请输入数组或者字符串:" << endl;
char ch;
ch = cin.peek(); //偷窥一下缓冲区,并不会取走, 返回第一个字符
if (ch >= '0' && ch <= '9'){
int number;
cin >> number; // 从缓冲区读取这个数字
cout << "您输入的是数字:" << number << endl;
}
else{
char buf[256] = { 0 };
cin >> buf; // 从缓冲区读取这个字符串
cout << "您输入的是字符串:" << buf << endl;
}
return 0;
}
运行结果:
测试 cin.putback()
函数的使用:
#include <iostream>
using namespace std;
int main(int argc, char const **argv)
{
cout << "请输入字符串或者数字:" << endl;
char ch;
cin.get(ch); //从缓冲区取走一个字符
if (ch >= '0' && ch <= '9'){
cin.putback(ch); //ch 放回到缓冲区
int number;
cin >> number;
cout << "您输入的是数字:" << number << endl;
}else{
cin.putback(ch);// 将字符放回缓冲区
char buf[256] = { 0 };
cin >> buf;
cout << "您输入的是字符串: " << buf << endl;
}
return 0;
}
效果和测试 cin.peek()
函数的一样。
标准输出流对象 cout
,重点函数:
cout.flush() // 刷新缓冲区
cout.put() // 向缓冲区写字符
cout.write() // 二进制流的输出
cout.width() // 输出格式控制
cout.fill()
cout.setf(标记)
cout
比较简单不做案例演示。
文件读写
输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的。 在实际应用中,常以磁盘文件作为对象。即从磁盘文件读取数据,将数据输出到磁盘文件。 和 文件有关系的输入输出类主要在 fstream.h
这 个头文件中被定义,在这个头文件中主要被定义了三个类, 由这三个类控制对文件的各种输入输出操作 , 他们分别是 ifstream
、 ofstream
。
由于文件设备并不像显示器屏幕与键盘那样是标准默认设备,所以它在 fstream.h
头 文件中
是没有像 cout
那 样预先定义的全局对象,所以我们必须自己定义一个该类的对象。 ifstream
类 ,它是从 istream
类 派生的,用来支持从磁盘文件的输入。 ofstream
类 ,它是从 ostream
类 派生的,用来支持向磁盘文件的输出。
fstream
类 ,它是从 iostream
类 派生的,用来支持对磁盘文件的输入输出。
所谓打开( open
) 文 件是一种形象的说法,如同打开房门就可以进入房间活动一样。 打
开 文件是指在文件读写之前做必要的准备工作,包括:
- 为文件流对象和指定的磁盘文件建立关联,以便使文件流 向指定的磁盘文件。
- 指定文件的工作方式,如,该文件是作为输入文件还是输出文件,是
ASCII
文件还是二进制文件等。
以上工作可以通过两种不同的方法实现。
#include <iostream>
#include <fstream> //文件读写的头文件
using namespace std;
int main(int argc, char const **argv)
{
const char* srcName = "src.txt";
const char* destName = "dest.txt";
ifstream is(srcName, ios::in); //只读方式打开
ofstream os(destName, ios::out | ios::app); // app 表示是追加
if(!is){
cout << "打开文件失败!" << endl;
return -1;
}
char ch;
while(is.get(ch)){
cout << ch;
os.put(ch); // 输出到 os 指向的文件
}
is.close();
os.close();
return 0;
}
演示结果:
测试按照二进制方式写入和读取:
#include <iostream>
#include <fstream>
using namespace std;
class Person{
public:
int age;
int id;
Person(){ }
Person(int age, int id):age(age), id(id){ }
void show()
{
cout << "age: " << age << ", id: " << id << endl;
}
};
#if 0
int main(int argc, char const **argv)
{
Person p1(10, 20), p2(30, 40);
const char *destFile = "dest.txt";
ofstream os(destFile, ios::out | ios::binary); // 二进制方式写入
os.write((char*)&p1, sizeof(Person));
os.write((char*)&p2, sizeof(Person));
os.close();
return 0;
}
#endif
int main(int argc, char const** argv)
{
const char *destFile = "dest.txt";
ifstream is(destFile, ios::in | ios::binary);
Person p1, p2;
is.read((char*)&p1, sizeof(Person));
is.read((char*)&p2, sizeof(Person));
p1.show();
p2.show();
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: C++ 函数模板、类模板
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论