Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 3

cin 不可输入空白字符,但 get()和 getline()可以

get()和 getline()区别一:超长处理不同
cin.get()当输入的字符串超过规定长度时,不会引起输入流错误,后面的 cin 操作会继
续执行,并且直接从缓冲区中取数据。但是 cin.getline()当输入超过规定长度时,会引起 cin
函数的错误,后面的 cin 操作将不再执行。
当输入的字符数大于 len 时,则 get 函数只读取 len-1 个字符,而其余的字符仍然保存在
缓冲区中,还可再对其进行读取;
但 是 函 数 getline 则 不 然 , getline() 会 设 置 失 效 位 (failbit , 通 过 调 用
is.setstate(ios_base::failbit) 实 现 ) , 并 且 关 闭 输 入 流 缓 冲 区 , 这 个 时 候 再 调 用 cin.get() 和
cin.getline()是读取不到输入流中剩余字符的。需要调用 cin.clear()函数重置失效位,重新打
开输入流。此时,get()和 getline()等函数才可继续读取输入流中的其他字符。

get()和 getline()区别二:对结束符的处理不同
在输入的字符串未超过规定长度时,两者都会在读取的字符串后面自动加上字符串结束标
志'\0',但对结束符的处理不同。
cin.get()读取一行时,遇到换行符(或自定义结束符)时结束读取,但是不对换行符(自定义
结束符)进行处理,换行符(自定义结束符)仍然保留在输入流中,并成为下一个待读取的字
符。
cin.getline()读取一行字符时,遇到换行符(自定义结束符)时终止,并且将换行符(自定义
结束符)直接从输入流缓冲区中删除掉,不会影响下面的输入处理。

通过 read()函数输入一个指定长度的字符序列
cin 的成员函数 read()也能用来输入包含空白字符的一个字符序列,但不是 C 风格的字符
串,提取结束后不在其后自动添加字符串结束标志,其函数原型形如:
istream& read(char* s, int len);
调用该函数时,将从输入流中提取指定长度的字符数目后,遇到输入流中的换行符才
会结束,即在输入时按回车键才会结束。即用户只有输入的字符数目达到指定的字符个数
后,再按下回车键,才能正确获得输入。
Note: s 不是 C 风格字符串,不保存字符串结束标志

cin 的成员函数 gcount()用于返回上一次输入操作从输入流缓冲区中提取的字符数目,该函


数返回一个整数值。
该函数仅统计通过 cin 的成员函数 get()、getline()和 read()等操作,而从输入流缓冲区
中提取出的字符数目。不统计使用输入运算符>>提取的字符数目。
成员函数 clear()用于设置失效位,重新打开输入流
成员函数 ignore()用于舍弃输入流缓冲区中字符,其主要用法有如下 3 种。
① cin.ignore();
舍弃输入流缓冲区中的第一个字符。与 cin.get()效果相同,也与 C 库中的函数 getchar()效
果相同。
② cin.ignore(int n);
用于舍弃输入流缓冲区中的前 n 个字符。
③ cin.ignore(int n, char delim);
用于输入流缓冲区中的前 n 个字符或遇到结束 delim 为止。
成员函数 sync()的作用就是清除输入缓冲区。成功时返回 0,失败时 badbit 会置位,函数返
回-1。

cout 用于输出数据的成员函数
put()函数
put()用于向输出流中插入一个字符,此函数的函数原型形如 "ostream& put(char c);"。该
函数将字符 c 插入到输出流中,返回值为输出流对象自身的引用。
write()函数
write()函数用于向输出流插入多个字符,此函数的函数原型形如 "ostream& write(const
char* s, int n);"。无论 s 所表示字符串的长度是多少,write 函数都向输出流中插入 n 个字符。

文件数据输入与输出
文件数据读取的过程
(1)在程序中包含头文件 fstream
#include <fstream>
(2)定义文件流变量
ifstream inData; //定义输入文件流变量
ofstream outData; //定义输出文件流变量
(3)将文件流变量与磁盘文件关联起来(这一步只是关联!)
inData.open(filename,mode);
outData.open(filename,mode);
(4)用文件流(<<或>>)读/写文件数据
inData>>x>>y;
outData<<x<<y;
(5)关闭文件
inData.close();
outData.close();

(2)(3)语句合并等价于
ofstream outfile(“student.dat”) //间接路径
ofstream outfile("C:\\Users\\86188\\Documents\\student.dat") //直接路径
直接路径不可直接访问 C:中的,如 ifstream infile(“C:\\student.dat”) 这是错误的
eg:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream outfile("student.dat");
char name[8], id[8];
int math, eng, computer;
for (int i = 0; i<3; i++) {
cout << "name: "; cin>>name;
cout << "stno : "; cin>>id;
cout << "math : "; cin>>math;
输入数据

cout << "eng : "; cin>>eng;


cout << "computer : "; cin>>computer;
把输入的数据导入之前关
outfile << name << " " << id << " " << math << " " << eng << " "
联的文件里
<< computer << endl;}
outfile.close();
return 0;}

//ch2-10.cpp
#include<iostream>
#include<iomanip>
#include<fstream>
int main() {
std::ifstream infile("student.dat");
char name[8], id[8];
int math, eng, computer, sum;
std::cout << std::setw(10) << "name" << std::setw(10) << "stno"
<< std::setw(10) << "math"<<std::setw(10)<<"eng“
<< std::setw(12) << "computer"<<std::setw(10)<<"sum"
<< std::endl << std::endl;
infile>>name;//从已关联的文件中按顺序,把第一个提取出来的放入 name
//此处把 name 单独提前拿出来先提取,是为了防止下面这个循环进入死循环
while (!infile.eof()){//eof 是文件结束符
infile>>id>>math>>eng>>computer;//从已关联的文件中按顺序提取内容并放入这些
变量
sum=math + eng + computer;
std::cout<<std::setw(10)<<name<<std::setw(10)
<<id<<std::setw(10)<<math
<<std::setw(10)<<eng <<std::setw(12)<<computer
<<std::setw(10)<<sum <<std::endl;
infile>>name;//从已关联的文件中按顺序提取内容并放入 name
}
infile.close();
}

You might also like