本章所有编程练习的工程源码可在此处下载(点击此链接下载),供大家参考交流!
1. 编写一个程序计算输入流中第一个$之前的字符数目,并将$留在输入流中。
本题要求我们计算字符数目。首先,本题应该是希望让用户自定义输入,所以我们通过换行符来识别输入结束;其次,在输入结束之后,我们需要输出计算出的字符数目,所以必须声明一个int类型的变量count来计数,计数方式就是在遇到$之前,每一个字符都需要count++;题目要求将$留在输入流中,所以我们最好是是使用cin,get()函数来获取字符,这样停止获取的最后一个字符会留在输入流中。
所以17.1.cpp代码如下所示:
#include "stdafx.h"
#include <iostream>
int main()
{
using namespace std;
cout << "Please enter your input: ";
char ch;
int count = 0;
cin.get(ch);
while (ch != '$' && ch != '\n')
{
count++;
cin.get(ch);
}
if (ch == '$')
cout << "\"$\" detected.\n";
else
cout << "Input over.\n";
cout << "There are " << count << " characters in the input stream.\n";
system("pause");
return 0;
}
运行结果如下图所示:
2. 编写一个程序,将键盘输入(直到模拟的文件尾)复制到通过命令行指定的文件中。
本题要求将用户输入复制到通过命令行指定的文件中存储。首先,我们需要指定命令行参数,来确定存储的文件,为此,我在程序目录下新建了一个文本文件,命名为test.txt;然后,打开项目属性,在调试的命令参数内填入test.txt作为命令参数,如下图所示:
接下来,我们在main()函数里首先声明一个输出流fout,使用fout打开命令参数指向的文件,再将从键盘输入的内容通过输出流复制到该文件中存储。
17.2.cpp代码如下所示:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
int main(int argc, char * argv[])
{
using namespace std;
ofstream fout;
for (int file = 1; file < argc; file++)
{
fout.open(argv[file]);
if (!fout.is_open())
{
cerr << "Can't open " << argv[file] << endl;
system("pause");
exit(EXIT_FAILURE);
}
cout << "Please enter your input (enter a blank line to quit): \n";
string input;
while (getline(cin, input) && input.size() > 0)
fout << input << endl;
cout << "Input over.\nBye.\n";
fout.close();
}
system("pause");
return 0;
}
程序运行结果如下图所示:
相应的,我们去检查一下test.txt,如下图所示:
3. 编写一个程序,将一个文件复制到另一个文件中。让程序通过命令行获取文件名。如果文件无法打开,程序将指出这一点。
本题要求通过命令行参数打开两个文件,然后把其中一个文件的内容复制到另一个文件中去。首先,我们依然需要在程序目录新建两个文本文件,然后在项目属性里面填入命令行参数,具体操作参见上题及附的链接;然后,在main()函数里面我们需要声明有一个输入流一个输出流,输入流用于打开被复制的文件,输出流用于打开复制内容进去存储的文件;题目要求指出文件无法打开的情况,我们仿照书中程序清单17.17来写即可;最后,我们只需要一边用fin获取输入流内容,一边用fout将该内容通过输出流写入到另一个文件中即可。
输入文本文件的内容如下图所示:
输出文本文件自然为空,命令行参数填入input.txt和output.txt。
17.3.cpp代码如下所示:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
int main(int argc, char * argv[])
{
using namespace std;
ifstream fin;
ofstream fout;
char ch;
fin.open(argv[1]);
fout.open(argv[2]);
if (!fin.is_open())
{
cerr << "Can't open " << argv[1] << endl;
fin.clear();
system("pause");
exit(EXIT_FAILURE);
}
if (!fout.is_open())
{
cerr << "Can't open " << argv[2] << endl;
fout.close();
system("pause");
exit(EXIT_FAILURE);
}
cout << "Open files successfully.\n";
cout << "Begin to copy and paste.\n";
while (fin.get(ch))
{
fout << ch;
}
fin.clear();
fin.close();
fout.close();
cout << "Copy and paste successfully.\nBye.\n";
system("pause");
return 0;
}
程序运行结果如下图所示:
再看输出文本文件如下图所示:
已完全成功复制。
4. 编写一个程序,它打开两个文本文件进行输入,打开一个文本文件进行输出。该程序将两个输入文件中对应的行并接起来,并用空格分隔,然后将结果写入到输出文件中。如果一个文件比另一个短,则将较长文件中余下的几行直接复制到输出文件中。后例省略。
本题要求打开两个文件,复制其中的内容,然后拼接起来输出到第三个文件中去,主要需要处理的是一个文件比另一个长的问题,遇到一个文件比另一个长,多余的行要直接复制,但是程序无法知道哪个文件会更长,所以处理起来比较复杂,这里我使用了一个笨办法,先使用两个输入流打开文件,使用getline()函数读一遍之后获取两个文件的行数,关闭文件之后又重新使用输入流再打开,进行数据的复制,此时因为第一遍读取的时候已经获取了行数,所以可以直接复制。
17.4.cpp代码如下所示:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
int main()
{
using namespace std;
ifstream fin1, fin2;
ofstream fout;
fin1.open("input1.txt");
fin2.open("input2.txt");
fout.open("output.txt");
i