输入和输出
输入和输出流的行为可以用cout和cin函数的 "插入运算符 "来修改。为它们的width()函数指定整数参数,可以设置流的字符宽度。如果内容没有填满整个流的宽度,可以指定一个填充字符作为其fill()函数的参数,以表示空的部分。同样,浮点数的默认精度为小数点后六位,可以通过为其 precision() 函数指定一个整数来改变。使用插入操作符来修改流的语句应该在使用<<或>>操作符的语句之前进行。
插入操作符只修改流对象--随后的流对象使用默认值。
manipulate.cpp
#include <iostream>
using namespace std ;
int main()
{
bool isTrue = 1 ;
int num = 255 ;
// Insertion operators...
cout.width(40) ;
cout.fill( '.' ) ;
cout << "Output" << endl ;
// Uncomment the next line to confirm subsequent stream uses defaults.
cout << "Output" << endl << endl ;
// Precision, uncomment the next line for the default format.
cout << "Pi: " << 3.1415926536 << endl ;
cout.precision(11) ;
cout << "Pi: " << 3.1415926536 << endl ;
// Manipulators.
cout << isTrue << ": " << boolalpha << isTrue << endl ;
cout << num << ": " << hex << showbase << uppercase << num << endl ;
return 0 ;
}
异常处理
常见的三种类型的错误:
- 语法错误
- 逻辑错误--代码在语法上是正确的,但试图执行非法操作。比如除以0。
- 异常错误 - 程序按预期运行,直到遇到特殊情况,使程序崩溃。例如,程序可能要求输入一个数字,而用户是字母而不是数字。
更多参考:https://www.geeksforgeeks.org/errors-in-cc/
编译器能发现"编译时 "错误,但例外错误的可能性更难定位,因为它们只发生在 "运行时"。这意味着程序员必须尝试预测可能出现的问题,并准备处理这些特殊错误。
当异常错误发生时,try会将异常 "抛出 "到紧随尝试块之后的 "捕捉 "块。这就使用了catch关键字,并将处理异常错误的语句包围在一对大括号内。
try.cpp
#include <iostream>
using namespace std ;
int main()
{
int number;
try
{
for( number = 1 ; number < 21 ; number++ )
{
if (number > 4 ) throw( number ) ;
else
cout << "Number: " << number << endl ;
}
}
catch( int num )
{
cout << "Exception at: " << num << endl ;
}
return 0 ;
}
识别异常
异常引用被传递到catch块中,就可以通过异常的what()函数检索到错误描述。
what.cpp
#include <string>
#include <iostream>
using namespace std ;
int main()
{
string str = "C++" ;
try
{
str.erase( 4 , 6) ;
}
catch( exception &error )
{
cerr << "Exception: " << error.what() << endl ;
}
return 0 ;
}
cout函数将数据发送到标准输出,而cerr函数将错误数据发送到标准错误输出。这只是两个不同的数据流。添加#include <stdexcept>预处理器指令,异常类可以被用来识别抛向捕获块的异常类型。
处理错误
except.cpp
i#include <stdexcept>
#include <fstream>
#include <string>
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
string lang = "C++" ;
int num = 1000000000; // One billion.
try
{
lang.replace( 100, 1, "C" ) ; // 1. out_of_range exception
//lang.resize( 3 * num ); // 2. length error
//ifstream reader( "nonsuch.txt" ) ;
//if( ! reader ) throw logic_error("File not found" ); // 3. logic_error
}
catch( out_of_range &e )
{
cerr << "Range Exception: " << e.what() << endl ;
cerr << "Exception Type: " << typeid( e ).name() ;
cout << endl << "Program terminated." << endl ;
return -1 ;
}
catch( exception &e )
{
cerr << "Exception: " << e.what() << endl ;
cerr << "Exception Type: " << typeid( e ).name() << endl ;
}
cout << "Program continues..." << endl ;
return 0 ;
}
网友评论