C++ Primer Plus(第六版)编程练习答案 第17章 输入、输出和文件

本章介绍了C++中处理输入输出和文件的编程练习,包括计算输入流中'$'前的字符数,复制键盘输入到指定文件,文件之间的复制,合并两个文件内容,读取和合并朋友名单,以及处理employee对象的文件I/O。每个练习都提供了详细的代码实现和运行结果展示。
摘要由CSDN通过智能技术生成

本章所有编程练习的工程源码可在此处下载(点击此链接下载),供大家参考交流!

 

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值