输入 cin
cin代表缓冲区,先来看一个常用的例子
int main(){
char input[1024];
char c;
cout << "input:" << endl;
while (cin.peek() != '\n') {
cin >> input;
cout << input << endl;
}
}
“>>” 运算符读取数据时,遇到空格会自动停止,因此可以用于将一句话,如 hello world 按单词输出。
int main(){
char input[1024];
char c;
c = cin.get(); //不加任何参数,从缓冲区读取一个字符
cin.get(c); //读取一个字符给括号里的c
cin.get(input, 1024); //读取1024个字符到input,不会读取缓冲区里的换行
cin.get(input, 1024, 'a'); //读取字符到input,将a和a以后的抛弃
//注意区分下面两个getline,前一个是cin的成员函数,后一个不是
//读取1024个字符到input,如果不满足长度,到换行符为止(会将最后的换行符读取,然后抛弃)
cin.getline(input, 1024);
//从cin中读取一行数据到input
getline(cin,input);
cin.ignore(); //读取一个字符,然后丢掉,也就是忽略一个字符
cin.ignore(2); //读取两个,丢掉
cin.ignore(100,'\n'); //忽略100个字符,或者知道遇到换行为止
cin.peek(); //读取一个字符,然后放回去,也就是查看一个字符
cin.putback(c); //放回一个字符
}
标志位和清空
网上很多教程都说 cin.sync 是清空缓存的意思,这里其实是有问题的,xcode的c++编译器不能清空缓存,但是g++是可以的,这里我们使用 cin.ignore(1024,’\n’) 来替代,1024带表一个很大的数。
cin.fail() 返回的是标志位是否有效
cin.clear() 重置标志位
int main(){
int num = 0;
cout << "input" << endl;
while (true) {
cin >> num;
cout << "标志位:" << cin.fail() << endl;
cin.clear(); //重置标志位
// cin.sync(); //清空缓冲区
cin.ignore(1024,'\n');
cout << "标志位:" << cin.fail() << endl;
}
}
如果觉得1024的忽略还不够大,可以用下面的方式设置,如果是文件读取就用 EOF,控制台输入就用 '\n’
int main(){
int num = 0;
cout << "input" << endl;
while (true) {
cin >> num;
cout << "标志位:" << cin.fail() << endl;
cin.clear(); //重置标志位
// cin.sync(); //清空缓冲区
while (cin.peek() != '\n') {
cin.ignore();
}
cout << "标志位:" << cin.fail() << endl;
}
}
输出 cout由于用的少,略略略
文件操作
输出到文件
ofstream ofs("./test.txt",ios::out | ios::trunc); //out代表输出到文件,trunc不写也是默认,如果没有文件会创建,有文件会把里面内容删除,然后在输出。
if (ofs.is_open()) {
ofs << "第一行数据" << endl;
ofs << "第二行数据" << endl;
ofs << "第三行数据" << endl;
}else{
cout << "文件打开错误" << endl;
}
ofs.close();
也可以
ofstream ofs;
ofs.open("./test.txt",ios::out | ios::trunc);
从文件输入
ifstream ifs;
ifs.open("./test.txt",ios::in);
if (ifs.is_open()) {
char output[1024];
char c;
while (ifs >> output) { //按行输出
cout << output << endl;
}
}else{
cout << "文件打开失败" << endl;
}
ifs.close();
while ( (c = ifs.get()) != EOF) { //逐个字符输出
cout << c;
}