概括
1.1. 编辑器、编译器和集成了编译器的IDE的区别;使用DOS命令行语句调用不同的编译器编译源文件和设置支持C++11的参数;
1.2. iostream库中的cin和cout的使用;
1.3. 单行注释与双行注释;
1.4. 控制流:while语句、for语句以及if语句;读入不定量的输入数据的方法(使用含有cin的表达式作为条件语句);
1.5-1.6. 类的简单介绍:定义类类型以及对应的操作;文件重定向;
在命令行使用GCC编译器编译文件
在使用命令行语句编译源文件之前,我们需要配置好GCC编译器(如何配置GCC编译器参考之前的文章1:windows平台安装GCC编译器),在未说明的情况下,以后所有的代码均基于VS2010的编辑器和4.8.1版本的GCC编译器在DOS下使用命令行进行编译。
我们尝试编写一个hello world的代码:
#include<iostream>
int main()
{
std::cout<<"hello world!"<<std::endl;
return 0;
}
并保存为test.cpp后缀的文件,然后打开DOS并设置到该cpp文件所在的目录下,然后运行如下图中所示的命令:
如果运行正确,则会默认生成一个名为a.exe的可执行文件(因为我们并未命名它),接着我们直接运行生成的可执行文件:
则会出现如上图所示的结果。对于有些需要添加对C++11支持才能编译的源文件,则只需要输入如下代码:
g++ test.cpp -std=c++11
读入不定量数据的结束问题
使用cin读取不定量数据常常会出现一个问题:使用Ctrl+Z并不能够使程序结束。一个简单的例子:
#include<iostream>
int main()
{
char val;
while(std::cin>>val)
std::cout<<val<<std::endl;
return 0;
}
参考文章2while(cin>>str)无法结束的问题可以发现,这其中的原因可以总结为:
Windows环境下的流结束标志Ctrl+Z的检查方式为阻塞式:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下;如果Ctrl+Z之前有可读的数据,则按下回车之后不会检测在此之前是否有Ctrl+Z按下;
Ctrl+Z产生的不是一个普通的ASCII码值,也就是说它产生的不是一个字符,所以不会跟其它从键盘上输入的字符一样能够存放在输入缓冲区;
因此,比较合理的使用Ctrl+Z的方法就是:输入数据、回车并按下Ctrl+Z;而不是输入数据、按下Ctrl+Z并回车。
在实际使用中,如果上述代码中val
的类型为int
,则第二种方法也可行,具体原因有待研究。
cin的常见问题
连续使用cin时经常会出现问题,比如文献3c++中cin.clear()的重要性 和文献4cin.clear()、cin.sync()和cin.ignor()的用法 中所述的情况。在此,参考这两篇文献,我们做以简要的总结:
cin.clear()
作用:改变cin的状态标识符使其能够正常输入,如果没有改变其状态只清除缓冲区的数据流也无法正常输入,因此常至于其他两个语句前边一起使用;
cin.ignor(a,ch)
作用:从输入流cin中提取字符,提取的字符被忽略(ignore)不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则函数执行终止;否则,它继续等待。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。
cin.sync()
作用:清除输入缓冲区的数据流。由于程序运行时并不总是知道外部输入的进度,很难控制是不是全部清除输入缓冲区的内容。通常我们有可能只是希望放弃输入缓冲区中的一部分,而不是全部。比如清除掉当前行、或者清除掉行尾的换行符等等。但要是缓冲区中已经有了下一行的内容,这部分可能是我们想保留的。这个时候最好不要用cin.sync()
,可以使用cin.ignor()
代替,因此cin.ignor()
相比cin.sync()
可以更精确地控制缓冲区。
使用文件重定向
使用文件重定向可以避免反复输入,而且大多数操作系统支持文件重定向,在此我们仍然以:
#include<iostream>
int main()
{
char val;
while(std::cin>>val)
std::cout<<val<<std::endl;
return 0;
}
这个例子为例介绍如果在Windows环境下的DOS里使用文件重定向。我们将上述代码保存为test.cpp,然后进行编译,同时在当前目录下生成一个in.txt文件,输入我们需要输入的数据并保存,然后输入命令:
a<in.txt>out.txt
则会发现在当前目录下生成了一个out.txt文件,该文件内容即为我们in.txt中我们需要输入的数据。具体如下图所示: