『C++ Primer学习笔记』Chapter 1

时间:2022-11-17 22:45:38

概括

1.1. 编辑器、编译器和集成了编译器的IDE的区别;使用DOS命令行语句调用不同的编译器编译源文件和设置支持C++11的参数;

1.2. iostream库中的cincout的使用;

1.3. 单行注释与双行注释;

1.4. 控制流:while语句、for语句以及if语句;读入不定量的输入数据的方法(使用含有cin的表达式作为条件语句);

1.5-1.6. 类的简单介绍:定义类类型以及对应的操作;文件重定向;

在命令行使用GCC编译器编译文件

在使用命令行语句编译源文件之前,我们需要配置好GCC编译器(如何配置GCC编译器参考之前的文章1windows平台安装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文件所在的目录下,然后运行如下图中所示的命令:
『C++ Primer学习笔记』Chapter 1
如果运行正确,则会默认生成一个名为a.exe的可执行文件(因为我们并未命名它),接着我们直接运行生成的可执行文件:
『C++ Primer学习笔记』Chapter 1
则会出现如上图所示的结果。对于有些需要添加对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)无法结束的问题可以发现,这其中的原因可以总结为:

  1. Windows环境下的流结束标志Ctrl+Z的检查方式为阻塞式:只有按下回车之后才有可能检测在此之前是否有Ctrl+Z按下;如果Ctrl+Z之前有可读的数据,则按下回车之后不会检测在此之前是否有Ctrl+Z按下;

  2. 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中我们需要输入的数据。具体如下图所示:
『C++ Primer学习笔记』Chapter 1

参考文献


  1. windows平台安装GCC编译器;
  2. while(cin>>str)无法结束的问题;
  3. c++中cin.clear()的重要性 ;
  4. cin.clear()、cin.sync()和cin.ignor()的用法 ;