前言

这一章将要讲读取循环,主要是用户交互等,还有就是C++中简单的文件输入输出。基于课本《C++ Primer Plus 6th》第五章Loops and Relational Expressions(循环和关系表达式)和第六章Branching Statements and Logical Operators(分支语句和逻辑运算符)中C++与C不同的部分,相同的部分就跳过了。


这两章的相关内容在C语言都讲得非常详尽了,C++中的循环大部分内容都与C的一致,下面就来介绍些不一样的。

Initi part of For

C++ allows declaration in the initi part of for.

它的意思就是C++允许在for循环里定义变量,其作用域仅为当前for循环。我们来看一个例子:

int i;
for(i=1;i<=10;i++)//C语言形式
{...}
for(int j=1;j<=10;j++)//C++形式,j仅存在于{}中
{...}

Size of String

我们知道,C++中定义了一个string类在<string>里,string类的使用比char []的字符串表示更加方便,在求size的时候,也有自己独特的用法,例如:

#include<string>
string s;
s.size();//C++ string求长度
strlen(s);//等同于这一句

同时,string类还可以进行++ --运算。


clock()

这个函数是在C库<time.h>里的,于是在C++里<ctime>也同样适用。clock_t clock(void) 返回程序执行起(一般为程序的开头),处理器时钟所使用的时间。为了获取 CPU 所使用的秒数,需要除以CLOCKS_PER_SEC。

clock()函数的返回值返回自程序启动起,处理器时钟所使用的时间。如果失败,则返回 -1 值。

一般我们可以用clock()函数来进行程序延时反应,例如:

#include 
// ...
clock_t start = clock( );
clock_t  delay = 500 * CLOCKS_PER_SEC; 
while (clock() - start < delay)
{...;}

交互式字符输入

我们在写一些交互式程序的时候需要判断用户的输入是否正确,不正确需要用户重新输入。我们一般有这些方法来检测:

cin.get(ch); 
     while (cin.fail( ) == false) // (1) 
    { ... }
while (!cin.fail( ))   // (2)
while (cin)  // (3)
while (cin.get(ch))  // (4)  
  • 在第三种方法里,如果输入的最后一个字符正确,则返回true,否则返回false。
  • 第四种比前面的方法更加紧凑清晰,返回的是一个cin,然后自动转换为bool型。

保持窗口打开

我们的程序在某些系统中会一闪而过,什么都没看见就关闭了,我们可以用下面的方法保持它们打开:

cin.get();//(1)C++方法
system("pause");//(2)冻结屏幕

文件输入输出

我们知道在C语言中,我们可以使用fopen,fclose来操作文件,而在C++中,这些同样适用。

#include <stdlib.h>//C语言用法
FILE  *f; ;
f = fopen("fish.txt', "w");
fputs("Hello\n", f);
fclose(f);  

当然C++还有它特有的方法:

#include <fstream>//C++用法
//...
ofstream fout;
fout.open("fish.txt"); 
fout << "Hello" << endl;
fout.close();

我们需要添加头文件<fstream>,虽然头文件<iostream>提供了一个预先定义好的cout和ostream对象, 但必须声明自己的ofstream对象,为其命名,并将其与文件关联起来。例如:ofstream fout;

我们可以通过对象.open()关联要写入的文件,例如:fout.open("fish.txt");

如果我们要同时读入一个文件,写入一个文件,我们再用一个对象,例如:ofstream fin;

然后读入我们都可以用fin<<,同理输出我们都可用fout>>

打开完了后,我们也许需要判断文件是否打开成功。我们可以用成员函数.is_open().good()来判断。

打开失败的话也许我们需要结束程序,我们可以用<cstdlib>库里的exit()函数,它一般的参数值是EXIT_FAILURE。即我们可以写:exit(EXIT_FAILURE);来终止程序。

当然除了这一种方法外,我们还可以用更为广泛使用的freopen,它是C库<cstdio>里的函数,它的声明是:FILE * freopen ( const char * filename, const char * mode, FILE * stream );

它把一个新的文件名 filename 与给定的打开的流 stream 关联,同时关闭流中的旧文件。

它的参数有:

  • filename -- 这是 C 字符串,包含了要打开的文件名称。
  • mode -- 这是 C 字符串,包含了文件访问模式,模式如下:
    模式 描述
    "r" 打开一个用于读取的文件。该文件必须存在。
    "w" 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
    "a" 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
    "r+" 打开一个用于更新的文件,可读取也可写入。该文件必须存在。
    "w+" 创建一个用于读写的空文件。
    "a+" 打开一个用于读取和追加的文件。
  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被重新打开的流。

如果文件成功打开,则函数返回一个指针,指向用于标识流的对象。否则,返回空指针。

例如:

#include<cstdio>
int main()
{
    freopen("01.in","r",stdin);//读入
    freopen("01.out","w",stdout);//写入
    return 0;
}

后记

这两章都比较简单,新东西也挺少,主要就是那个交互式和文件输入输出有点区别。

这里的一切都有始有终,却能容纳所有的不期而遇和久别重逢。
最后更新于 2024-01-14