C++ 从键盘、文件读入

Background Info

  • EOF是C语言中为了区分有效数据和输入结束符的。 EOF的输入由系统锁定,windows下是 ctrl+z,linux/unix下是 ctrl+d.
  • 在 C++ 中,输入输出流被定义为类。C++ 的I/O库中的类称为流类(stream class)。 用流类定义的对象称为流对象。
      输入和输出是数据传送的过程,数据如流水一样从一处流向另一处。C++ 形象地将此过程称为流(Stream)。C++的输入输出流是指由若干字节组成的宇节序列,这些宇节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。在输入操作时,字节流从输入设备(如键盘、磁盘)流向内存,在输出操作时,字节流从内存流向输出设备(如屏幕、打印机、磁盘等)。流中的内容可以是ASCII字符、二进制形式的数据、图形图像、数字音频视频或其他形式的信息。
      实际上,在内存中为每一个数据流开辟一个内存缓冲区,用来存放流中的数据。当用cout和插入运算符“<<”向显示器输出数据时,先将这些数据送到程序中的输出缓冲区保存,直到缓冲区满了或遇到endl,就将缓冲区中的全部数据送到显示器显示出来。在输入时,从键盘输入的数据先放在键盘的缓冲区中,当按回车键时,键盘缓冲区中的数据输入到程序中的输入缓冲区,形成cin流,然后用提取运算符“ >>”从输入缓冲区中提取数据送给程序中的有关变量。总之,流是与内存缓冲区相对应的,或者说,缓冲区中的数据就是流。

从键盘读入

1. cin

  • cin 继承了 istream 类,是 istream 的一个对象。
  • cin无法读入空格和换行。

来看一段代码:

#include<iostream>
using namespace std;
char a[10], b;
cin >> b;
cout << b << endl;
cin.getline(a, 10);
cout << a << endl;

运行程序,输入a,程序运行的结果是:

/media/sf_code> ./a.out 
a
a
     // 此处为一个空格
/media/sf_code> 

  这里涉及到的是:cin在读入的时候,输入内容暂时被保存在缓存中,遇到回车时内容被传递给输入流 cin。但是换行符仍然滞留在输入流了,如果在 cin 后面有getline语句,这个换行符就被这个 getline 读取了,于是得到 getline 的结果为空。

  可以用cin.ignore()来清空缓存区。

  cin.getline()不会把’\0’, ‘ ‘, ‘\n’等默认的分隔符写入到字符数组,因此如果在std::cin>>w后面紧接着的cin.getline语句(可以尝试把ignore()语句注释掉),会变为空读入,再后面的cin.getline()就正常读入每一行内容,并且把读入的分隔符舍弃。

2. getline

在C++中本质上有两种getline函数:
第一种:在头文件中,是iostream类的成员函数。
第二种:在头文件中,是普通函数。

第二种其实是在string类定义中对getline进行了重载。

cin.getline()

  • istream& getline (char* s, streamsize n );
  • istream& getline (char* s, streamsize n, char delim );

getline()

  • istream& getline (istream& is, string& str, char delim);
  • istream& getline (istream&& is, string& str, char delim);
  • istream& getline (istream& is, string& str);
  • istream& getline (istream&& is, string& str);

3. cin.get

  • int get();
  • istream& get (char& c);
  • istream& get (char* s, streamsize n);
  • istream& get (char* s, streamsize n, char delim);
  • istream& get (streambuf& sb);
  • istream& get (streambuf& sb, char delim);

  cin.get() 遇到delimiting character 时候是不读取的,将其留在流中;而 getline() 读取限定符但不显示。
  假定输入一串字符,以Enter结束输入。cin.get遇到 \n后便返回,此时\n还留在缓冲区中,所以下次读出来的将是\n,而getline遇到\n时会将其从缓存区中移除之后在返回。所以很多时候用getline方便些。

利用 while 连续读入

  • while (bool) 语句的判定条件是一个bool类型,而 getline 返回地类型是 istream. 这里实际上还隐式的调用了转换函数,将 istream 转换成 bool.
operator void *() const { if(state&(badbit|failbit) ) return 0; return (void *)this; }
operator bool() const { if(state&(badbit|failbit) ) return 0; return (void *)this; }
string s;
while(getline(cin,s)) {
    cout << s << endl;
}

从文件读入

  从文件读入和从键盘读入类似,只是需要先将文件以文件流的形式打开。

// 输入文件流
#include<iostream>
#include<fstream>
#include <string>
using namespace std;

int main() {
  char line[50];
  ifstream ifile("./text.txt");  
  while (ifile.getline(line, sizeof(line))) {
    cout << line << endl;
  }
  ifile.close();
  return 0;
}
// 输出文件流
#include<iostream>
#include<fstream>
#include <string>
using namespace std;

int main() {
  ofstream ofile("./text2.txt");
  ofile << "hello world!" << endl; 
  ofile.close();
  return 0;
}

References:
getline函数介绍:
https://www.cnblogs.com/xiaofeiIDO/p/8574042.html
getline实际使用中常见问题分析:
https://blog.csdn.net/iamiman/article/details/53468250
https://blog.csdn.net/JiuHuangShan/article/details/53150766
文件流:
https://www.cnblogs.com/zhengfa-af/p/8157199.html

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的用C++编写的程序,可以从键盘读入一批图形信息,并将它们保存到文件中。 ```c++ #include <iostream> #include <fstream> using namespace std; int main() { int num; // 图形数量 cout << "请输入图形数量:" << endl; cin >> num; ofstream outfile("shapes.txt"); // 打开输出文件 if (!outfile.is_open()) { // 判断文件是否打开成功 cout << "打开文件失败!" << endl; return 1; } char shape[20]; // 存储图形名称的数组 double length, width, radius; // 存储图形参数的变量 for (int i = 1; i <= num; i++) { cout << "请输入第" << i << "个图形的名称和参数:" << endl; cin >> shape; if (strcmp(shape, "圆") == 0) { // 如果是圆形 cin >> radius; outfile << "圆 " << radius << endl; // 将图形信息写入文件 } else if (strcmp(shape, "矩形") == 0) { // 如果是矩形 cin >> length >> width; outfile << "矩形 " << length << " " << width << endl; // 将图形信息写入文件 } else { cout << "输入的图形名称不正确!" << endl; i--; } } outfile.close(); // 关闭输出文件 return 0; } ``` 程序先要求用户输入图形数量,然后通过 `ofstream` 类打开一个名为 `shapes.txt` 的输出文件。如果打开失败,则输出错误信息并退出程序。 接下来,程序使用一个 `for` 循环读取用户输入的每个图形的名称和参数,并将它们写入输出文件中。对于每个图形,程序根据输入的名称来判断它是圆形还是矩形,然后分别读取相应的参数并将图形信息写入文件中。如果输入的图形名称不正确,则输出错误信息并让循环变量减一,以便重新输入该图形的信息。 最后,程序关闭输出文件并返回 0 表示正常结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值