C++ 文件操作

发布于 2024-05-16 20:50:15 字数 5939 浏览 29 评论 0

输入输出流

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 这 个头文件中被定义,在这个头文件中主要被定义了三个类, 由这三个类控制对文件的各种输入输出操作 , 他们分别是 ifstreamofstream

在这里插入图片描述

由于文件设备并不像显示器屏幕与键盘那样是标准默认设备,所以它在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

海未深

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文