I/O操作
在针对I/O操作时,标准库提供一组操作符(manipulator),允许程序堆输出的内容进行格式化,比如:输出数字的十六进制、浮点值的精度等。类似以前的 endl 就是一个操作符,但它并不是一个普通的值,是用于输出一个换行符并且兼具刷新缓冲区的功能
1、基本输出
1.1 输出布尔数据
在c/c++中,在对bool类型的数据做输出的时候,打印的是 0 、1 ,如果希望看到的是 true 和 false ,那么可以使用 boolalpha 操作符
#include <iostream>
using namespace std;
int main() {
bool flag = false;
cout << "flag的值是:" << flag << endl; // 打印 0
//操作符只会影响后续的输出 打印 0 false
cout << "flag的值是:" << flag << " 添加操作符后:" << boolalpha << flag << endl;
return 0;
}
1.2 输出整形数字
在输出数字时,可以选择使用十进制 、八进制、十六进制 输出 ,它们只会影响整形数字, 默认会采用十进制输出数字
#include <iostream>
using namespace std;
int main() {
cout << "十进制:" << dec << 9 << endl; // 9
cout << "八进制:" << oct << 9 << endl; // 10
cout << "十六进制:" << hex << 10 << endl; // a
// 若想在输出前面表示打印的数值显示前缀进制标识,可以使用showbase关键字
cout << showbase;
// 默认即采用十进制输出
cout << "十进制:" << dec << 9 << endl; // 9
cout << "八进制:" << oct << 9 << endl; // 011 前面是数字0,不是字母O
cout << "十六进制:" << hex << 10 << endl; // 0xa
cout << noshowbase;
return 0;
}
1.3 输出浮点数
c++ 对浮点数的输出默认只会输出六位 ,那么在应对较多浮点数的时候,则常常会丢失精度,导致后面的小数位无法输出。标准库也提供了针对浮点数的输出格式cout.precision() | setprecision(),允许指定以多高的精度输出浮点数
#include<iostream>
using namespace std;
int main() {
double a = 10.12345678901234;
cout.precision(3); // 设置输出多少位数字 ,该函数有返回值,为设置的精度值。
cout << "a=" << a << endl; // 10.1
return 0;
}
小数点后面都是0,默认是不会被输出的,若想强制输出,可以使用showpoint关键字,配合precision 可以精确打印
#include<iostream>
using namespace std;
int main() {
float f = 10.12;
cout.precision(6);
cout << showpoint << "f=" << f << noshowpoint << endl; // 10.00
return 0;
}
2、基本输入
2.1 读取基本类型的输入
#include <iostream>
int main() {
int number;
std::cout << "Enter a number: ";
std::cin >> number;
std::cout << "You entered: " << number << std::endl;
return 0;
}
在这个示例中,我们使用 cin 从用户输入中读取一个整数,并将其存储在 number 变量中。然后,我们使用 cout 将该值输出到控制台。
2.2 多个输入
#include <iostream>
int main() {
int num1, num2;
std::cout << "Enter two numbers: ";
std::cin >> num1 >> num2;
std::cout << "Sum: " << (num1 + num2) << std::endl;
return 0;
}
在这个示例中,我们使用 cin 连续读取两个整数,并将它们存储在 num1 和 num2 变量中。然后,我们计算它们的和,并使用 cout 将结果输出到控制台。
需要注意的是,cin 默认以空格或换行符作为输入的分隔符。输入的数据类型必须与接收数据的变量类型匹配,否则可能导致不正确的结果或输入错误。
此外,还要考虑输入错误的处理,例如输入不合法的值或输入结束时的处理。可以使用 cin 的错误状态和流控制来进行错误处理。
3、文件操作
C++中处理文件操作的有三个主要对象 istream 、 ostream 、fstream 。 需要添加头文件 #include
文件操作常用类
到底是输入还是输出,是站在程序的角度看就ok.
ofstream 表示输出文件流,用于创建文件并向文件写入信息。
ifstream 表示输入文件流,用于从文件读取信息。
fstream 示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,也可以从文件读取信息。
文件操作模式
模式标志 描述
ios::app 追加模式。所有写入都追加到文件末尾。
ios::ate 文件打开后定位到文件末尾。
ios::in 打开文件用于读取。
ios::out 打开文件用于写入。
ios::trunc 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。
3.1 读取文件
文件仅仅是一些简单的字符串
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main() {
// 打开文件
fstream file("./main.cpp", ios::in);
// 文件是否能正常打开
if (file.is_open()) {
string line;
// getline 用于读取文件的整行内容,直到碰到文件末尾或者超过字符串可存储的最大值才会返回
while (getline(file, line)) {
cout << line << endl;
}
// 关闭文件
file.close();
} else {
cout << "文件无法正常打开! " << endl;
}
return 0;
}
3.2 写入文件
实际上和读取文差不多,如果能从文件中读取内容,那么往文件中写入内容也没有多大难处。
#include <iostream>
#include <fstream>
using namespace std;
int main() {
// 若问写入操作,文件不存在,会自动创建文件
// out: 每次写入都会覆盖源文件内容
// app(append追加) : 在末尾处追加内容
fstream file{"test.txt", ios::app};
if (file.is_open()) {
cout << "正常打开文件" << endl;
// 写入数据
file << "hi c++";
// 写入换行
file << "\n\n"; // 表示换2个行
// 完成,且关闭文件
file.close();
} else {
cout << "无法正常打开文件" << endl;
}
return 0;
}